безопасность потока массива Java - PullRequest
2 голосов
/ 17 сентября 2010

ArrayList в Java является поточно-ориентированным. И он реализован с использованием массива.

Итак, безопасен ли доступ к массивам в Java-потоке? Нужно ли синхронизировать доступ к массивам?

Ответы [ 3 ]

7 голосов
/ 17 сентября 2010

Нет, ArrayList не поточно-ориентированный в Java.

Из документов :

Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно получают доступ к экземпляру ArrayList, и хотя бы один из потоков структурно изменяет список, он должен быть синхронизирован извне.Вы думаете о Vector, который использует внутреннюю синхронизацию?(Каждый метод синхронизирован, в основном.)

1 голос
/ 18 сентября 2010

Модели памяти Java рассматривают каждый элемент массива как отдельную переменную. У вас могут быть небезопасные действия с такой переменной, как и с любыми другими переменными.

Сам массив довольно безопасен для потоков.

static Object[] a;

// thread 1
a = new Object[10];

// thread 2
read a.length // ok  
read a[0]     // ok
a[0] = something   // ok

В чем дело? Например, если вы используете ArrayList, такие действия небезопасны без надлежащей синхронизации

static ArrayList a;

// thread 1
a = new ArrayList( another_collection_with_10_null );

// thread 2
a.size();  // unsafe
a.get(0);  // unsafe
a.set(0, something); // unsafe

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

1 голос
/ 17 сентября 2010

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

Предположим, ваш код имеет

  int x = a[2];
  a[3] = x;

Безопасен ли этот поток?(Подсказка: возможно, нет, зависит от того, насколько непротиворечивы вы хотите, чтобы [2] и [3] были).

В общем: начните с явно поточно-ориентированного потока.Поставьте синхронизацию - это не так дорого.Действительно подумайте о семантике, которую вы имеете в виду.Протестируйте его и выведите из тупика - если у вас есть такие проблемы, вы, возможно, даже не подумали о том, что вы пытаетесь сделать достаточно четко.Только если ваши тесты производительности действительно показывают, что это будет вашим узким местом, начинайте становиться умнее.

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