0

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

这些线程中的一个必须永不休眠,而另一个可以。我应该在可以休眠的线程、不能休眠的线程中使用synchronized和,还是两者都使用?Collections.synchronizedMap()

4

2 回答 2

2

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

于 2012-08-19T08:59:12.537 回答
1

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

如果您需要访问 Map 中的某些内容,请检查它,然后可能将其作为一个操作放回原处,同步是您应该使用的。如果您只是获取并添加到地图,Collections.synchronizedMap() 应该就足够了。

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

'高优先级'线程是否正在做一些'低优先级'线程没有做的事情?创建地图的副本可能是您需要做的事情,以便始终有一个可读的版本,但它可能会延迟更新。需要更多信息来从不同的方向解决这个问题。

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

于 2012-08-19T09:05:27.407 回答