1 实现锁的公平
2 获取当前线程调用lock的次数,也就是获取当前线程锁定的个数
3 获取等待锁的线程数
4 查询指定的线程是否等待获取此锁定
5 查询是否有线程等待获取此锁定
6 查询当前线程是否持有锁定
7 判断一个锁是不是被线程持有
8 加锁时如果中断则不加锁,进入异常处理
9 尝试加锁,如果该锁未被其他线程持有的情况下成功
实现公平锁
在实例化锁对象的时候,构造方法有2个,一个是无参构造方法,一个是传入一个boolean变量的构造方法。当传入值为true的时候,该锁为公平锁。默认不传参数是非公平锁。
公平锁:按照线程加锁的顺序来获取锁
非公平锁:随机竞争来得到锁
此外,JAVA还提供isFair()来判断一个锁是不是公平锁。
获取当前线程锁定的个数
Java提供了getHoldCount()方法来获取当前线程的锁定个数。所谓锁定个数就是当前线程调用lock方法的次数。一般一个方法只会调用一个lock方法,但是有可能在同步代码中还有调用了别的方法,那个方法内部有同步代码。这样,getHoldCount()返回值就是大于1。
下面的方法用来判断等待锁的情况
获取等待锁的线程数
Java提供了getQueueLength()方法来得到等待锁释放的线程的个数。
查询指定的线程是否等待获取此锁定
Java提供了hasQueuedThread(Thread thread)查询该Thread是否等待该lock对象的释放。
查询是否有线程等待获取此锁定
同样,Java提供了一个简单判断是否有线程在等待锁释放即hasQueuedThreads()。
下面的方法用来判断持有锁的情况
查询当前线程是否持有锁定
Java不仅提供了判断是否有线程在等待锁释放的方法,还提供了是否当前线程持有锁即isHeldByCurrentThread(),判断当前线程是否有此锁定。
判断一个锁是不是被线程持有
同样,Java提供了简单判断一个锁是不是被一个线程持有,即isLocked()
下面的方法用来实现多种方式加锁
加锁时如果中断则不加锁,进入异常处理
Lock类提供了多种选择的加锁方法,lockInterruptibly()也可以实现加锁,但是当线程被中断的时候,就会加锁失败,进行异常处理阶段。一般这种情况出现在该线程已经被打上interrupted的标记了。
尝试加锁,如果该锁未被其他线程持有的情况下成功
Java提供了tryLock()方法来进行尝试加锁,只有该锁未被其他线程持有的基础上,才会成功加锁。
浙公网安备 33010602011771号