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

70 lines
2.2 KiB
Markdown
Raw Blame History

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