如果我们要处理的情况符合下面的几种之一,我们可以考虑一下使用非阻塞的方式来处理并发的情况。
- 有多线程的情况要处理,但是很少出现并发冲突的,比如以读取为主的
- 涉及到的并发逻辑非常复杂,希望可以减低并发代码出错的可能和保持并发代码的可读性。
非阻塞的代码可以较大限度的保持并发代码的可读性。它的原理就像下面的伪代码
AtomicInteger ai = new AtomicInteger(1);
new Thread(() -> {
do {
int oldValue = ai.getValue();
int newValue = doSomeCalculate(oldValue);
} while (ai.checkAndUpdate(oldValue, newValue));
});
代码里面没有任何的互斥的情况,如果没有出现大量的冲突而需要重试的情况,这段代码的执行效率将会十分的高。
但是这种处理有其限制,就是它只允许有一个的变量是共享的。
下面的伪代码是有问题的。
AtomicInteger ai1 = new AtomicInteger(1);
AtomicInteger ai2 = new AtomicInteger(1);
new Thread(() -> {
do {
int oldValue1 = ai1.getValue();
int oldValue2 = ai2.getValue();
int newValue1 = doSomeCalculate(oldValue1);
int newValue2 = doSomeCalculate(oldValue2);
} while (ai1.che