当前位置:网站首页>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);
}
结尾
日常求赞
边栏推荐
猜你喜欢
【SQL刷题】Day3----SQL必会的常用函数专项练习
优化是一种习惯●出发点是'站在靠近临界'的地方
数字化转型:如何引导创新领导者
Future与CompletableFuture
npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead.
接口测试的概念、目的、流程、测试方法有哪些?
LeetCode-498 - Diagonal Traversal
LeetCode-36-Binary search tree and doubly linked list
Detailed explanation and use of each module of ansible
ACM模板笔记:最长不下降/上升子序列
随机推荐
F. Binary String Reconstruction
Using SylixOS virtual serial port, serial port free implementation system
如何保护 LDAP 目录服务中的用户安全?
C. Even Picture
Redis Command Manual
【PCBA solution】Electronic grip strength tester solution she'ji
化学制品制造业数智化供应链管理系统:建立端到端供应链采购一体化平台
paddle 35 paddledetection保存训练过程中的log信息
ES6中的for...in/of的使用
突破次元壁垒,让身边的玩偶手办在屏幕上动起来!
In 2021 China industrial Internet security competition (competition) in fujian province and the first industry of fujian province Internet innovation competition
Exploration and practice of the "zero trust" protection and data security governance system of the ransomware virus of Meichuang Technology
《mysql 从入门到内卷再到入土》——Mysql基础 学习笔记目录
第四届红帽杯网络安全大赛
MATLAB神经网络拟合工具箱Neural Net Fitting使用方法
Mark!画出漂亮的神经网络图!神经网络可视化工具集锦搜集
Before implementing MES management system, these three questions to consider
npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead.
The evolution history of Go programmers
Huawei router clock near the drainage experiment (using stream strategy)