使用ReentrantLock类
使用ReentrantLock实现同步
调用ReentrantLock对象的lock()方法获取锁,调用unlock()方法释放锁,这两个方法成对使用。
多代码块间具有同步性
await()方法的错误用法和更正
在调用condition.await()方法之前调用lock.lock()代码获得锁。
使用await()和signal()实现wait/notify机制
await()方法暂停线程运行的原理
unsafe.park(false,0L)运行后实现了wait等待的效果
通知部分线程
condition可以分组,使用不同的condition唤醒不同组的线程
公平锁与非公平锁
公平锁:先到先得,后到排队
非公平锁:线程先尝试获取锁,不管有没有线程排队,如果获取锁失败则去排队
public int getHoldCount()方法的使用
作用是查询“当前线程“保持此锁定的个数,即调用lock()方法的次数
public final int getQueueLength()方法的使用
作用是返回正在等待获取此锁的线程估计数
public int getWaitQueueLength(Condition condition) 方法的使用
作用是返回等待与此锁相关的给定条件Condition的线程估计数
public final boolean hasQueuedThread(Thread thread)方法的使用
作用是查询指定的线程是否正在等待获取此锁,也就是判断参数中的线程是否在等待队列中
public final boolean hasQueuedThreads()方法的使用
作用是查询是否有线程正在等待获取此锁,也就是等待队列中是否有等待的线程
public boolean hasWaiters(Condition condition)方法的使用
作用是查询是否有线程正在等待与此锁有关的condition条件,也就是是否有线程执行了condition对象中的await()方法而呈等待状态
public final boolean isFair()方法的使用
作用是判断是不是公平锁
public boolean isHeldByCurrentThread()方法的使用
作用是查询当前线程是否保持此锁
public boolean isLocked()方法的使用
作用是查询此锁是否由任意线程保持,并没有释放
public void lockInterruptibly()方法的使用
作用是当某个线程尝试获得锁并且阻塞在lockInterruptibly()方法时,该线程可以中断
public boolean tryLock()方法的使用
作用是嗅探拿锁,如果当前线程发现锁被其他线程持有了,则返回false,程序继续执行后面的代码,而不是呈阻塞等待锁的状态
public boolean await(long time, TimeUnit unit)方法的使用
作用是具有自动唤醒线程的功能
public long awaitNanos(long nanosTimeout)方法的使用
具有自动唤醒线程的功能,时间单位是纳秒
public boolean awaitUntil(Date deadline)方法的使用
作用是在指定的Date结束等待
public void awaitUnininterruptibly()方法的使用
作用是实现线程在等待的过程中,不允许被中断
使用ReentrantReadWriteLock类
ReentrantLock类的缺点
与ReentrantReadWriteLock类相比,ReentrantLock类的主要缺点是使用ReentrantLock对象时,所有的操作都同步,哪怕只对实例变量进行读取操作,这样会耗费大量的时间,降低运行效率