簡體   English   中英

如何使用Lock指定要在Java中鎖定的對象

[英]How to specify an object to be locked in java using Lock

使用synced(intrinsiclocking)關鍵字進行鎖定,我們可以執行以下操作:

public void addSum(int a) {
   synchronized(q) {
     q.add(a); // q is say a Queue
   }
}

在上面的代碼中,當對象嘗試調用addSum()方法iexaddSum(10)時,鎖將保留在“ q”而不是x上。 因此,使用同步我們可以鎖定與實際調用對象(類)不同的對象。

下面我從Java並發包中使用Lock,有一種方法可以指定應該在哪個對象上鎖定(例如,在上面的使用同步代碼的代碼段中,已指定鎖定/同步應該在“ q”上)。 但是下面在我使用Lock時,我沒有指定應該在哪個對象上啟用該鎖。 能做到嗎

public void addSum(int a) {
   lock.tryLock();
   q.add(a);
   lock.unlock();
 }

我確實參考了-http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html 但是,正在尋找更小的例子來闡明我的概念。

不, Lock對象的工作方式與synchronized工作方式不同。 synchronized不能在方法調用內啟動,也不能到達該方法調用之外。 您顯示的圖案

lock.tryLock();
q.add(a);
lock.unlock();

只有在相反情況成立的情況下才有可能。 Lock對象通常通過原子地打開/關閉開關/標志來工作,表明它們已獲取或釋放了鎖定。

我認為您誤解了“鎖”一詞的含義。 假設此方法稱為:

void foobar() {
    synchronized(x) {
        y.doSomething();
    }
}

我們說x在線程處於y.doSomething()調用中時被“鎖定”,但這並不能防止其他線程訪問x字段或更新x字段。 synchronized關鍵字意味着一件事,而只有一件事。

JVM不允許兩個線程同時在同一個對象上同步。

這就是全部 如何使用取決於您自己。 我的示例使用它來防止y.doSomething()在多個線程中調用y.doSomething() ,但只有在每次對y.doSomething()調用都以相同的方式受到保護的情況下,它才有效,並且僅當x始終引用相同的對象。

java.util.concurrent.ReentrantLock類的工作方式大致相同。 JVM的唯一保證是沒有兩個線程可以同時“鎖定”相同的ReentrantLock對象。 這就是全部。 其余的取決於您。


PS,您的第二個示例不測試lock.tryLock()返回的值。 錯了 如果lock.tryLock()返回false,則表示無法鎖定該鎖。

暫無
暫無

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

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