1 可重入锁

如果锁具备可重入性 则称作为可重入锁
像synchronized和ReentrantLock都是可重入锁
可重入性实际上表明了锁的分配机制:基于线程的分配 而不是基于方法调用的分配
比如
当一个线程A执行到某个synchronized方法时 比如说method1 此时线程A获取了这个对象的锁
而在method1中会调用另外一个synchronized方法method2 假如synchronized不具备可重入性 此时线程A需要重新申请锁
但是这就会造成一个问题 因为线程A已经持有了该对象的锁 却又继续申请获取该对象的锁 这样就会线程A一直等待永会获取不到这个锁

2 可中断锁

可中断锁 顾名思义 就是可以相应中断的锁
在Java中 synchronized就不是可中断锁 而Lock是可中断锁
如果某一线程A正在执行锁中的代码 另一线程B正在等待获取该锁
可能由于等待时间过长 线程B不想等待了 想先处理其他事情 我们可以让它中断自己或者在别的线程中中断它 这就是可中断锁

3 公平锁

公平锁即尽量以请求锁的顺序来获取锁
比如同是有多个线程在等待一个锁 当这个锁被释放时 等待时间最久的线程(最先请求的线程)会获得该锁 这种就是公平锁
非公平锁即无法保证锁的获取是按照请求锁的顺序进行的 这样就可能导致某个或者一些线程永远获取不到锁
在Java中 synchronized就是非公平锁 它无法保证等待的线程获取锁的顺序
对于ReentrantLock和ReentrantReadWriteLock 它默认情况下是非公平锁 但是可以设置为公平锁
在ReentrantLock中定义了2个静态内部类 一个是NotFairSync 一个是FairSync 分别用来实现非公平锁和公平锁的
所以可以在创建ReentrantLock对象时 通过以下方式来设置锁的公平性:

ReentrantLock lock = new ReentrantLock(true);
//如果参数为true表示为公平锁 为fasle为非公平锁
//默认情况下 如果使用无参构造器 则是非公平锁

在ReentrantReadWriteLock中也有类似的方法 同样也可以设置为公平锁和非公平锁
不过要记住 ReentrantReadWriteLock并未实现Lock接口 它实现的是ReadWriteLock接口

读写锁

读写锁将对一个资源(比如文件)的访问分成了2个锁 一个读锁和一个写锁
正因为有了读写锁 才使得多个线程之间的读操作不会发生冲突

ReadWriteLock就是读写锁 它是一个接口
ReentrantReadWriteLock实现了这个接口
可以通过readLock()获取读锁 通过writeLock()获取写锁