【并发编程】-- 多线程间并发与并行原理(二)

44 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

针对这种情况,任务a写回num值后,任务b只对任务a写回的num值操作即可,即是任务a执行写num值,任务b读取a写入的num值,然后加1写回内存中。

那么怎样实现这种操作?可以有两种解决方案如下:

  • 在任务a执行读取num、num加1、写回num操作时,任务b必须等待,等任务a执行完成,才能执行任务b,简单而言就是对add()方法进行管制操作,只允许同时有一个任务调用add()方法,其他任务必须等待任务a执行完成才能获取到num资源。

  • 任务a和任务b同时读取num变量,同时对num加1,写回时占用系统内的锁,然后对内存中num的值进行比较,看是不是之前读取的num变量,如果是,那么将可以替换num变量,也就是说,当任务a和任务b同时读取到num等于1时,任务a和b同时加1,此时任务a和b中的临时值都是2,写入时,a和b竞争系统锁,如果任务a竞争到了,a看看内存中num的值是不是1,如果是则替换,然后释放锁,任务b对比一看num的值为2,则不能替换,重复加载num的值、加1操作、加锁比较写入的步骤,直到成功。

    上面两种方式,其实就是Java中的监视器锁和CAS操作,两种解决方案是同一种思路,而不同的是上锁操作是在程序里执行,后者是用汇编加上系统硬件来处理,两者都是为了解决同一问题-使发生竞争的地方串行化,这也是涉及到并发与并行就会出现诸多问题的原因,但是多种解决方案都是同一思路。