Lock对象除了有给当前对象加锁的功能,还有一系列的方法可以使用,下面逐一学习。
getHoldCount():查询当前线程保持此锁定的个数
package com.lenovo.plm.dms.p18;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private ReentrantLock lock = new ReentrantLock();
public void service1(){
lock.lock();
System.out.println("service1 getHoldCount:"+lock.getHoldCount());
service2();
lock.unlock();
}
public void service2(){
lock.lock();
System.out.println("service2 getHoldCount:"+lock.getHoldCount());
lock.unlock();
}
public static void main(String[] args) {
Service service = new Service();
service.service1();
}
}
执行结果如下:
service1 getHoldCount:1
service2 getHoldCount:2
getQueueLength():取得正在等待此锁定的线程数量
package com.lenovo.plm.dms.p19;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
public ReentrantLock lock = new ReentrantLock();
public void service(){
lock.lock();
System.out.println(Thread.currentThread().getName() + " come in the method");
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
package com.lenovo.plm.dms.p19;
public class Main {
public static void main(String[] args) {
final Service service = new Service();
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
service.service();
}
};
Thread[] threadArray = new Thread[10];
for(int i = 0;i<10;i++){
threadArray[i] = new Thread(runnable);
}
for(int i = 0;i<10;i++){
threadArray[i].start();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(service.lock.getQueueLength());
}
}
运行结果如下:
Thread-0 come in the method
9
getWaitQueueLength(Condition condition):取得等待此锁相关给定条件condition的线程数量。
package com.lenovo.plm.dms.p20;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void waitMethod(){
lock.lock();
try {
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void signalMethod(){
lock.lock();
System.out.println("There are " + lock.getWaitQueueLength(condition) + " waiting condition");
condition.signal();
System.out.println("There are " + lock.getWaitQueueLength(condition) + " waiting condition");
lock.unlock();
}
}
package com.lenovo.plm.dms.p20;
public class Main {
public static void main(String[] args) {
final Service service = new Service();
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
service.waitMethod();
}
};
Thread[] threadArray = new Thread[10];
for(int i = 0;i<10;i++){
threadArray[i] = new Thread(runnable);
}
for(int i=0;i<10;i++){
threadArray[i].start();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
service.signalMethod();
}
}
运行结果如下:
There are 10 waiting condition
There are 9 waiting condition