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