欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中的锁

程序员文章站 2024-01-10 08:11:34
...

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