对象级锁定是线程安全的吗?



我已经在对象级别实现了访问设备的锁定:

private static Object device_locker_ = new Object();
public Device getDevice() {
synchronized (device_locker_) {
return device_;
}
}

在这种情况下,不同的线程可以使用the device,通过getDevice()调用不同的方法吗?例子:

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

所有线程使用定义了getDevice()方法的类的一个实例。

在这种情况下,是否保证只有一个线程可以使用设备?

在这种情况下,不同的线程可以与设备一起工作,调用不同的方法通过getDevice()?例子:

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

。不同的线程不能安全地使用同一个实例getDevice()返回,因为(基于我假设的方法名称)由getDevice()返回的实例的内容正在这些方法中被修改(例如。changePIN())。

:

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

only保证持有device_locker_锁的线程中只有一个线程可以访问synchronized(device_locker_ )子句中的代码。如果您将对象泄漏到外部,则该对象超出了synchronized子句的作用域,因此可以由多线程以非线程安全的方式访问。就像当你在家的时候,你的屋顶可以为你挡风,但是如果你出去了,你就只能靠你自己了。

所有线程都使用类的一个实例()方法被定义

是否保证在这种情况下只有一个线程可以使用设备?

这没关系,只要getDevice返回线程间共享的相同对象内存引用,如果不采取适当的注意措施(例如:),就存在竞争条件和数据竞争的风险。,确保对共享资源的访问互斥)。

同步只读方法的意义是什么?当设备对象的状态发生变化时,你应该同步这些块/方法。

最新更新