Class
和instance
之间的差异是同步的。
实例同步作用于Object
的每个实例,所以代码:
public synchronized void putInCache() {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
和代码
public void putInCache() {
synchronized(this) {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
}
在对等同他们不允许超过一个线程进入synchronized块同时;但是,这仅适用于课程上的每个实例。即在显示器上this
类同步作用于Class
本身,下面的两个块也相当于:
public static synchronized void putInCache() {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
public void putInCache() {
synchronized(MyClass.class) {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
}
他们不允许超过一个线程都同时进入synchronized块跨越JVM,即显示器在Class
实例上,因此是独一无二的。
您需要使用Class
同步。
另一种方法是锁定资源本身,因为这是您试图阻止并发访问;提供的资源不能为空和资源的实例不会随意改变 - 甚至更好,如果是final
你可以这样做:
public void putInCache() {
synchronized(cache) {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
}
这使得它非常清楚为什么要锁定和你锁定的东西。
'DataObject'和'MyOtherDataObject'(它扩展了'DataObject')共享一个锁吗?或有单独的? – 2013-02-21 12:58:40