synchronized

2019-01-28  本文已影响0人  Ray昱成

介绍

synchronized是JVM内建的同步机制,提供了互斥性和可见性来保证多线程安全。当某一线程获取到当前锁时,其他线程只能处于阻塞或者等待状态。

用法

可作用于方法上或者代码块中

实现原理

synchronized代码块是由一对monitorenter/monitorexit实现的,Monitor对象是实现同步的基本单元。
如下代码:

public void test(){
     synchronized(this){
          int i=0;
     }
  }

反编译后如下:


image.png

Monitor的实现

之前的Monitor实现主要依靠操作系统内部的互斥锁来实现,需要进行用户态到内核态的转变,所以是一个重量级的操作锁。
JDK8对此进行了改良,提供了三种实现Monitor的方式,分别为偏斜锁、轻量级锁、重量级锁

读写锁

独占锁要么不占,要么独占,这种行为有一定的局限性,比如在一个写少读多的并发情况下,并不适合使用独占锁。
读写锁的原理是读锁时共享,写锁时互斥,运行阶段,如果读锁试图锁定对象,写锁正在被某个线程持有,此时读锁会等待对方操作结束,从而保证数据的正确性。
读写锁的粒度虽然相对较细,但是却增加了比较大的开销。
StampedLock是java8提供的更优于读写锁的类。不仅提供了读锁和写锁,还支持优化读模式。基于一种假设:大多数情况下读和写不会发生冲突,其逻辑先试着读,然后通过validate函数确认是否进入了写模式,
如果没有则可以避免多余的开销;如果进去了,则尝试获取读锁。

自旋锁

在无法获取到锁时,采用轮询体内实现,当循环条件被外界改变时,进入临界区

上一篇 下一篇

猜你喜欢

热点阅读