多线程处理共享数据时候,会把共享数据从主内存复制到当前线程运行环境本地内存。
对于这份数据,多线程之间是隔离的。自己处理自己的互相不会干涉。
public class Test {
//定义
private static final ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public static volatile int age = 10;
public static void main(String[] args) {
//第一个测试线程
new Thread(()->{
threadLocal.set(age);
Integer integer = threadLocal.get();
while (integer > 0){
synchronized (""){
int i = integer--;
System.out.println(i +":" + Thread.currentThread().getName());
}
}
}).start();
//第2个测试线程
new Thread(()->{
threadLocal.set(age);
Integer integer = threadLocal.get();
while (integer > 0){
synchronized (""){
int i = integer--;
System.out.println(i +":" + Thread.currentThread().getName());
}
}
}).start();
}
}
输出结果
10:Thread-0
9:Thread-0
8:Thread-0
7:Thread-0
6:Thread-0
5:Thread-0
4:Thread-0
3:Thread-0
2:Thread-0
1:Thread-0
10:Thread-1
9:Thread-1
8:Thread-1
7:Thread-1
6:Thread-1
5:Thread-1
4:Thread-1
3:Thread-1
2:Thread-1
1:Thread-1
每个线程都执行 integer-- 这个运算操作,java中运算操作是非线程安全的(但是变量赋值操作是线程安全的)。因此加一个snyc修饰保证方法同步执行。
通俗理解:
类常量age = 10分别给了两个互相隔离的线程就变成两个线程间互不干涉的副本
线程 t1的age = 10;
线程 t2的age = 10;
在jvm中sny修饰的代码块或者是lock实现同步,当同步的代码块执行完毕之后才会把本地内存中的变量刷新到主内存中。volatile关键字则是保证多线程之间共享变量的可见性。也就是当前执行操作执行共享变量修改之后会立刻同步到主内存。使用场景多用于一线程写入,其他线程读取。
转载于:Java中的ThreadLocal详解 - 简书 (ThreadLocal)
Java volatile关键字最全总结:原理剖析与实例讲解(简单易懂)_volatile关键字原理_老鼠只爱大米的博客-CSDN博客 (volatile)