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