【Java】Java多线程之可见性之volatile

可见性

导致共享变量在线程间不可见的原因

  • 线程交叉执行
  • 指令重排序加上线程交叉执行
  • 共享变量更新后的值没有在工作内存与主存间及时更新
  • 保证可见性和原子性

volatile

【Java】Java多线程之可见性之volatile

【Java】Java多线程之可见性之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

以上是 【Java】Java多线程之可见性之volatile 的全部内容, 来源链接: utcz.com/a/92411.html

回到顶部