Java 中的锁

Java Lock juc 大约 1347 字

关键词和类

  • synchronized
  • ReentrantLock
  • ReentrantReadWriteLock
  • StampedLock
  • LockSupport

名词术语

  • 偏向锁
  • 轻量级锁
  • 重量级锁
  • 公平锁
  • 非公平锁
  • 可重入锁
  • 递归锁
  • 自旋锁
  • 独占锁
  • 共享锁
  • 互斥锁
  • 读锁
  • 写锁
  • 分段锁

公平锁/非公平锁

公平锁就是队列,多个线程按照锁的申请顺序来获取锁,类似排队打饭,先来后到。

非公平锁,就是加塞,能加塞上就加,加不上再变公平锁,获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。在高并发的情况,有可能会造成优先级反转或饥饿现象。

非公平锁优点在于吞吐量比公平锁大。

synchronizedReentrantLock默认都是非公平锁。

可重入锁/递归锁

可重入锁又叫递归锁。

线程可以进入任何一个它已经拥有的锁的同步着的代码块。

自旋锁

获取锁的线程不会立即阻塞,采用循环的方式去尝试获取锁。

好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU

独占锁

锁一次只能被一个线程持有。对synchronizedReentrantLock而言都是独占锁。

共享锁

该锁可以被多个线程所持有。

ReentrantReadWriteLock:读锁是共享锁,写锁是独占锁,但读写是互斥的,写的时候不能读,读的时候不能写。

synchronized

底层原理

monitor entermonitor exit指令。

为什么有两个 monitor exit

第一个monitorexit是正常程序退出,第二个monitorexit是确保异常情况下锁也能解除。

public static void main(java.lang.String[]);
Code:
   0: ldc           #2                  // class lock/SyncDemo
   2: dup
   3: astore_1
   4: monitorenter
   5: aload_1
   6: monitorexit
   7: goto          15
  10: astore_2
  11: aload_1
  12: monitorexit
  13: aload_2
  14: athrow
  15: return
Exception table:
   from    to  target type
       5     7    10   any
      10    13    10   any

Lock

底层原理

AQS+CAS

synchronized 与 Lock 区别

synchronized

  1. 非公平锁
  2. synchronized属于jvm层面,Java关键字
  3. 不需要用户手动释放,同步代码块执行完毕后会自动释放
  4. 不可中断。要么完成要么抛出异常

Lock

  1. 非公平锁和公平锁都可以
  2. LockJava API层面,Java5
  3. 需要用户手动释放,若没有释放,就有可能导致出现死锁现象
  4. 可中断,设置超时时间tryLock(long timeout, TimeUnit unit)
阅读 406 · 发布于 2021-04-03

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批