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

Object-level locking is it thread-safe?

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

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() 方法。

在这种情况下是否保证只有一个线程可以与设备一起工作?

Can different threads in this case work with the device, calling different methods through getDevice()? Examples:

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

没有。不同的线程 无法安全地使用 getDevice() 返回的同一个实例 ,因为(基于我假设的方法名称)[=12= 返回的实例的内容] 正在这些方法中进行修改(例如, changePIN())。

这个:

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

only 保证持有锁 device_locker_ 的线程中只有一个线程可以访问 synchronized(device_locker_ ) 子句中的代码。如果将对象泄漏到外部,则该对象超出了 synchronized 子句的范围,因此多线程可以以非线程安全方式访问该对象。就像当你在家时,你的屋顶可以保护你免受雨淋,但如果你出门,那么你就是在自己的屋子里。

All threads work with one instance of the class in which the getDevice () method is defined.

Is it guaranteed in this case that only one thread can work with the device?

没关系,只要 getDevice returns 在线程之间共享相同的对象内存引用,就存在竞争条件和数据竞争的风险,如果适当的话没有注意(例如,确保对共享资源的访问互斥)。

同步只读方法有什么意义?您应该同步 blocks/methods 设备对象状态发生变化的位置。