导航

Lock(2)

Posted on 2017-09-06 08:51  Young哥哥  阅读(119)  评论(0)    收藏  举报

 

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()方法来进行尝试加锁,只有该锁未被其他线程持有的基础上,才会成功加锁。