Sychronized的偏向锁、轻量级锁、重量级锁
时间: 2023-09-19 18:12:04 浏览: 98
Synchronized是Java中用于实现线程同步的关键字,它可以用来控制对共享资源的访问。在Synchronized的实现中,包括偏向锁、轻量级锁和重量级锁三种锁机制。
偏向锁:在Java6及以后的版本中,为了提高Synchronized的性能,引入了偏向锁的概念。偏向锁是一种针对单线程使用的锁,它认为在大多数情况下,锁总是由同一线程多次获得。因此,偏向锁在第一次获得锁时,会将线程ID记录在锁对象的头部,并将锁标志位设置为偏向锁。在接下来的操作中,如果同一线程再次请求锁,就可以直接获得锁,无需进行竞争。这样可以避免线程切换和锁竞争,提高了性能。
轻量级锁:如果多个线程同时访问同一个锁,偏向锁就会失效,JVM会尝试使用轻量级锁来避免线程切换和锁竞争。轻量级锁是通过CAS操作来实现的,它不会像重量级锁那样将线程挂起,而是在竞争失败时,通过自旋来等待锁的释放。
重量级锁:如果轻量级锁竞争失败,JVM会将锁升级为重量级锁。重量级锁是使用操作系统提供的互斥量来实现的,它会将竞争失败的线程挂起,等待锁的释放。这种锁的性能是最低的,因为线程切换和上下文切换的开销很大。
相关问题
sychronized如何使用,sychronized可以锁空对象吗
synchronized 关键字是用来确保在同一时间只有一个线程可以访问某个对象或者类的所有共享资源。可以使用 synchronized(this) 来锁定当前对象,而 synchronized(Object) 可以锁定任意对象。如果使用 synchronized(null) 来锁定空对象,会引发 NullPointerException 异常,因为 null 对象没有任何实际的资源可以被锁定。所以说,不能使用 synchronized(null) 来锁定空对象。
sychronized是乐观锁还是悲观锁
synchronized是一种悲观锁。在Java中,synchronized关键字可以用于同步代码块或方法,其作用是确保在同一时刻只有一个线程可以执行该代码块或方法,其他线程需要等待。在使用synchronized时,线程会获取锁并在执行完代码块或方法后释放锁,其他线程才能获得锁并继续执行。这种机制可以保证数据的一致性和线程安全,但是会导致性能上的损失,因为多个线程需要等待同一个锁。
阅读全文