これはほとんどスレッドセーフです (そのようなものがある場合)。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();