我想检查一下该类对象的锁定。我为此使用了Thread.holdsLock(this)
。这是正确的方法吗?
我的问题是如何检查对象是否为主方法锁定,还检查静态方法的锁定。
public class CheckLock {
public static void main(String[] args) throws InterruptedException {
objectLockClass olc= new objectLockClass();
Thread t1=new Thread(olc);
t1.start();
}
}
class objectLockClass implements Runnable {
@Override
public void run() {
boolean isLocked = true;
int counter=0;
synchronized (this) {
while (isLocked) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("lock object in run : " + Thread.holdsLock(this));
if (counter==5 ) isLocked=false;
counter++;
}
}
输出结果为:
lock object in run : true
lock object in run : true
lock object in run : true
lock object in run : true
lock object in run : true
lock object in run : true
答案 0 :(得分:0)
如何检查对象是否为主方法锁定,还检查静态方法的锁定?
某个对象未锁定以获取方法。它被锁定了。期。 Java synchronized
关键字的实用性是,不允许两个线程同时在同一个对象上同步。
询问某个其他线程是否锁定了对象通常没有意义。 Thread.holdsLock(foo)
方法不会告诉您:它只会告诉调用线程是否已锁定foo。假设是方法Thread.otherThreadHoldsLock(foo)
,并假设您这样称呼它:
Object foo = ...;
if (Thread.otherThreadHasLocked(foo)) {
doSomething();
} else {
doSomethingElse();
}
它没有为您提供任何有用的信息:此代码可以在foo锁定或foo未锁定的情况下调用doSomething();并且可以在foo锁定或foo未锁定的情况下调用doSomethingElse()。没有保证,因为另一个线程可以随时获得锁定或释放锁定。