Java并发(02)-Synchronized原理与应用

2019-06-26  本文已影响0人  小亮__

使用方法

Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。它总共有三种用法:

因为修饰的地方不同,synchronized使用的锁也不同,通俗的称分为:方法锁,对象锁 和 类锁 三种.

  1. 无论是修饰方法还是修饰代码块都是 对象锁,当一个线程访问一个带synchronized方法时,由于对象锁的存在,所有加synchronized的方法都不能被访问(前提是在多个线程调用的是同一个对象实例中的方法)

  2. 无论是修饰静态方法还是锁定某个对象,都是 类锁.一个class其中的静态方法和静态变量在内存中只会加载和初始化一份,所以,一旦一个静态的方法被申明为synchronized,此类的所有的实例化对象在调用该方法时,共用同一把锁,称之为类锁。

Synchronized作用与原理

它可以有效的解决一下问题,保证并发编程中的特性

下面编写一个例子,通过反编译来一起看一下Synchronized的原理

public class SynchronizedDemo {
     public void method() {
         synchronized (this) {
             System.out.println("Method 1 start");
         }
     }
 }

从下面反编译的结果来看,起到关键性作用的主要是monitorenter和montorexit两个命令。


JVM规范中描述:每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:

monitorenter:

monitorexit:

通过这两段描述,我们应该能很清楚的看出Synchronized的实现原理,Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。

JDK1.6之后的锁优化:

JDK1.6对锁的实现引入了大量的优化,如自旋锁,适应性自旋锁,锁消除,锁粗化,偏向锁,轻量级锁等锁的技术来减少锁操作的开销。

锁主要存在四种状态:无锁状态、偏向锁状态,轻量级锁状态,重量级锁状态。他们会随着竞争激烈而不断升级;

注意锁可以升级不可以降级,这种策略是为了提高获得锁和释放锁的效率。

自旋锁:

自适应自旋锁:

锁消除:

锁粗化:

轻量级锁:

偏向锁:

重量级锁:

上一篇 下一篇

猜你喜欢

热点阅读