gpt4 book ai didi

java - 单例的同步(哈希)映射

转载 作者:行者123 更新时间:2023-12-01 22:03:39 30 4
gpt4 key购买 nike

代码下方的说明...

// 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 对象 - 因此稍后检索它以供自己使用

我的问题...

  • 当第一个线程插入新的 Account 对象时,如何让其他线程(第二个、第三个等)等待?
  • 换句话来说,在读取 HashMap 中的同一个 uniqueID 键时,永远不应该有 2 个线程接收到 null 值。第一个线程可能会收到 null 值,但第二个线程应该检索第一个线程放置在那里的 Account 对象。

最佳答案

根据 synchronizedMap() 的文档

Returns a synchronized (thread-safe) map backed by the specified map. In order to guarantee serial access, it is critical that all access to the backing map is accomplished through the returned map.

It is imperative that the user manually synchronize on the returned map when iterating over any of its collection views

换句话说,您仍然需要对 SHARED_ACCOUNT_HASHMAP 具有同步访问权限:

public init(String[] credentials) {
Account account = null;
String uniqueID = uniqueAccountIdentifier(credentials);

synchronized (SHARED_ACCOUNT_HASHMAP) {
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);
}
}
}

关于java - 单例的同步(哈希)映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33228449/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com