java - 从 Hashmap 中同时添加或删除元素并实现同步

标签 java concurrency hashmap

我是 Java 和并发方面的新手。

作业的目的是学习并发。 - 因此,在回答这个问题时,请记住,我应该只使用 Hashmap(本质上不同步)并自己同步它。如果您提供更多知识,我们将不胜感激,但不是必需的。

我声明了一个这样的 HashMap :

private HashMap<String, Flight> flights = new  HashMap<>();

recordID 是要删除的航类的键。

Flight flightObj = flights.get(recordID);

synchronized(flightObj){
                    Flight deletedFlight = flights.remove(recordID);
                    editResponse = "Flight with flight ID " + deletedFlight.getFlightID() +" deleted successfully";
                    return editResponse;
                }

现在我的疑问:基于flightObj进行同步可以吗?

<小时/>

疑点2:

Flight newFlight = new Flight(FlightServerImpl.createFlightID());
flights.put(newFlight.getFlightID(),newFlight); 

如果我使用上面的代码创建 Flightt,并且如果超过 1 个线程尝试执行此代码,是否会出现数据一致性问题?为什么或为什么不?

提前致谢。

最佳答案

快速回答您的问题:

两者都不好 - 你不能并行删除两个不同的对象,也不能并行添加两个不同的对象。

来自java documentation :

If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedMap method. This is best done at creation time, to prevent accidental unsynchronized access to the map:

因此,许多线程可以同时使用 get 甚至替换对象的 put

但是如果您删除或添加新对象 - 您需要在调用任何 hashmap 函数之前进行同步。

在这种情况下,您可以按照文档中的建议进行操作并使用全局锁。但是,似乎由于仍然允许一些有限的并发性,您可以通过使用 read/write lock 来获得该并发性。 .

关于java - 从 Hashmap 中同时添加或删除元素并实现同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40415538/

相关文章:

testing - golang中如何测试并发和锁?

c - 如何实现固定大小的 HashMap ?

java - 如何创建以二进制形式保存 528 位记录的 HashMap

java - Blackberry java,使用同步从非 UI 线程打开对话框

java - 在不卡住主线程的情况下在 Espresso Android 中进行延迟测试

java - FFT 实现

Java IDE Dialox Box 被遮挡(Ubuntu 上的 Intellij)

concurrency - 维护打开的 websocket 连接列表的最佳方法是什么?

快速调用没有返回值的异步函数

java - 如何让这个 HashMap<Integer[], Integer> 按照我想要的方式工作?