【问题标题】:Check the Lock on an object in java在java中检查对象的锁定
【发布时间】:2014-06-23 13:33:33
【问题描述】:

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

【问题讨论】:

  • 对于普通锁,是的。我同意这种做法。
  • @JosefE。我可以通过使用 t1 和 olc 实例来检查 main 方法中对象的锁定吗?
  • 我不明白你在问什么。请澄清。
  • 如果没有本地代码,您将无法获得对具有锁的线程的引用。
  • 同步块永远不会锁定类或对象。它只防止另一个线程进入在同一个锁上同步的代码块。阅读docs.oracle.com/javase/tutorial/essential/concurrency/…

标签: java multithreading locking sleep synchronized


【解决方案1】:

我如何检查对象是否已锁定主要方法并检查静态方法的锁定?

对象没有被锁定方法。它只是被锁定了。时期。 Java 的synchronized 关键字的实用性是不允许两个线程同时在同一个对象上同步。


询问其他线程是否锁定了对象通常没有意义。 Thread.holdsLock(foo) 方法不会告诉你:它只告诉 调用 线程是否有 foo 锁定。假设一个方法Thread.otherThreadHoldsLock(foo),并且假设你这样称呼它:

Object foo = ...;

if (Thread.otherThreadHasLocked(foo)) {
    doSomething();
} else {
    doSomethingElse();
}

它没有为您提供任何有用的信息:此代码可以调用 doSomething() 锁定 foo 或未锁定 foo;它可以在 foo 锁定或 foo 未锁定的情况下调用 doSomethingElse()。不能保证,因为另一个线程可以随时获取锁或释放锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多