gpt4 book ai didi

Java 哈希表并发

转载 作者:行者123 更新时间:2023-11-29 09:44:52 27 4
gpt4 key购买 nike

我有一个 Java 代码,它通过以下方式在哈希表中搜索值:

class HTDemo {
public static void main(String args[]) {
Hashtable balance = new Hashtable();
double bal;
balance.put("John Doe", new Double(3434.34));
balance.put("Tom Smith", new Double(123.22));
balance.put("Jane Baker", new Double(1378.00));
balance.put("Todd Hall", new Double(99.22));
balance.put("Ralph Smith", new Double(-19.08));

**System.out.println("John Doe's balance: " + balance.get("John Doe"));**
**System.out.println("Tom Smith's balance: " + balance.get("Tom Smith"));**
**System.out.println("Jane Baker's balance: " + balance.get("Jane Baker"));**
}
}

现在,我想在多线程上运行它,即我想以这种方式修改代码,以便 get 方法(在 ** 内)同时工作。谁能帮我怎么做。实际上,我在传递哈希表并使其在运行时并发时遇到了问题。

最佳答案

哈希表是同步的,因此已经是线程安全的。您不需要任何其他东西即可在多线程环境中安全地访问您的代码。

但是,HashTable已经过时了,由于实现了线程安全机制(所有方法都是同步的),并且提供的迭代器不是线程安全的,如果你修改它会失败,因此在高并发环境下它的性能会很差迭代时的表。

底线:使用 ConcurrentHashMap,如果可以的话使用泛型:

Map<String, Double> balance = new ConcurrentHashMap<String, Double> ();

您的其余代码应保持不变。

您还需要记住的一件事是,即使使用线程安全的数据结构(无论是 HashTable 还是 ConcurrentMap),您仍然需要处理并发问题,例如 atiomcity。

例如,如果您检查余额以授权这样的付款:

double johnBalance = balance.get("John");
if(johnBalance > paymentAmount)
authorisePayment();
else
declinePayment();

存在一个原子性问题:在调用 balance.get(...) 和支付授权之间,John 的账户余额可能发生了变化。

如果这是您的一个用例,您将需要引入一个额外的同步层。

关于Java 哈希表并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11710782/

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