曹耘豪的博客

Java并发之synchronized

  1. synchronized特性
  2. synchronized优化
  3. 锁介绍
    1. 偏向锁
    2. 轻量级锁
    3. 重量级锁
    4. 自旋锁
  4. 参考

synchronized特性

synchronized优化

锁介绍

偏向锁

在运行过程中,对象的锁偏向某个线程。即在开启偏向锁机制的情况下,某个线程获得锁,当该线程下次再想要获得锁时,不需要再获得锁(即忽略synchronized关键词),直接就可以执行同步代码,比较适合竞争较少的情况

轻量级锁

对于没有多线程竞争的情况,如果存在多线程竞争,则膨胀为重量级锁

重量级锁

即当有其他线程占用锁时,当前线程会进入阻塞状态

自旋锁

在自旋状态下,当一个线程A尝试进入同步代码块,但是当前的锁已经被线程B占有时,线程A不进入阻塞状态,而是不停的空转,等待线程B释放锁。如果锁的线程能在很短时间内释放资源,那么等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞状态,只需自旋,等持有锁的线程释放后即可立即获取锁,避免了用户线程和内核的切换消耗。

自旋等待最大时间:线程自旋会消耗cpu,若自旋太久,则会让cpu做太多无用功,因此要设置自旋等待最大时间。

优点:开启自旋锁后能减少线程的阻塞,在对于锁的竞争不激烈且占用锁时间很短的代码块来说,能提升很大的性能,在这种情况下自旋的消耗小于线程阻塞挂起的消耗

缺点:在线程竞争锁激烈,或持有锁的线程需要长时间执行同步代码块的情况下,使用自旋会使得cpu做的无用功太多

参考

   / 
  ,