Параллелизм Java: общая память между потоками - PullRequest
3 голосов
/ 19 ноября 2010

Предположим, у меня есть класс Singleton (экземпляр может получить любой класс):

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

Предположим, у меня есть несколько потоков, которые получают ссылку на экземпляр Singleton этого класса.Я пытаюсь выяснить способ синхронизации получает / устанавливает на основе поля.

Если у меня есть синхронизированный метод получения / установки для каждой переменной, то это будет в основном «блокировать» весь класс (а не отдельное поле), пока этот метод не будет установлен.способ, чтобы эти потоки блокировали только значения экземпляров, а не блокировали весь класс?

- РЕДАКТИРОВАТЬ: Я прошу прощения за огромные данные одного объекта.

данные на самом деле хранятся в нескольких классах.Максимум каждый объект имеет только 20-25 членов.

1 Ответ

5 голосов
/ 19 ноября 2010

Если у меня есть синхронизированный метод получения / установки для каждой переменной, то это будет в основном «блокировать» весь класс (вместо отдельного поля), пока этот метод не будет установлен.

Ну нет. Он заблокирует весь объект, но это, вероятно, то, что вы имели в виду в любом случае ...

данные имеют 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...