我知道synchronize在方法之前使用关键字会为该对象带来同步.也就是说,将同步运行相同对象实例的2个线程.
但是,由于同步是在对象级别,因此将不会同步运行该对象的不同实例的2个线程.如果我们在由该方法调用的Java类中有一个静态变量,我们希望它在该类的实例之间进行同步.这两个实例在两个不同的线程中运行.
我们可以通过以下方式实现同步吗?
public class Test
{
private static int count = 0;
private static final Object lock= new Object();
public synchronized void foo()
{
synchronized(lock)
{
count++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
是不是因为我们已经定义了一个lock静态的对象并且我们正在使用该synchronized锁的关键字,所以静态变量count现在在类的实例之间同步Test?
Dalvik的内存模型与Java相同吗?我特别感兴趣的是否读取和写入参考和非long/非double原始变量是原子,但我也想知道有没有这两个平台的内存模型之间的差异.
根据许多人的说法,除非你运行1.5或更高版本并使用volatile关键字,否则java会破坏一些常见的Double-Checked Locking成语.
一个破损的双重检查锁定样本:
// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = new Helper();
}
return helper;
}
// other functions and members...
}
Run Code Online (Sandbox Code Playgroud)
该示例来自本文,其中还提供了有关如何修复它的详细信息:http: //www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Pugh上面的分析是针对Java VM的.我在Android上工作并经常使用采用Double-Checked Locking的库.dalvik VM的内存模型是否支持这个习惯用法?