• Java synchronized实现原理深度剖析

    刚刚开始学习 Java 的时候,一遇到多线程的问题就简单粗暴地使用 synchronized 关键字,对于当时的我们来说,synchronized 是多么的神奇和强大呀!那个时候我们还给 synchronized 起了一个名字“同步”,它成了我们解决多线程问题百试不爽的良药。

    后来随着学习的深入,我们知道 synchronized 是一个重量级锁,相对于 Lock,显得非常笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。随着 Javs 6 对 synchronized 进行了各种优化,synchronized 并不会显得那么笨重了。

    本节我们重点讨论一下 synchronized 关键字的实现机制、Java 对 synchronized 进行了什么优化、锁优化机制、锁的存储结构和升级过程。

    Java synchronized 实现原理

    synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。

    Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础:

    • 普通同步方法,锁是当前实例对象;
    • 静态同步方法,锁是当前类的 class 对象;
    • 同步方法块,锁是括号里面的对象。

    当一个线程访问同步代码块时,它首先是需要得到锁才能执行同步代码,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?我们先来看下面一段 Java 代码:

    public class SynchronizedTest {
        public synchronized void test1(){
    
        }
    
        public void test2(){
            synchronized (this){
    
            }
        }
    }

    为了分析 synchronize 的实现,我们需要利用 javap 工具查看生成的 .class文件(字节码文件)信息:

更多...

加载中...