可见性 原子性
有序性
import org.junit.jupiter.api.Test;
public class T {
//flag初始值
static boolean flag = false;
@Test
public void business() {
new Thread(() -> {
//①资源准备
prepare();
//②资源准备好,更改flag标志
flag = true;
}, "线程1").start();
new Thread(() -> {
//main线程
while (!flag) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//基于准备好的资源 执行操作
execute();
}, "线程2").start();
}
public static void prepare() {
}
public static void execute() {
}
}
class HelloWorld {
int data = 0;
public void increment() {
data++;
}
}
线程1执行顺序:②->①,
1、线程1执行②,flag=true。
2、线程2直接略过资源准备,直接执行操作execute()
3、程序bug
可见性
public class T {
private int data = 0;
public void business() {
new Thread(() -> {
data++;
}, "线程1").start();
new Thread(() -> {
while (data == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "线程2").start();
}
}
1、线程2一开始获得data=0
2、线程1 data++ = 1
3、线程2 不会立刻获得data=1,一直while死循环