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

3
假设我有一个单例类(任何类都可以获取该实例):
class data
{
      Color sun = "WHITE";
      String luminance = "HIGH";
      int age = 25;
      double speed = 52.5
      ...
}

假设我有几个线程获取此类的单例实例的引用。 我正在尝试找出一种按每个字段同步获取/设置的方法。 如果我为每个变量都有一个同步的getter/setter方法,那么这将基本上“锁定”整个类(而不是单个字段),直到该方法被设置。 有没有一种方法,使这些线程仅锁定实例值而不是锁定整个类?
-编辑:对于巨大的一个对象数据,我感到抱歉。 实际上,数据存储在多个类中。 最多每个对象只有20-25个成员。

3
我感觉我的头要爆炸了。你可不可以只是减少可变性?例如,删除锁定巨大的整体对象的需求。 - user166390
4
考虑到这件事情,我的脸都融化了。 - MattC
1
你确定如果只使用一个锁会存在性能瓶颈吗?请注意,您可以在大约2毫秒内跨多个线程锁定一个对象1000次。基本上,在使应用程序更加复杂之前,您是否已经测量了这个瓶颈,还是只是猜测? - Peter Lawrey
2
我为那些将来要维护这个类的人感到悲哀。 - Alexander Pogrebnyak
你有一个单一的类维护1000个不相关的全局可变变量。你还担心并发性能? - Jed Wesley-Smith
显示剩余2条评论
1个回答

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 包中的AtomicLongAtomicReferenceAtomicBoolean等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接