奇怪的死锁(?)
我在使用两个线程的Java应用程序中遇到了一个非常奇怪的死锁。两个线程都将数据读写到共享散列映射。为了避免同步问题,我使得同步读取和写入数据的函数的hashmap:
private synchronized boolean identifiedLinksHasKey(String linkKey){
return Parser.identifiedLinks.containsKey(linkKey);
}
private synchronized void putToIdentifiedLinks(String key, TreeSet<String> aset){
Parser.identifiedLinks.put(key,aset);
}
但是,程序在某些时候会挂起(当我使用单个线程运行它时不会发生这种情况)。为了调试我的应用程序,我在挂起后使用了jstack,这给了我以下的线程转储:
“Thread-2”prio = 6
tid = 0x0000000006b09800 nid = 0x78fc
runnable [0x00000000083ef000]
java.lang.Thread.State:RUNNABLE
at java.util.HashMap.put(Unknown Source)
at bgp.parser.Entry.putToIdentifiedLinks(Entry.java:297)
- 已锁定&lt; 0x00000000853f2020>(bgp.parser.Entry)
在bgp.parser.Entry.parseTxtFile(Entry.java:141)
在bgp.parser.Entry.run(Entry.java:31)
“Thread-1”prio = 6
tid = 0x0000000006b52800 nid = 0x9390
runnable [0x00000000082ef000]
java.lang.Thread.State:RUNNABLE
在java.util.HashMap.getEntry(未知
资源)
在java.util.HashMap.containsKey(未知
资源)
at bgp.parser.Entry.identifiedLinksHasKey(Entry.java:281)
- 已锁定&lt; 0x00000000853f00e0>(bgp.parser.Entry)
在bgp.parser.Entry.parseTxtFile(Entry.java:134)
在bgp.parser.Entry.run(Entry.java:31)
它接缝两个线程同时访问两个同步函数,这与同步的含义相矛盾。即使我使用对象锁,也会发生相同的情况。虽然线程的状态不是BLOCKED但是RUNNABLE它们表现为阻塞,可能是因为它们同时访问同一个hashmap。
如果有人能解释我为什么会发生这种奇怪的情况,我真的很感激。
没有找到相关结果
已邀请:
5 个回复
豆兢
我自己没有尝试过这个代码,而且我不能100%确定是否可以使用类(Parser)而不是一个对象来锁定。如果这不起作用,只需选择可从两个线程/实例访问的任何(单个)对象。
佬棠
关键字锁定对象实例。 (即如果你创建两个物体
,锁定
不会影响
)
荤碗
和
方法是由
类的两个不同实例执行的,在这种情况下,
将不起作用。
惭法搽
迪擅哨乘傅