Phi*_*lip 0 java multithreading
我正在使用以下内容HashMap:
HashMap<String,String> hm = new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)
Runnable在单独的线程中运行的三个不同的s将从中读取hm,而第四个线程Runnable将在地图中添加和删除键/值条目.根据Java文档,只要多个线程可以同时与它交互,我就应该同步对这个映射的访问.但是,出于性能原因,我不希望这三个读取器线程相互阻塞,因为它们只是从地图中读取.我只希望在第四个线程添加/删除映射条目时发生阻塞.根据我的理解,调用Collections.synchronizedMap(...)将同步对地图的任何类型的访问.我怎样才能做到这一点?
每当多个线程可能同时与之交互时,应该同步对此映射的访问.但是,出于性能原因,我不希望这三个读取器线程相互阻塞,因为它们只是从地图中读取.
虽然读者不必阻拦,你就需要在同步内存都在读取和写入,否则读者会得到部分更新的地图可能产生异常.请参阅有关内存同步的教程.
关于多线程编程的难点在于每个线程都有自己的本地CPU内存缓存,然后与中央内存同步.一个线程,只是读书会不会看到同步写入所做的更新.更糟糕的是,他们可以看到地图内部存储器的部分更新,这会导致异常.
要同步你的地图,你应该把它包装在一个Collections.synchronizedMap(...)电话中或(如@SLaks在评论中提到的),使用ConcurrentHashMap为多个读者/作者构建的.@SLaks也提到了这一点,ReaderWriterLock但CHM效率更高,维护代码更少.
更具体地说,就"阻塞"而言,CHM对地图进行分区,并且以最小的阻塞处理多个读取器和写入器.例如,从CHM获取实际锁定的唯一时间是查找在get调用之前立即插入到映射中的对象.
除非剖析器告诉您这是性能问题,否则我不会担心CHM的性能.