在同步访问地图期间阻止了哪个线程?

时间:2012-08-19 08:55:48

标签: java

我有两个线程需要访问HashMap。我正在使用synchronized关键字和Collections.synchronizedMap()来确保只有一个线程可以同时使用它。

这些线程中的一个绝不会睡觉,但另一个可以。我应该在可以睡觉的线程中使用synchronizedCollections.synchronizedMap(),不能或者两者都使用吗?

2 个答案:

答案 0 :(得分:2)

在这种情况下,不可能阻止一个Thread睡觉。如果优先级较低的Thread已经访问Map,则无法中断该操作,您必须等待。
要实现安全的并发访问,Threads必须使用synchronized,或者您可以使用Collections.synchronizedMap()包装。

答案 1 :(得分:1)

使用synchronized和Collections.synchronizedMap()只是为了保护Map是多余的。这两个项目的用例可能会有所不同,这就是为什么两者都在您的“工具箱”中。

如果您需要访问Map中的某些内容,请检查它,然后将其重新放入一个操作中,同步就是您应该使用的内容。如果你刚刚获得并添加到Map,那么Collections.synchronizedMap()就足够了。

理论上,你可以尝试在被“高优先级”线程访问时中断“低优先级”线程但是作为哈希映射,它可能没有做太多等待可能被中止。

“高优先级”线程是否正在执行某些“低优先级”线程?创建Map的副本可能是您需要做的事情,因为总有一个可读的版本,但它可能会得到更新。需要更多信息从不同的方向解决问题。

从技术上讲,问题的简单答案是否定的。