代码之家  ›  专栏  ›  技术社区  ›  Carlo del Mundo

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

  •  3
  • Carlo del Mundo  · 技术社区  · 14 年前

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

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

    假设我有几个线程获得对这个类的单例实例的引用。我正试图找出一种方法来同步每个字段的get/set。

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

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

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

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

    1 回复  |  直到 14 年前
        1
  •  5
  •   aioobe    14 年前

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

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

    数据有1000多个变量。。。

    选择1

    如果你有足够的记忆力,你可以 Object[] locks = new Object[1000]; 你就可以得到锁。

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

    选择2

    另一种选择是将所有字段标记为 volatile . 这将至少确保读取和写入是原子式执行的。

    选择3

    看一看 AtomicLong , AtomicReference , AtomicBoolean , ... 等等 java.util.concurrent.atomic package .