美文网首页
synchronized

synchronized

作者: 淡季的风 | 来源:发表于2020-09-06 17:21 被阅读0次

简介

synchronized时java中的一个关键字, 用于控制并发, 也是java中的重量级锁。synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或者某个代码块, 并且保证一个线程的变化可见(可见性),可代替volatile。

使用方法

  • 对于普通同步方法, 锁是当前实例对象。
  • 对于静态同步方法, 锁是当前类的Class对象。
  • 对于同步方法快, 锁是synchronized括号里配置的对象。

原理

JVM规范规定,synchronized基于进入和退出Monitor对象来实现方法同步和代码块同步,但是两者的实现细节不太一样。代码块同步是用montiorentermonitorexit指令实现的,而方法同步是使用其他方式实现。

synchronized.png

monitorenter指令是在编译后插入到同步代码块的开始位置,monitorexit指定是插入到方法的结束处和异常处, JVM会保证每个monitorenter都有相应的monitorexit与之对应。任务和一个对象都有minitor与之关联,当且一个monitor被持有后, 它处于锁定状态。线程运行到monitorenter指令时,将会尝试获取对象所有对应的monitor的控制权,即尝试获得对象的锁。

synchronized同步方法并没有通过monitorenter和monitorexit来实现, 而是通过设置ACC_SYNCHRONIZED 标识, ACC_SYNCHRONIZED 告诉JVM该方法是一个同步方法,从而执行相应的同步调用。

synchronized是可重入锁, 可重入锁的意思是线程可以再次获取自己的内部锁,在同一锁程中,不需要再次获取锁。 每个对象拥有一个计数器, 当线程拥有锁后, 计数器加一, 线程释放锁后, 计数器减一。

synchronized特性:

20200503100118357.png

Java对象头

synchronized用的锁存在Java对象头里。

锁的升级和对比

Java SE1.6为了减少获得锁和四方所带来的性能损耗,引入了“偏向锁”和“轻量级锁” 。在Java1.6中, 锁一共存在4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级不能降级, 目的是为了降低获得锁和释放锁的效率。

  1. 偏向锁
  2. 轻量级锁
  3. 重量级锁

相关文章

网友评论

      本文标题:synchronized

      本文链接:https://www.haomeiwen.com/subject/uvmcektx.html