2010-11-18 86 views
3

假设我有一个Singleton类之间(任何类可以获取实例):Java并发:共享内存线程

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

假设我有几个线程得到这一类的Singleton实例的引用。我试图找出一种方法来同步基于PER FIELD的获取/设置。

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

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

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

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

+3

我觉得我的头会爆炸。你不只是减少可变性?例如。 *删除*锁定巨大的单片icky对象的需要。 – 2010-11-18 22:49:01

+4

我的脸已经融化了,想着这个。 – MattC 2010-11-18 22:51:29

+1

如果您共享一把锁,您是否确定有性能瓶颈?请注意,您可以在大约2 ms内跨多个线程锁定对象1000次。基本上,在你使你的应用程序更加强化之前,你是否测量过这个瓶颈或者你在猜测? – 2010-11-18 23:02:36

回答

5

如果非要为每个变量同步的getter/setter方法,那么这将基本上直到该方法被设置为“锁定”整个类(而不是单独的场)。

那么,没有。它会锁定整个对象,但是这可能是反正你是什么意思?

数据有1000+变量...

选项1

如果你有足够的内存,你可以简单地有一个Object[] locks = new Object[1000];为你获取锁。

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

选项2

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

选项3

看一看AtomicLongAtomicReferenceAtomicBoolean,...等等在java.util.concurrent.atomic package

+0

挥发性是我一直在寻找的。谢谢! – 2010-11-19 14:44:26