美文网首页
java中的锁

java中的锁

作者: next_discover | 来源:发表于2019-03-20 23:09 被阅读0次

    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;
       }
    }
    

    相关文章

      网友评论

          本文标题:java中的锁

          本文链接:https://www.haomeiwen.com/subject/ndrxvqtx.html