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

Car*_*ndo 3 java concurrency singleton

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

class data
{
      Color sun = "WHITE";
      String luminance = "HIGH";
      int age = 25;
      double speed = 52.5
      ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

aio*_*obe 5

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

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

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

选项1

如果你有足够的内存,你可以简单地拥有一个Object[] locks = new Object[1000];你获得锁定.

public void setColor(Color newCol) {
    synchronized (locks[17]) {
        sun = newCol;
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2

另一种选择可能是将所有字段标记为volatile.这至少可以确保以原子方式执行读写操作.

选项3

看一看AtomicLong,AtomicReference,AtomicBoolean,...等的java.util.concurrent.atomic包装.