【Java】Java多线程之可见性之volatile
可见性
导致共享变量在线程间不可见的原因
- 线程交叉执行
- 指令重排序加上线程交叉执行
- 共享变量更新后的值没有在工作内存与主存间及时更新
- 保证可见性和原子性
volatile
并不是说使用了volatile
就线程安全了
package com.keytech.task;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class VolatileTest {
private static Integer clientTotal=5000;
private static Integer threadTotal=200;
private static volatile Integer count=0;
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
Semaphore semaphore=new Semaphore(threadTotal);
for (int i = 0; i < clientTotal; i++) {
executorService.execute(()->{
try{
semaphore.acquire();
update();
semaphore.release();
}catch (Exception e){
e.printStackTrace();
}
});
}
executorService.shutdown();
System.out.println("count:"+count);
}
private static void update(){
count++;
}
}
//count:4988
private static void update() {count++; //分3步
//1.取出当前count值
//2.count + 1
//3.count 重新写回主存
}
总结
volatile
进行多线程加是线程不安全的,不适合计数volatile
不具备原子性
volatile
的使用场景
- 对变量的写操作不依赖当前值
- 该变量没有包含在其它变量的不变式子中
- volatile适合作为状态的标记量
volatile boolean flag = false;//线程1
context = loadContext();
flag = true;
//线程2
while(!flag){
sleep();
}
todo(context);
以上是 【Java】Java多线程之可见性之volatile 的全部内容, 来源链接: utcz.com/a/92411.html