当前位置:网站首页>ThreadLocal全面解析(一)
ThreadLocal全面解析(一)
2022-08-10 21:11:00 【InfoQ】
前言
絮叨
ThreadLocal基础之Java的引用
- 引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加1,当引用失效时,计数器就减1,当计数器为0时,则认为该对象可以被回收(目前在Java中已经弃用这种方式了)。
- 可达性分析算法:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。
- JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。
四种引用类型
强引用
Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收
obj = null; //手动置null
软引用
SoftReference<String> softReference = new SoftReference<String>(new String("小六六"));
System.out.println(softReference.get());
弱引用
WeakReference<String> weakReference = new WeakReference<String>(new String("小六六"));
System.gc();
if(weakReference.get() == null) {
System.out.println("weakReference已经被GC回收");
}
weakReference已经被GC回收
虚引用(PhantomReference)
PhantomReference<String> phantomReference = new PhantomReference<String>(new String("小六六"), new ReferenceQueue<String>());
System.out.println(phantomReference.get());
- 强引用 一直存活,除非GC Roots不可达 所有程序的场景,基本对象,自定义对象等。
- 软引用 内存不足时会被回收 - 一般用在对内存非常敏感的资源上,用作缓存的场景比较多,例如:网页缓存、图片缓存
- 弱引用 只能存活到下一次GC前 生命周期很短的对象,例如ThreadLocal中的Key。
- 虚引用 随时会被回收, 创建了可能很快就会被回收 业界暂无使用场景, - 可能被JVM团队内部用来跟踪JVM的垃圾回收活动
ThreadLocal基础之Java中的值传递和地址传递
public class Test {
public static void main(String[] args) {
String str = "123";
System.out.println(str);
change(str);
System.out.println(str);
}
public static void change(String str){
str = "小六六";
}
}
123
小六六
123
123
- 值传递,传递值,在函数中形参发生的变化不影响实参。
- 引用传递,传递对象引用,在函数中形参发生的变化影响实参。
String a = new String("小六六");
String b;
b= new String("小六六");
- b:对象的引用
- “小六六”:实际对象
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public static void PersonCrossTest(Person person){
System.out.println("传入的person的name:"+person.getName());
person.setName("我是张小龙");
System.out.println("方法内重新赋值后的name:"+person.getName());
}
//测试
public static void main(String[] args) {
Person p=new Person();
p.setName("我是马化腾");
p.setAge(45);
PersonCrossTest(p);
System.out.println("方法执行后的name:"+p.getName());
}
1传入的person的name:我是马化腾
2方法内重新赋值后的name:我是张小龙
3方法执行后的name:我是张小龙
public static void PersonCrossTest(Person person){
System.out.println("传入的person的name:"+person.getName());
person=new Person();//加多此行代码
person.setName("我是张小龙");
System.out.println("方法内重新赋值后的name:"+person.getName());
}
传入的person的name:我是马化腾
方法内重新赋值后的name:我是张小龙
方法执行后的name:我是马化腾
Person p=new Person();
p.setName("我是马化腾");
p.setAge(45);
PersonCrossTest(p);
person=new Person();
- 在Java中所有的参数传递,不管基本类型还是引用类型,都是值传递,或者说是副本传递。只是在传递过程中:
- 如果是对基本数据类型的数据进行操作,由于原始内容和副本都是存储实际值,并且是在不同的栈区,因此形参的操作,不影响原始内容。
- 如果是对引用类型的数据进行操作,分两种情况,一种是形参和实参保持指向同一个对象地址,则形参的操作,会影响实参指向的对象的内容。一种是形参被改动指向新的对象地址(如重新赋值引用),则形参的操作,不会影响实参指向的对象的内容。
ThreadLocal基础之this关键字
this关键字的作用
String name;//定义当前Person名字
//参数name是目标名字
//成员变量name是自己名字
public void sayHello(String name) {
System.out.println(name+",你好。我是"+name);
}
public static void main(String[] args) {
Person person = new Person();
//设置当前person名字
person.name = "王健林";
//调用sayHello方法
person.sayHello("王思聪");
}
this关键字的原理
String name;//定义当前Person名字
//参数name是目标名字
//成员变量name是自己名字
public void sayHello(String name) {
System.out.println(this);
}
public static void main(String[] args) {
Person person = new Person();
//设置当前person名字
person.name = "王健林";
//调用sayHello方法
person.sayHello("王思聪");
System.out.println(person);
}
结尾

日常求赞
边栏推荐
- 【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示
- Live Classroom System 09--Tencent Cloud VOD Management Module (1)
- JVM经典五十问,这下面试稳了
- F. Binary String Reconstruction
- 用示波器揭示以太网传输机制
- 2021 GKCTF X DASCTF应急挑战杯
- 这些不可不知的JVM知识,我都用思维导图整理好了
- 直播课堂系统09--腾讯云点播管理模块(一)
- Likou 221 questions, the largest square
- Exploration and practice of the "zero trust" protection and data security governance system of the ransomware virus of Meichuang Technology
猜你喜欢
化学制品制造业数智化供应链管理系统:建立端到端供应链采购一体化平台
【PCBA方案设计】蓝牙跳绳方案
Using SylixOS virtual serial port, serial port free implementation system
FPGA - 7系列 FPGA内部结构之Memory Resources -03- 内置纠错功能
LeetCode-402 - Remove K digits
LeetCode-498 - Diagonal Traversal
石油化工行业商业供应链管理系统:标准化供应商管理,优化企业供应链采购流程
【PCBA方案】电子握力测试仪方案she‘ji
ACM解题笔记——HDU 1401 Solitaire(DBFS)
【Windows】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问,这些策略可帮助保护你的电脑
随机推荐
Detailed explanation of the use of Oracle's windowing function (2)
用示波器揭示以太网传输机制
ACM解题笔记——HDU 1401 Solitaire(DBFS)
Exploration and practice of the "zero trust" protection and data security governance system of the ransomware virus of Meichuang Technology
突破次元壁垒,让身边的玩偶手办在屏幕上动起来!
LeetCode-36-Binary search tree and doubly linked list
管理员必须知道的RADIUS认证服务器的部署成本
Live Classroom System 09--Tencent Cloud VOD Management Module (1)
黑猫带你学Makefile第13篇:Makefile编译问题合集
[Golang]如何优雅管理系统中的几十个UDF(API)
带你一文读懂SaaS版多租户商城系统对多品牌企业的应用价值
ArcPy读取Excel时序数据、批量反距离加权IDW插值与掩膜
论配置化系统的配置
ACM模板笔记:八数码问题——使用BFS+康托展开打表解决
paddle 35 paddledetection保存训练过程中的log信息
LeetCode-498-对角线遍历
社区分享|货拉拉通过JumpServer纳管大规模云上资产
UPDATE:修改数据语法使用例——《mysql 从入门到内卷再到入土》
F. Binary String Reconstruction
B. Same Parity Summands