Я знаю, что этот вопрос звучит безумно, но рассмотрим следующие фрагменты Java:
Часть - I:
class Consumer implements Runnable{
private boolean shouldTerminate = false
public void run() {
while( !shouldTerminate ){
//consume and perform some operation.
}
}
public void terminate(){
this.shouldTerminate = true;
}
}
Итак, первый вопрос: нужно ли мне когда-либо синхронизироваться на логическом логическом значении Terminate? Если так, то почему? Я не против пропустить флаг, установленный в true для одного или двух циклов (цикл = 1 выполнение цикла). И, во-вторых, может ли булева переменная когда-либо находиться в несовместимом состоянии (что-либо, кроме true или false)
Часть - II вопроса:
class Cache<K,V> {
private Map<K, V> cache = new HashMap<K, V>();
public V getValue(K key) {
if ( !cache.containsKey(key) ) {
synchronized(this.cache){
V value = loadValue(key)
cache.put(key, value);
}
}
return cache.get(key);
}
}
Должен ли быть синхронизирован доступ ко всей карте? Есть ли возможность, когда два потока пытаются запустить этот метод, с одним «потоком записи» в середине процесса сохранения значения в карте и одновременно «потоком чтения», вызывающим метод «содержит». Это приведет к взрыву JVM? (Я не против перезаписать значения на карте - если два потока записи пытаются загрузить одновременно)