В следующем гипотетическом сценарии и из желания лучше понять язык, является летучим, необходимым для int [] ссылка?Неувядаем здесь?
public final class SO {
private int[] ar = new int[10]; // is volatile needed here?
private int idx = 0;
public synchronized int get(int i) {
return ar[i];
}
public synchronized void append(final int val) {
if (idx == ar.length) {
// array is too small, let's grow it
final int[] prev = ar;
ar = new int[ar.length+ar.length*20/100]
System.arrayCopy(prev, 0, ar, 0, prev.length);
}
ar[idx++] = val;
}
}
Единственный способ извлечь в Int является корытом синхронизированного метода и единственным способом изменить Int [] (включая создание нового Int []) также делается желоб синхронизированный метод.
Мне не нужно добавлять дополнительную синхронизацию справа?
Вы отметили это как примитивное, но на самом деле int [] является объектом, поскольку он представляет собой массив java. – wmorrison365
Выполнение 'ar' volatile только присваивает' ar' (не элемент внутри него) volatile write –
'ar.length + ar.length * 20/100' =' ar.length * 6/5' –