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
返回线程之间共享的相同对象内存引用,如果没有采取适当的措施(例如,确保对共享资源的访问互斥),则存在争用条件和数据争用的风险.同步只读方法有什么意义?您应该同步设备对象状态发生变化的块/方法。解释得很好!