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

Java 对象级锁定是线程安全的吗?,java,multithreading,parallel-processing,thread-safety,synchronized,Java,Multithreading,Parallel Processing,Thread Safety,Synchronized,我已经在对象级别实现了访问设备的锁定: private static Object device_locker_ = new Object(); public Device getDevice() { synchronized (device_locker_) { return device_; } } 在这种情况下,不同的线程可以通过getDevice()调用不同的方法来处理设备吗?示例: getDevice().getDeviceInfo() getDevice().chan

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

private static Object device_locker_ = new Object();

public Device getDevice() {
 synchronized (device_locker_) {
    return 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
 }
}
仅保证持有锁的线程中只有一个线程可以访问
synchronized(device\u locker)
子句中的代码。如果将对象泄漏到外部,则该对象不在
synchronized
子句的范围内,因此可以由多线程以非线程安全的方式访问。就像你在家一样,你的屋顶可以保护你不受雨淋,但是如果你出去,你就在自己的屋顶上

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

在这种情况下,是否保证只有一个线程可以与 装置


这并不重要,只要
getDevice
返回线程之间共享的相同对象内存引用,如果没有采取适当的措施(例如,确保对共享资源的访问互斥),则存在争用条件和数据争用的风险.

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

解释得很好!