检查java中对象的锁定

时间:2014-06-23 13:33:33

标签: java multithreading locking sleep synchronized

我想检查一下该类对象的锁定。我为此使用了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

1 个答案:

答案 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()。没有保证,因为另一个线程可以随时获得锁定或释放锁定。