从内存语义看锁操作在 Java 内存模型中每个线程有自己的工作内存可理解为 CPU 缓存、寄存器等所有共享变量都存放在主内存中。线程不能直接读写主内存中的变量而是需要在工作内存中操作副本。加锁1.清除工作内存中所有共享变量的副本 2. 从主内存重新加载最新的共享变量值释放锁1.将工作内存中对共享变量的修改刷新到主内存 2. 其他线程加锁时就能看到这些修改synchornized锁synchornized锁是java提供的原子性内置锁也成为监视器使用该锁后会在编译的同步代码块加上monitorenter和monitoreixt字节码指令,主要作用就是实现原子性操作和解决共享变量内存可见性。monitorenter执行该指令时对象会尝试获取锁如果已经获得锁了或者对象没有被锁定则计数器1,其他竞争锁的线程会进去等待队列monitoreixt当执行该指令时计数器-1当计数器为0时锁释放其他在等待队列的线程会开始竞争该锁从源码层面讲可重入解释基于计算机系统的 mutex Lock 实现每个可重入锁关联1.线程ID标识当前持有锁的线程2.锁状态status记录锁的使用状态表现一个线程在调用synchronized方法的同时在其方法体内部可以调用该对象的另一个synchronized方法升级过程无锁-----偏向锁----轻量级锁 ----重量级锁Reentrantlock可重入锁解释同一个线程获取了一个锁之后再次重复获取了该锁而不导致阻塞或者死锁问题表现线程又计数器当线程获取该锁的时候计数器会1如果再次获取计数器也会1如果释放锁的话计数器会-1只有当计数器减为0则完全释放锁对比区别相关问题生产者消费者问题synchornized版lock版Condition精准通知和唤醒线程设置多个监视器进行精准唤醒线程如下例通过Condition进行精准唤醒线程按顺序执行线程ABC执行结果单例模式排序算法死锁