上篇文章我们已经讲了 Java Lock 类,有兴趣的可以看看:深入 Java Lock 锁,今天我们来学一下 Synchronized,主要有以下知识点:
基本使用
实现机制
同步原理
前言
我们知道在 JDK1.5 之前 synchronized 是一个重量级锁,相对于 j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。
不过,随着 Javs SE 1.6 对 synchronized 进行的各种优化 后,synchronized 并不会显得那么重了。下面来一起探索 synchronized 的基本使用、实现机制、Java 是如何对它进行了优化、锁优化机制、锁的存储结构等升级过程。
基本使用
Synchronized
的作用主要有两个:
-
原子性
:确保线程互斥的访问同步代码; -
可见性
:保证共享变量的修改能够及时可见,其实是通过 Java 内存模型中的 “对一个变量 unlock 操作之前,必须要同步到主内存中;如果对一个变量进行 lock 操作,则将会清空工作内存中 此变量的值,在执行引擎使用此变量前,需要重新从主内存中 load 操作或 assign 操作初始化变量值” 来保证的;
从语法上讲,Synchronized 可以把任何一个非 null 对象作为 ” 锁 ”,在 HotSpot JVM 实现中,锁有个专门的名字:对象监视器(Object Monitor)。
实现机制
参考
深入分析 Synchronized 原理