【发布时间】:2016-01-18 15:04:58
【问题描述】:
代码下方的说明...
// Singleton
public static final Map<String, Account> SHARED_ACCOUNT_HASHMAP =
Collections.synchronizedMap(new HashMap<>());
public init(String[] credentials) {
Account account = null;
String uniqueID = uniqueAccountIdentifier(credentials);
if (SHARED_ACCOUNT_HASHMAP.containsKey(uniqueID)) {
account = SHARED_ACCOUNT_HASHMAP.get(uniqueID);
log("...retrieved Shared Account object: %s", uniqueID);
}
// create the Account object (if necessary)
if (account == null) {
account = new Account(credentials);
// Store it in the SHARED_ACCOUNT_HASHMAP
SHARED_ACCOUNT_HASHMAP.put(uniqueID, account);
log("...created Account object: %s",uniqueID);
}
}
我想要达到的目标
- 有多个线程访问此 Singleton HashMap
- 此 HashMap 的目标是只允许为每个 uniqueID 创建一个帐户
- 后面的账号可以被各个线程取回,进行账号操作
- 每个线程都有这个
init()方法并运行一次。 - 因此,第一个找不到现有 uniqueID 帐户的线程创建一个新帐户并将其放置在 HashMap 中。下一个线程发现对于相同的 uniqueID,已经有一个 Account 对象 - 所以稍后检索它以供自己使用
我的问题...
- 如何让其他线程(第二个、第三个等)在第一个线程插入新帐户对象时等待?
- 换一种说法,在读取同一个 uniqueID 键的 HashMap 时,永远不应该有 2 个线程收到 null 值。第一个线程可能会收到 null 值,但第二个线程应该检索第一个放置在那里的 Account 对象。
【问题讨论】:
标签: java multithreading collections hashmap synchronization