Thread提供了holdLock()方法检测当前线程是否持有锁,注意,是当前线程.
package com.util.concurrent.thread;
/**
* @program: javabase
* @description: 检测线程是否持有锁
* @author: Mr.lgj
* @version:
* @See:
* @create: 2018-07-17 16:50
**/
public class CheckHoldsLockDemo extends Thread {
private CheckHoldsLockService service;
private CheckHoldsLockDemo(CheckHoldsLockService service){
this.service = service;
}
public static void main(String[] args){
Object lock = new Object();
CheckHoldsLockService service = new CheckHoldsLockService(lock);
CheckHoldsLockDemo demo = new CheckHoldsLockDemo(service);
demo.start();
try{
Thread.sleep(100);
}catch (Exception ex){
}
System.out.println("主线程检测 lock = " + Thread.holdsLock(lock) + " " + System.currentTimeMillis() );
try{
Thread.sleep(2000);
}catch (Exception ex){
}
System.out.println("主线程检测 lock = " + Thread.holdsLock(lock) + " " + System.currentTimeMillis());
}
@Override
public void run() {
super.run();
service.task();
}
}
子线程运行的任务
class CheckHoldsLockService{
private Object lock;
public CheckHoldsLockService(Object lock){
this.lock = lock;
}
public void task(){
synchronized(lock){
System.out.println("进入task同步块 :" + System.currentTimeMillis());
System.out.println("新线程检测 lock = " + Thread.holdsLock(lock));
try{
Thread.sleep(1500);
}catch (Exception ex){
}
}
System.out.println("退出task同步块 :" + System.currentTimeMillis());
System.out.println("新线程检测 lock = " + Thread.holdsLock(lock));
}
}
输出
进入task同步块 :1531818921508
新线程检测 lock = true
主线程检测 lock = false 1531818921608
退出task同步块 :1531818923009
新线程检测 lock = false
主线程检测 lock = false 1531818923609
程序在主线程和新线程任务中都使用了Thread.holdsLock(lock)来检测线程是否持有锁.主线程两次调用都为false,因此该方法只能检测当前的线程所持有锁的情况.