多线程锁:
(1) 按照其性质分类:
① 公平锁/非公平锁:是否按照申请锁的顺序来获取锁。有可能会造成优先级反转或者饥饿现象
②乐观锁/悲观锁:看待并发同步的态度
③独享锁/共享锁:是否被多个线程所持有
④互斥锁/读写锁:具体的实现。互斥锁在java中具体实现是ReentrantLock;读写锁在java中具体实现是ReentrantReadWriteLock
⑤ 可重入锁:又称递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁
(2) 按照设计方案来分类:
① 自旋锁/自适应自旋锁:是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁
②锁粗化/锁消除:是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除/减少没必要的加锁
③偏向锁/轻量级锁/重量级锁:锁的状态,并且这对synchronized
④ 分段锁:其实是一种锁的设计,并不是具体的一种锁,通过分段锁的形式实现高效的并发操作
(3) 常见的锁:
Synchronized和Lock
① Synchronized:就是一个非公平、悲观,独享,互斥,可重入的重量级锁
② ReentrantLock,就是一个默认非公平但可实现公平的,悲观,独享,互斥,可重入、重量级锁
ReentrantReadWriteLock,就是一个默认非公平但可实现公平的、悲观、写独享、读独享、读写、可重入、重量级锁