java中的锁

2019-03-20  本文已影响0人  next_discover

Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。JDK中对Synchronized做的种种优化,其核心都是为了减少这种重量级锁的使用。JDK1.6以后,为了减少获得锁和释放锁所带来的性能消耗,提高性能,引入了“轻量级锁”和“偏向锁”。

无锁,偏向锁,轻量锁,重量锁

随着锁的竞争,锁可以从偏向锁升级到轻量级锁,
再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。
JDK 1.6中默认是开启偏向锁和轻量级锁的

volatile

而volatile关键字就是Java中提供的另一种解决可见性和有序性问题的方案。对于原子性,需要强调一点,也是大家容易误解的一点:对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作

并发环境下的单例实现方式,我们通常可以采用双重检查加锁(DCL)的方式来实现。

public class Singleton {
   public static volatile Singleton singleton;

   /**
    * 构造函数私有,禁止外部实例化
    */
   private Singleton() {};

   public static Singleton getInstance() {
       if (singleton == null) {
           synchronized (singleton) {
               if (singleton == null) {
                   singleton = new Singleton();
               }
           }
       }
       return singleton;
   }
}
上一篇下一篇

猜你喜欢

热点阅读