马士兵高并发编程系列记录
https://www.bilibili.com/video/av11076511/?spm_id_from=333.788.videocard.4
ThreadLocal1
ThreadLocal线程局部变量
import java.util.concurrent.TimeUnit;
public class ThreadLocal1 {
volatile static Person p = new Person();
//加不加volatile打印出来都是lisi
public static void main(String[] args) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(p.name);
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
p.name = "lisi";
}).start();
}
}
class Person {
String name = "zhangsan";
}
ThreadLocal2
ThreadLocal线程局部变量
ThreadLocal是使用空间换时间,synchronized是使用时间换空间
ThreadLocal效率更高,可能会导致内存泄漏(原因,自己查)
比如在hibernate中session就存在与ThreadLocal中,避免synchronized的使用
ThreadLocal 每个线程中都有自己的变量,不会因为其中一个线程改变这个变量另一个也改变
可以理解为每个线程都拷贝了一份这个变量,每个线程改变的是自己的这这份,不会影响其他线程的那一份
import java.util.concurrent.TimeUnit;
public class ThreadLocal2 {
//volatile static Person p = new Person();
static ThreadLocal<Person> tl = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.get());//null
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new Person());
System.out.println("000-"+tl.get());//000-T22.ThreadLocal2$Person@2fff0d30
}).start();
}
static class Person {
String name = "zhangsan";
}
}