これはほとんどスレッドセーフです (そのようなものがある場合)。hashMap
足りないのは、フィールドを宣言することだけですfinal
。これにより、マップの安全な公開が保証されます。
それ以外には、問題はありません(スレッドセーフに関して)。ConcurrentHashMapはスレッド セーフであるため、バイト配列の格納と取得も同様に行う必要があります。
また、バイト配列は常にコピーするため、マップに格納されているものを除いて、スレッド間で共有されることはありません。はConcurrentHashMap
それらをすべてのスレッドに安全に公開し、変更されることはない (事実上不変であることを意味する) ため、スレッドの安全性が保証されます。
最後に、コメントに基づいて、他のいくつかの側面に関する改良版を次に示します。
private final ConcurrentHashMap<String, Object> hashMap =
new ConcurrentHashMap<String, Object> ();
void setByteArray(String string, byte[] byteArray) {
hashMap.put(string, byteArray.clone());
}
byte[] getByteArray(String string) {
Object result = hashMap.get(string);
if(result == null)
return null;
else
return ((byte[]) result).clone();
}
最初は のprivate
修飾子であるためhashMap
、サブクラスは他のオブジェクト (共有バイト配列など) を格納できません。
2 つ目は、ゲッターでの null チェックです。要件に基づいて、または別のものreturn null;
に置き換えたい場合があります。throw new IllegalArgumentException();