速记-synchronized底层
synchronized 是 JVM 内部实现的一种可重入的互斥锁,当一个线程尝试获取一个已经被其他线程获取的 synchronized 锁时,该线程会进入阻塞状态等待其他线程释放该锁。在这个等待过程中,该线程会不断的尝试获取锁,这个过程被称为“自旋”,即不断重试直到获取到锁为止。
在 JDK 1.6 之前,synchronized 采用的是偏向锁和重量级锁两种机制。对于偏向锁,如果一个线程获取到了一个对象的锁,那么该对象的头信息中会存储这个线程的标识,后续该线程再次获取这个锁的时候就不需要竞争了。对于重量级锁,当多个线程需要争用同一个锁的时候,会进入到阻塞状态,此时需要等待其他线程释放锁才能继续执行。
在 JDK 1.6 之后,synchronized 引入了自适应锁,当线程竞争锁的次数较少时,锁会采用自旋的方式,而不是阻塞。如果线程竞争锁的次数达到一定阈值,就会升级为重量级锁,避免出现过多的自旋。
无论是偏向锁、重量级锁还是自适应锁,都是通过加锁和解锁来实现线程同步的,加锁的过程需要消耗系统资源,如果在高并发场景下,线程竞争锁的次数过多,就会影响系统的性能。为了避免这种情况,我们可以使用更加高效的锁,例如 ReentrantLock。
在 JDK 1.6 之前,synchronized 采用的是偏向锁和重量级锁两种机制。对于偏向锁,如果一个线程获取到了一个对象的锁,那么该对象的头信息中会存储这个线程的标识,后续该线程再次获取这个锁的时候就不需要竞争了。对于重量级锁,当多个线程需要争用同一个锁的时候,会进入到阻塞状态,此时需要等待其他线程释放锁才能继续执行。
在 JDK 1.6 之后,synchronized 引入了自适应锁,当线程竞争锁的次数较少时,锁会采用自旋的方式,而不是阻塞。如果线程竞争锁的次数达到一定阈值,就会升级为重量级锁,避免出现过多的自旋。
无论是偏向锁、重量级锁还是自适应锁,都是通过加锁和解锁来实现线程同步的,加锁的过程需要消耗系统资源,如果在高并发场景下,线程竞争锁的次数过多,就会影响系统的性能。为了避免这种情况,我们可以使用更加高效的锁,例如 ReentrantLock。
全部评论
感谢楼主的解析
哇呜说的好详细
相关推荐


点赞 评论 收藏
分享