簡體   English   中英

對象級鎖定是線程安全的嗎?

[英]Object-level locking is it thread-safe?

我已經在 object 級別實現了鎖定以訪問設備:

private static Object device_locker_ = new Object();

public Device getDevice() {
 synchronized (device_locker_) {
    return device_;
 }
}

在這種情況下,不同的線程可以與the device一起工作,通過getDevice()調用不同的方法嗎? 例子:

getDevice().getDeviceInfo()
getDevice().changePIN()
getDevice().doSomething()

所有線程都使用 class 的一個實例,其中定義了 getDevice () 方法。

在這種情況下是否保證只有一個線程可以與設備一起使用?

在這種情況下,不同的線程可以與設備一起工作,通過 getDevice() 調用不同的方法嗎? 例子:

getDevice().getDeviceInfo()
getDevice().changePIN()
getDevice().doSomething()

不,不同的線程不能安全地使用getDevice()返回的同一個實例,因為(基於我假設的方法名稱) getDevice()返回的實例的內容正在這些方法中被修改(例如, changePIN() )。

這個:

public Device getDevice() {
 synchronized (device_locker_) {
    // This is the safe zone
 }
}

保證持有鎖device_locker_的線程中只有一個線程可以訪問synchronized(device_locker_ )子句中的代碼。 如果您將 object 泄漏到外部,則 object 不在synchronized子句的 scope 之外,因此可以由多線程以非線程安全的方式訪問。 就像您在家時,您的屋頂可以保護您免受雨淋,但如果您在室外 go,那么您就屬於自己了。

所有線程都使用 class 的一個實例,其中定義了 getDevice () 方法。

在這種情況下是否保證只有一個線程可以與設備一起使用?

沒關系,只要getDevice返回相同的 Object memory 引用,線程之間共享,如果不采取適當的措施(例如,確保互斥訪問),就會存在競爭條件和數據競爭的風險到共享資源)。

同步只讀方法有什么意義? 您應該同步設備 object 的 state 更改的塊/方法。

暫無
暫無

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

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