当前位置:网站首页>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双向绑定的实现和演示

着力提升制造业核心竞争力,仪器仪表产业迎高质量发展

带你一文读懂SaaS版多租户商城系统对多品牌企业的应用价值

内置模板市场,DataEase开源数据可视化分析平台v1.13.0发布

c语言之 练习题1 大贤者福尔:魔法数,神奇的等式

Play RT-THREAD of doxygen

The use of TortoiseSVN little turtle

TCL:事务的特点,语法,测试例——《mysql 从入门到内卷再到入土》

【Windows】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问,这些策略可帮助保护你的电脑
随机推荐
测试代码新的规则
ArcMap时间滑块功能动态显示图层数据并生成视频或动图
论配置化系统的配置
C. Social Distance
将视图模型转换为使用 Hilt 依赖注入
【nvm】【node多版本管理工具】使用说明和踩坑(exit status 1)
HGAME 2022 Week2 writeup by pankas
微擎盲盒交友变现-vp_ph打开慢优化
2022.8.8好题选讲(数论场)
B. Trouble Sort
PROCEDURE :存储过程结构——《mysql 从入门到内卷再到入土》
JVM经典五十问,这下面试稳了
第14届全国大学生信息安全竞赛-创新实践能力赛
突破次元壁垒,让身边的玩偶手办在屏幕上动起来!
使用SylixOS虚拟串口,实现系统串口自由
Introduction to PostgreSQL
Common functions of Auto.js to find pictures and colors
Live Classroom System 08 Supplement - Tencent Cloud Object Storage and Course Classification Management
【PCBA方案设计】蓝牙跳绳方案
labelme-屏蔽拖拽的事件