多线程并发总结四 STM

如果我们要处理的情况符合下面的几种之一,我们可以考虑一下使用非阻塞的方式来处理并发的情况。

  • 有多线程的情况要处理,但是很少出现并发冲突的,比如以读取为主的
  • 涉及到的并发逻辑非常复杂,希望可以减低并发代码出错的可能和保持并发代码的可读性。

非阻塞的代码可以较大限度的保持并发代码的可读性。它的原理就像下面的伪代码

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值