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文件(字节码文件)信息:

本文标题:Java synchronized实现原理深度剖析

本文地址:http://www.hosteonscn.com/7025.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注