synchronized锁的升级原理是什么,以及各个锁的状态对比?
一、synchronized锁的基本原理
synchronized是Java中用于实现线程安全的关键字,它可以应用于方法或代码块。当一个线程进入synchronized代码块时,它将获得一个锁,其他线程在尝试进入同步代码块时会被阻塞,直到持有锁的线程释放锁。
synchronized锁的基本原理是基于对象的监视器(monitor)。每个Java对象都有一个与之关联的监视器,这个监视器可以被一个线程持有。当一个线程获取到对象的监视器时,它就可以执行同步代码块,其他线程则需要等待。
二、synchronized锁的升级
尽管synchronized锁是简单易用的,但在高并发场景下性能可能不尽如人意。为了提高并发性能,Java引入了一些锁的升级机制,具体如下:
1、偏向锁(Biased Locking)
偏向锁是JDK 6中引入的一种优化机制。它的设计初衷是针对没有竞争的场景,假设在多数情况下,锁总是由同一线程多次获得的。在偏向锁状态下,当一个线程获取到锁后,会在对象头中记录下自己的线程ID。这样,下次该线程再次获取锁时,无需进行同步操作,可以直接进入临界区。
2、轻量级锁(Lightweight Locking)
轻量级锁是JDK 6中对synchronized锁的升级改进。它的目标是在多个线程交替执行同步块的情况下,减少传统的重量级锁的开销。轻量级锁的实现方式是通过CAS(Compare and Swap)操作来实现,将对象头中的一部分空间作为锁记录。当多个线程竞争同一锁时,会尝试使用CAS操作来获取锁,成功则进入临界区,失败则升级为重量级锁。
3、重量级锁(Heavyweight Locking)
重量级锁是synchronized锁的默认状态,也是最常见的状态。当多个线程竞争同一锁时,会进入重量级锁状态。在重量级锁状态下,竞争失败的线程会进入阻塞状态,被放入锁的等待队列中。只有持有锁的线程释放锁后,等待队列中的线程才有机会获取锁进入临界区。
三、各个锁的状态对比
下面对偏向锁、轻量级锁和重量级锁进行简要对比,以便更好地理解它们之间的差异。
1、偏向锁
适用场景:适用于多数情况下锁总是由同一线程多次获得的场景。获取锁的代价:获取偏向锁的代价非常低,几乎没有额外开销。竞争情况:当其他线程尝试竞争偏向锁时,偏向锁会自动升级为轻量级锁。2、轻量级锁
适用场景:适用于多个线程交替执行同步块的情况,竞争不激烈的场景。获取锁的代价:获取轻量级锁的代价相对较低,需要进行CAS操作。竞争情况:当竞争激烈或者CAS操作失败时,轻量级锁会自动升级为重量级锁。3、重量级锁
适用场景:适用于竞争激烈的场景,多个线程频繁争夺同一个锁的情况。获取锁的代价:获取重量级锁的代价相对较高,需要进行线程阻塞和唤醒操作。竞争情况:当持有锁的线程释放锁后,等待队列中的线程按照FIFO顺序竞争锁的获取。需要注意的是,锁的升级过程是自动进行的,开发者无需手动干预。JVM会根据锁的竞争情况自动切换锁的状态,以平衡性能和线程公平性。
在实际开发中,选择合适的锁取决于具体的应用场景和线程竞争情况。如果线程之间的竞争非常激烈,可以考虑使用其他更高级的锁机制,如并发包中提供的ReentrantLock、ReadWriteLock等,它们提供了更细粒度的控制和更高的并发性能。

猜你喜欢LIKE
相关推荐HOT
更多>>
一个搜索框对应数据库多个字段,后台怎么对应?
一、一个搜索框对应数据库多个字段,后台对应的方法 1、使用SQL语句自定义查询条件可以在后台使用SQL语句自定义搜索的查询条件,将多个字段拼接...详情>>
2023-10-15 23:26:29
用Visual Studio连接Access数据库为什么只识别.mdb格式不识别.accdb格式?
一、用Visual Studio连接Access数据库为什么只识别.mdb格式不识别.accdb格式如果VBA或Visual studio中c#无法读取Accdb格式,可能是电脑没有安装...详情>>
2023-10-15 21:27:21
Spark SQL和Oracle、MySQL有什么区别?
一、Spark SQL和Oracle、MySQL有什么区别SQL,在这里我理解成SQL Server。三者是目前市场占有率较高(依安装量而非收入)的关系数据库,而且很...详情>>
2023-10-15 16:10:33
MySQL的自增ID用完了怎么办?
一、MySQL的自增ID用完了的解决办法1、调整自增ID的数据类型如果使用的是整数类型的自增ID,可以考虑将其修改为更大的整数类型,如将INT类型改...详情>>
2023-10-15 13:27:09热门推荐
一个搜索框对应数据库多个字段,后台怎么对应?
沸有没有什么基于postgresql的newsql?
热sql server 2017安装时出现错误怎么办?
热如何将Word中大量格式重复的文本转换成表格或者录入数据库?
新用Visual Studio连接Access数据库为什么只识别.mdb格式不识别.accdb格式?
elasticsearch也具有存储功能,为什么感觉平时看到的方案,更多是和其他数据库一起用?
hive里面的分区表和分桶表一般用于什么场景?
MySQL里面怎么给视图增加索引?
同一个服务器建立多个数据库和一个数据库上建立多个实例有什么区别?
高级子查询、嵌套子查询、相关子查询、普通子查询的区别?
synchronized锁的升级原理是什么,以及各个锁的状态对比?
epoll lt/et模式区别是什么?
为什么说MySQL Cluster是shared-nothing架构的?
安卓APP开发工具有哪些?
技术干货






