Java并发:线程之间的共享内存

时间:2010-11-18 22:47:23

标签: java concurrency singleton

假设我有一个Singleton类(任何类都可以获取实例):

class data
{
      Color sun = "WHITE";
      String luminance = "HIGH";
      int age = 25;
      double speed = 52.5
      ...
}

假设我有几个线程来获取对此类的Singleton实例的引用。我试图找出一种在PER FIELD基础上同步获取/设置的方法。

如果我为每个变量都有一个synchronized getter / setter方法,那么在设置该方法之前,这将基本上“锁定”整个类(而不是单个字段)。

有没有办法让这些线程只锁定实例值而不是锁定整个类?

- 编辑:我为巨大的一个对象数据道歉。

数据实际上存储在几个类中。每个对象最多只有20-25个成员。

1 个答案:

答案 0 :(得分:5)

  

如果我为每个变量都有一个同步的getter / setter方法,那么这将基本上“锁定”整个类(而不是单个字段),直到设置该方法。

嗯,不。它将锁定整个对象,但这可能就是你的意思......

  

数据有1000多个变量......

选项1

如果你有足够的内存,你只需拥有一个Object[] locks = new Object[1000];就可以获得锁定。

public void setColor(Color newCol) {
    synchronized (locks[17]) {
        sun = newCol;
    }
}

选项2

另一个选项可能是将所有字段标记为volatile。这至少可以确保读取和写入以原子方式执行。

选项3

java.util.concurrent.atomic package中查看AtomicLongAtomicReferenceAtomicBoolean,...等等。