次のように 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」によってのみ呼び出されます。
このクラスが次のようにスレッドセーフであることを理解しているのは正しいですか。
マップへの参照は final と宣言されているため、他のすべてのスレッドはマップの初期状態を参照します (happens-before が確立されます)。
put/get/printMap/etc は Thread2 によってのみ呼び出されるため、相互排除の必要はありません。
ありがとうございました