搜了一圈优快云都没有一个好的回答,只能自己造轮子了。
使用原子类保证多线程环境下内存可见性,原子性,禁止指令重排序
使用自旋锁方式防止提前notify();
package com.juc;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Author: Xhy
* CreateTime: 2021-05-20 20:51
*
* @Description: 四个线程,俩个线程++,俩个线程--;
*/
public class FourThreadDemo{
public static AtomicInteger i = new AtomicInteger();
public static Object o = new Object();
public static void main(String[] args) throws InterruptedException {
while (true) {
// 加法
if (i.get() == 0) {
synchronized (o) {
new Thread(() -> {
i.getAndIncrement();
}, "A").start();
new Thread(() -> {
i.getAndIncrement();
}, "B").start();
// 使用自旋方式防止提前notify()
while (i.get()!=2);
System.out.println(i.get());
o.notify();
}
} else {
o.wait();
}
// 减法
if (i.get() != 0) {
synchronized (o) {
new Thread(() -> {
i.getAndDecrement();
}, "C").start();
new Thread(() -> {
i.getAndDecrement();
}, "D").start();
while (i.get()!=0);
System.out.println(i.get());
o.notify();
}
} else {
o.wait();
}
}
}
}