簡體   English   中英

在Java中檢查對對象的鎖定

[英]Check the Lock on an object in java

我想檢查該類對象上的鎖。 Thread.holdsLock(this)使用Thread.holdsLock(this) 這是正確的方法嗎?

我的問題是我如何才能檢查對象是否為main方法鎖定,以及如何檢查靜態方法的鎖定。

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

如何檢查對象的main方法是否已鎖定,以及如何檢查靜態方法的鎖定?

沒有為方法鎖定對象。 它只是被鎖住了。 期。 Java的synchronized關鍵字的實用程序是,永遠不允許兩個線程同時在同一個對象上進行同步。


詢問其他線程是否已鎖定對象通常沒有任何意義。 Thread.holdsLock(foo)方法不會告訴您:它僅告訴調用線程是否已將foo鎖定。 假設一個方法, Thread.otherThreadHoldsLock(foo) ,並假設你稱它是這樣的:

Object foo = ...;

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

它沒有提供任何有用的信息:此代碼可以在foo鎖定或foo不鎖定的情況下調用doSomething(); 並且可以在foo鎖定或foo未鎖定的情況下調用doSomethingElse()。 不能保證,因為另一個線程可以隨時獲取鎖或釋放鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM