相关疑难解决方法(0)

如何在Java中运行不同类实例的线程之间同步静态变量?

我知道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

java multithreading synchronization class object

119
推荐指数
2
解决办法
16万
查看次数

Dalvik的内存模型与Java相同吗?

Dalvik的内存模型与Java相同吗?我特别感兴趣的是否读取和写入参考和非long/非double原始变量是原子,但我也想知道有没有这两个平台的内存模型之间的差异.

java android memory-model dalvik java-memory-model

30
推荐指数
2
解决办法
4740
查看次数

在Android中双重检查锁定

根据许多人的说法,除非你运行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的内存模型是否支持这个习惯用法?

java android virtual-machine dalvik double-checked-locking

18
推荐指数
1
解决办法
2099
查看次数