Java синхронизирует статический список? - PullRequest
0 голосов
/ 16 января 2011

В классе Java у меня есть статический список, поэтому этот список является общим для всех объектов этого класса. Бизнес-логика в этом классе будет периодически выполняться, которая вызывается каким-либо методом без передачи параметров экземпляра. Теперь яЯ хочу вызвать этот метод запуска на основе списка (я добавлю несколько значений в этот список на основе JMS), этот список может иногда пустовать, и после завершения запуска я очищаю этот список. Теперь мой вопрос заключается в том, нужно ли мнесинхронизировать этот список или нет?

Также дайте мне знать, есть ли другой способ передать значение в одном экземпляре объекта (Thread1) другому экземпляру объекта (Thread2), кроме наличия статической переменной (статического списка)?

Thx

Ответы [ 5 ]

1 голос
/ 16 января 2011

Также дайте мне знать, есть ли другой способ передать значение в одном экземпляре объекта (Thread1) другому экземпляру объекта (Thread2), кроме наличия статической переменной (статический список)?

экземпляр объекта (Thread1) для другого экземпляра объекта (Thread2) -> Требуется статическая переменная, поскольку экземпляры объекта различны. Однако, как вы знаете, если Thread1 и Thread2 работают с одними и теми же объектами, переменные экземпляра класса будут разделены между потоками. Поэтому нет необходимости делать их статичными.

1 голос
/ 16 января 2011

Если есть какая-либо возможность доступа и / или обновления из разных потоков, то вам нужно синхронизировать эти операции.

Или, иначе говоря, только , когдаВы можете обойтись без операций синхронизации в списке, когда:

  • существует только один поток, который может получить доступ к списку или обновить его, или
  • список создан, инициализирован, упакованв неизменяемой оболочке списка и безопасно публикуется одним потоком ... и затем никогда не обновляется.

Также дайте мне знать, есть ли другой способ передачи значения в одном экземпляре объекта(Thread1) к другому экземпляру объекта (Thread2), кроме наличия статической переменной (статический список)?

Есть много способов.Например:

  • Вы можете договориться, что исполняемый файл thread2 имеет общедоступный установщик, который запускаемый поток thread1 может использовать для передачи значения в thread2.Это требует некоторой дополнительной синхронизации.

  • Вы можете организовать создание экземпляров thread1 и thread2 совместно используемым объектом или объектами, которые можно использовать для передачи потока вперед и назад.Если объект является очередью общего назначения (синхронизированной) или каналом или чем-то еще, потокам не потребуется выполнять какую-либо явную синхронизацию.

1 голос
/ 16 января 2011

вам нужно будет либо синхронизировать все операции чтения и записи в этот список, либо использовать многопоточный способный список (например, CopyOnWriteArrayList или даже ConcurrentMap, если вы используете его для более сложных вещей).

В противном случае вам потребуется хороший контроль параллелизма, чтобы разные потоки не перезаписывали друг друга, а также чтобы другие потоки могли видеть изменения, которые были внесены.

повторное редактирование: лучший способ передачи данных между потоками - это разделение структуры данных. Статические переменные - это один из способов, но это не единственный способ поделиться. Вы можете поделиться через общий объект, который передается в обоих потоках (например, в конструкторе). Обычно это называется очередью, в которую записывает один поток, а другие - из. В Java есть несколько блокирующих очередей, чтобы сделать это проще - посмотрите множество различных классов в этом пакете http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html

1 голос
/ 16 января 2011

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

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

0 голосов
/ 17 января 2011

Также дайте мне знать, есть ли другой способ передать значение в одном экземпляре объекта (Thread1) другому экземпляру объекта (Thread2), кроме наличия статической переменной (статический список)?

Вот два разных метода, которые могут избежать использования статической переменной здесь. Там может быть больше.

Метод № 1

class A implements Runnable {
  final Object x;
  public A (Object _x) {
    x = _x;
  }
  ...
}

// elsewhere .. hopefully from a NON-STATIC context
// where theObjectToShare is available
A th1 = new Thread(new A(theObjectToShare));
...

А метод № 2А / В:

object parentMemberVariable = ...;

function runStuff () {
  object _localFinal = parentMemberVariable;
  A th1 = new Thread(new Runnable {
    public void Run () {
      // NON-STATIC inner classes (including anonymous) can access
      // parents member variables. this is because there are created
      // "in the context of" the parent class.
      // This could also be done for the normal inner Runnables.
      foo(parentMemberVariable);
      // anonymous classes can also access final variables
      // in scope at declaration
      foo(_localFinal);
   }
});

Удачного кодирования.

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