我有两个线程需要访问HashMap。我正在使用synchronized
关键字和Collections.synchronizedMap()
来确保只有一个线程可以同时使用它。
这些线程中的一个绝不会睡觉,但另一个可以。我应该在可以睡觉的线程中使用synchronized
和Collections.synchronizedMap()
,不能或者两者都使用吗?
答案 0 :(得分:2)
在这种情况下,不可能阻止一个Thread
睡觉。如果优先级较低的Thread
已经访问Map
,则无法中断该操作,您必须等待。
要实现安全的并发访问,Threads
必须使用synchronized
,或者您可以使用Collections.synchronizedMap()
包装。
答案 1 :(得分:1)
使用synchronized和Collections.synchronizedMap()只是为了保护Map是多余的。这两个项目的用例可能会有所不同,这就是为什么两者都在您的“工具箱”中。
如果您需要访问Map中的某些内容,请检查它,然后将其重新放入一个操作中,同步就是您应该使用的内容。如果你刚刚获得并添加到Map,那么Collections.synchronizedMap()就足够了。
理论上,你可以尝试在被“高优先级”线程访问时中断“低优先级”线程但是作为哈希映射,它可能没有做太多等待可能被中止。
“高优先级”线程是否正在执行某些“低优先级”线程?创建Map的副本可能是您需要做的事情,因为总有一个可读的版本,但它可能会得到更新。需要更多信息从不同的方向解决问题。
从技术上讲,问题的简单答案是否定的。