假设我有一个Singleton类(任何类都可以获取实例):
class data
{
Color sun = "WHITE";
String luminance = "HIGH";
int age = 25;
double speed = 52.5
...
}
假设我有几个线程来获取对此类的Singleton实例的引用。我试图找出一种在PER FIELD基础上同步获取/设置的方法。
如果我为每个变量都有一个synchronized getter / setter方法,那么在设置该方法之前,这将基本上“锁定”整个类(而不是单个字段)。
有没有办法让这些线程只锁定实例值而不是锁定整个类?
- 编辑:我为巨大的一个对象数据道歉。
数据实际上存储在几个类中。每个对象最多只有20-25个成员。
答案 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中查看AtomicLong
,AtomicReference
,AtomicBoolean
,...等等。