1. 目录
- 重入锁
- 独享锁/共享锁
- 互斥锁/读写锁
- 乐观锁/悲观锁
- 分段锁
- 自旋锁
- 公平锁/非公平锁
- 偏向锁/轻量级锁/重量级锁
- 总线锁/缓存锁
2. 重入锁
指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁.
synchronized和ReentrantLock都是可重入锁
3. 独享锁/共享锁
3.1 独享锁:
指该锁一次只能被一个线程所持有
ReentrantLock和Synchronized都是独享锁
3.2 共享锁:
指该锁可被多个线程所持有
ReadWriteLock的读锁时共享锁,写锁时独享锁
4. 互斥锁/读写锁
概念等同独享锁和共享锁,读写锁能提升读的效率
5. 乐观锁/悲观锁
5.1 乐观锁:
认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。乐观的认为,不加锁的并发操作是没有事情的
5.2 悲观锁:
认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。悲观的认为,不加锁的并发操作一定会出问题
6. 分段锁
分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。
首先将数据分成一段一段地存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问
7. 自旋锁(cas)
指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU
8. 公平锁/非公平锁
8.1 公平锁
等待最久的线程获取锁
8.2 非公平锁
所有的等待线程一起抢锁,谁抢到就是谁的
8.3 基于AQS实现的大部分锁都同时支持这两种
ReentrantLock/ReadWriteLock等
9 偏向锁/轻量级锁/重量级锁
这三种锁是指锁的状态,并且是针对Synchronized。在Java 5通过引入锁升级的机制来实现高效Synchronized。这三种锁的状态是通过对象监视器在对象头中的字段来表明的。
9.1 偏向锁:
是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
9.2 轻量级锁:
是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
###9.3 重量级锁:
是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。
10. 总线锁/缓存锁(cpu的锁)
10.1 总线锁
就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存
10.2 缓存锁
所谓“缓存锁定”是指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行数据时,会使缓存行无效