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