Предположим, что у меня есть класс, который обертывает HashMap следующим образом:
public final class MyClass{
private final Map<String, String> map;
//Called by Thread1
public MyClass( int size ){
this.map = new HashMap<String, String>( size );
}
//Only ever called by Thread2
public final String put( String key, String val ){
return map.put( key, value );
}
//Only ever called by Thread2
public final String get( String key ){
return map.get( key );
}
//Only ever called by Thread2
public final void printMap( ){
//Format and print the contents of the map
}
}
Этот класс инициализируется через "Thread1". Тем не менее, put, get, printMap и другие операции только когда-либо, вызываемые "Thread2".
Я правильно понимаю, что этот класс является потокобезопасным как:
-
Поскольку ссылка на карту объявлена окончательной, все остальные потоки будут видеть начальное состояние карты (происходит-до этого установлено).
-
Так как put/get/printMap/etc вызывается только Thread2, нет необходимости в взаимном исключении.
Спасибо