package com.example.sync;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @program: demo
* @description: volatile:
* 保证可见性
* 不保证原子性
* 防止指令重排
* @author: ZCY
**/
public class VolatileDemo {
//可见性测试
private static volatile int num=0;
public static void main(String[] args) {
new Thread(()->{
while (num==0){
}
}).start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
num=1;
}
}
class VolatileDemo2{
//不保证原子性
private static int num=0;
public static void add(){
num++;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
for (int i1 = 0; i1 < 1000; i1++) {
add();
}
}).start();
}
while (Thread.activeCount()>2){
Thread.yield();
}
System.out.println(num);
}
}
class VolatileDemo3{
//保证原子性的方法
private static AtomicInteger num=new AtomicInteger();
public static void add(){
num.getAndIncrement();//原子操作 CAS 比锁高效
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
for (int i1 = 0; i1 < 1000; i1++) {
add();
}
}).start();
}
while (Thread.activeCount()>2){
Thread.yield();
}
System.out.println(num);
}
}
class VolatileDemo4{
//防止指令重排 volatile读 会在指令上下添加内存屏障,防止指令重排
}
Volatile关键字
最新推荐文章于 2024-07-28 19:41:52 发布