ReentrantLock
- ReentrantLock类的lock()与unlock()结合Condition类的await()与signal()方法实现wait/notigy机制。
- 建立多个Condition可以实现唤醒部分线程。
- 公平锁: 采用先到先得的策略,每次获取锁之前都会检查队列里面有没有排队等待的线程,没有才会舱室获取锁,如果有就将当前线程追加到队列中。
- 非公平锁:采用“有机会插队”的策略,一个线程获取锁之前要先去尝试获取锁而不是在队列中等待,如果获取锁成功,则说明线程虽然是后启动的,但先获得了锁。
- Public int getHoldCount()方法的作用是查询“当前线程”保持此锁定的个数,即调用lock()方法的次数。
- public final int getQueueLength()方法的作用是返回正等待获取此锁的线程数。
- public int getWaitQueueLength(Condition)方法的作用是返回等待与此锁相关的给定条件的线程数。
- public final boolean hasQueuedTHread(Thread)方法的作用是查询指定的线程是否正在等待获取此锁,也就是判断参数中的线程是否在等待队列中。
- public final boolean hasQueuedThreads()方法的作用是查询是否有线程正在等待获取此锁,也就是等待队列中是否有等待的线程。
- public boolean hasWaiters(Condition)方法的作用是查询是否有线程正在等待与此锁有关的condition条件,也就是是否有线程执行了condition对象的await()方法而呈等待状态。
- public final boolean isFair()方法的作用是判断是不是公平锁。默认是公平锁
- public boolean isHeldByCurrentThread()方法的作用是查询当前线程是否保持此锁。
- public boolean isLocked()方法的作用是查询是否有任意线程保持,并没有释放。
- public void lockInterruptibly()方法的作用是当某个线程尝试获得锁并且阻塞在lockInterruptibly()方法时,该线程可以被中断。
- public boolean tryLock()方法的作用是嗅探拿锁,如果当前线程发现锁被其他线程持有了,则返回false,程序继续执行后面的代码,而不是呈阻塞等待锁的状态。
- public boolean tryLock(long,TimeUnit),若在指定时间内获得锁,返回true;
- public boolean awaitUnit(Date)方法的作用是在指定的Date结束等待。
ReentrantReadWriteLock类
- 读写锁有两个锁:一个是读操作相关的锁,也称为共享锁;另一个是写操作相关的锁,也称排它锁。读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。