2012-06-18 3 views
2
class EverythingMustBeInAClass 
{ 
    private final int i = 42; 
    private final int[] a = {2, 3, 5, 7, 11, 13, 17, 19}; 
} 

Тот факт, что i объявлен final гарантии, что все потоки увидеть то же значение INT 42 (вместо 0).несколько потоков массива доступа

Тот факт, что a объявлен final гарантии, что все потоки увидеть тот же массив ссылочный.

Но как я могу убедиться, что все потоки видят один и тот же массив элементов (вместо 0s)? Нужно ли мне синхронизировать доступ к массиву, даже если я никогда не намерен менять элементы массива позже?

ответ

5

final гарантирует не только то, что ссылка на массив видна, но также и то, что сам объект полностью сконструирован и инициализирован. Таким образом, значения в массиве будут также видны всеми потоками.

Вот хорошая ссылка на эту тему:

http://www.javamex.com/tutorials/synchronization_final.shtml

Цитирую:

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

Тем не менее, важно отметить, что a массив не неизменны так, к примеру, вы можете установить a[0] = 10 и что обновление не будет синхронизирована. Но до тех пор, как вы не изменить любые значения в a вам должно быть хорошо.

1

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

0

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

Смежные вопросы