[英]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.