synchronized原理学习笔记

栏目: Java · 发布时间: 5年前

内容简介:所有Java对象都会有一个monitor,当monitor被持有后,对象就处于锁定状态。当执行到monitorenter指令时,线程会尝试获取对象的monitor,而执行monitorexit后会释放对象的monitorJava SE 1.6为了降低锁的获取、释放造成的性能损耗,增加了偏向锁、轻量级锁。锁的级别由高到低依次为无锁状态、偏向锁、轻量级锁、重量级锁,锁可以升级,但不可以降级锁由同一线程多次获取时,会在对象头中记录线程ID,并在之后对同步块的访问时,不需要进行CAS操作来加锁、解锁。
  • 同步代码块通过 monitorentermonitorexit 两条指令控制同步代码块的访问
  • 同步方法通过设置 ACC_SYNCHRONIZED 标志符控制(也可以通过上述两条指令来实现)

所有 Java 对象都会有一个monitor,当monitor被持有后,对象就处于锁定状态。当执行到monitorenter指令时,线程会尝试获取对象的monitor,而执行monitorexit后会释放对象的monitor

Java SE 1.6为了降低锁的获取、释放造成的性能损耗,增加了偏向锁、轻量级锁。锁的级别由高到低依次为无锁状态、偏向锁、轻量级锁、重量级锁,锁可以升级,但不可以降级

偏向锁

内容

锁由同一线程多次获取时,会在对象头中记录线程ID,并在之后对同步块的访问时,不需要进行CAS操作来加锁、解锁。

Mark Word状态

Mark Word记录于对象头,存储对象的hashcode或锁信息

这里补充无锁状态的Mark Word状态

锁状态 hashcode 分代年龄 是否偏向锁 锁标志位
无锁状态 对象的hashcode 对象分代年龄 0 01

偏向锁状态的Mark Word状态

锁状态 Thread ID epoch 分代年龄 是否偏向锁 锁标志位
偏向锁 记录指向的线程id epoch 对象分代年龄 1 01

加锁与解锁

synchronized原理学习笔记

轻量级锁

内容

轻量级锁是通过自旋实现非阻塞同步,属于乐观锁,可以膨胀为重量级锁

Mark Word状态

锁状态 记录 锁标志位
轻量级锁 指向栈中锁记录的指针 01

加锁与解锁

加锁

synchronized原理学习笔记

解锁

synchronized原理学习笔记

重量级锁

锁升级为重量级锁后,其他试图获取锁的线程均会被阻塞,等待持有锁的线程释放锁后,被唤醒的线程会开始竞争获取锁。

重量级锁是一种互斥锁,其依赖于对象内部的monitor锁实现,在操作系统层面是通过MutexLock实现的。虽然在阻塞时不需要耗费CPU资源,但是线程从阻塞状态唤醒需要操作系统完成状态转换(用户态到内核态),耗时较长。

比较

对比表参考《Java并发编程的艺术》

优点 缺点 适用场景
偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法相比仅存在纳秒级的差距 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 适用于只有一个线程访问同步块的场景
轻量级锁 非阻塞同步,提高程序响应速度 自旋消耗CPU资源 追求响应时间,同步方法执行速度较快
重量级锁 线程阻塞时不需要消耗CPU 线程阻塞,响应时间缓慢 追求吞吐量,同步块执行时间较长

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

多任务下的数据结构与算法

多任务下的数据结构与算法

周伟明 / 华中科技 / 2006-4 / 58.00元

本书和传统同类书籍的区别是除了介绍基本的数据结构容器如栈、队列、链表、树、二叉树、红黑树、AVL树和图之外,引进了多任务;还介绍了将任意数据结构容器变成支持多任务的方法;另外,还增加了复合数据结构和动态数据结构等新内容的介绍。在复合数据结构中不仅介绍了哈希链表、哈希红黑树、哈希AVL树等容器,还介绍了复合数据结构的通用设计方法;在动态数据结构中主要介绍了动态环形队列、动态等尺寸内存管理算法。在内存......一起来看看 《多任务下的数据结构与算法》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器