互斥与内存模型
互斥:用锁保证某一时间仅有一个线程可以访问数据。但是互斥也会带来麻烦,比如竞态条件和死锁。
创建线程
在java中,并发的基本单元是线程,可以将线程看作控制流。线程之间通过共享内存进行通信。
![](https://img.haomeiwen.com/i2489875/03a647a1fbba1385.png)
我运行的结果有两种:
![](https://img.haomeiwen.com/i2489875/ca8fb935e6a64ab2.png)
![](https://img.haomeiwen.com/i2489875/d9a6ac23ba3d9eea.png)
第一把锁
![](https://img.haomeiwen.com/i2489875/8cd7e0158e6b7f4d.png)
运行这段代码,每次都获得不同的结果,原因是:两个线程使用counter.cout时发生了竞态条件(代码行为取决于各操作的时序)
java编译器对++count的解释,字节码如下:
![](https://img.haomeiwen.com/i2489875/8d63927b8e99a9c1.png)
![](https://img.haomeiwen.com/i2489875/c4753f6654ae8902.png)
竞态条件的解决方案是对count进行同步(synchromized)访问,一种方法是使用Java对象原生的内置锁(也称为互斥锁(mutex)、管程(monitor)或临界区(critical section))来同步多increment()的调用:
![](https://img.haomeiwen.com/i2489875/88052f283b752795.png)
![](https://img.haomeiwen.com/i2489875/507c8d48aecb7ca9.png)
再看一个例子:
![](https://img.haomeiwen.com/i2489875/c424655463dd1ed8.png)
![](https://img.haomeiwen.com/i2489875/a1412b353085b7fa.png)
![](https://img.haomeiwen.com/i2489875/f72c8c3c088cacdf.png)
![](https://img.haomeiwen.com/i2489875/126faff0749fd23e.png)
内存可见性
Java内存模型定义了何时一个线程对内存的修改对另一个线程可见。基本原则是,如果读线程和写线程不进行同步,就不能保证可见性。
![](https://img.haomeiwen.com/i2489875/4775aff77222dabe.png)
网友评论