Files
Hui-s-notebook/logseq-java/pages/Java中21种锁.md
2024-02-02 00:12:49 +08:00

2.2 KiB
Raw Blame History

  • 乐观锁
    • 读多写少写入时进行CAS操作
  • 悲观锁
    • 写多读少,每一次读写都上锁
    • Synchronized ReentrantLock
  • 自旋锁
    • 自旋空操作,避免线程切换开销
    • 等待时间过程会浪费性能
  • 可重入锁
    • 可以多次获取同一个锁
    • ReentrantLockSynchronized
    • 申请几把锁需要释放几把锁
  • 读写锁
    • 读锁
      • 允许多个线程同时访问一个资源
    • 写锁
      • 只允许一个线程获取锁
  • 公平锁
    • 多个线程按照申请锁的顺序获取锁
  • 非公平锁
    • 多个线程获取锁的顺序不是一致的
    • 线程状态修改需要时间
    • 导致线程饥饿
    • synchronizedlock通过构造方法修改
  • 共享锁
    • 和读锁,乐观锁类似
  • 独占锁
    • 和写锁,悲观锁类似
  • 重量级锁
    • 依赖操作系统的锁
    • synchronized通过监视器monitor实现需要用户态和内核态切换
  • 轻量级锁
    • 没有竞争时通过CAS操作实现
    • 有竞争变为重量级锁
  • 偏向锁
    • 偏向第一个获取的线程如果没有竞争就不需要进行CAS操作可以直接获取锁
    • 如果存在锁及大部分都是竞争的情况下是多余的
  • 分段锁
    • jdk1.7ConcurrentHashMap有16个segment
  • 互斥锁
    • 和写锁、悲观锁、独占锁类似
  • 同步锁
    • 互斥锁、写锁、悲观锁
    • 并发执行的多个线程,同一时间只有一个线程可以访问
  • 死锁
    • 线程持有对方线程需要的自由,又都不释放自己的锁
  • 锁粗化
    • 扩大加锁的范围,减少加锁的频率减少损耗
  • 锁消除
    • 如果共享资源没有竞争就消除锁
    • 内存逃逸分析
  • synchronized
    • 实例方法,方法,代码块
  • lock
    • 接口,可重入锁,悲观锁,独占锁,互斥锁,同步锁
    • 需要手动释放
    • 发生异常没有主动释放锁很可能会死锁
    • 可以让等待锁的线程响应中断
    • 可以知道是否成功获取锁
    • 实现读写锁提高效率
  • ReentrantLock和Synchronized
    • 都解决共享变量安全访问的问题
    • 可重入锁
    • 可见性,原子性
    • 手动调用lock和unlock
    • 响应中断
    • APIJVM
    • 公平,非公平
    • ReentrantLock通过Condition绑定多个条件