import com.ma.juc.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
@Slf4j
@NotThreadSafe
public class CountExample4 {
//请求总数
public static int clientTotal = 5000;
//同时并发执行的线程数
public static int threadTotal = 200;
//volatile
//不保证内存的子性,也不能保证线程安全
//使用的场景 : volatile boolean xxxx;
public static volatile int count = 0;
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for(int i = 0;i < clientTotal ; i++)
executorService.execute(() -> {
try {
semaphore.acquire();
add();
semaphore.release();
} catch (Exception e) {
log.error("exception",e);
}
countDownLatch.countDown();
});
countDownLatch.await();
executorService.shutdown();
log.info("count:{}",count);
}
public static void add(){
count++;
// 实际执行的过程
//1、从主存读count
//2、+1
//3、把count写回主存
}
}
Demo Volatile不保证原子性
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 多线程并发编程如何正确的执行程序: - 原子性:执行过程要么成功要么失败,比如经典的银行转账问题。 - 可见性:多...
- 原文:https://www.cnblogs.com/Mainz/p/3556430.html 在上篇《非阻塞同步...