Java 如何在LinkedList上正确同步?
我正在编辑一个Java 如何在LinkedList上正确同步?,java,concurrency,synchronization,Java,Concurrency,Synchronization,我正在编辑一个LinkedList并收到警告,因为我的同步变量不是final。如何使此线程安全 我正在尝试在链接列表上进行同步,并且从IDE收到一条警告,指出在非最终字段上进行同步不太可能有用 我尝试了一个私有锁对象,但是当我使用它进行同步时,我得到了以下异常:java.lang.IllegalMonitorStateException protected List<ServerDataEvent> _queue = new LinkedList<>();
LinkedList
并收到警告,因为我的同步变量不是final。如何使此线程安全
我正在尝试在链接列表上进行同步,并且从IDE收到一条警告,指出在非最终字段上进行同步不太可能有用
我尝试了一个私有锁对象,但是当我使用它进行同步时,我得到了以下异常:java.lang.IllegalMonitorStateException
protected List<ServerDataEvent> _queue = new LinkedList<>();
synchronized (_queue) {
while(_queue.isEmpty()) {
try {_queue.wait(); } catch (InterruptedException e) {}
}
dataEvent = _queue.remove(0);
}
protectedlist\u queue=newlinkedlist();
已同步(_队列){
while(_queue.isEmpty()){
请尝试{u queue.wait();}catch(InterruptedException e){}
}
dataEvent=_队列。删除(0);
}
我希望使此线程安全,但除非在LinkedList
上同步,否则无法使程序正常工作。有人能给我指点我需要做什么来解决这个问题吗?谢谢
我正在尝试在LinkedList上进行同步,并且从IDE收到一条警告,指出在非最终字段上进行同步不太可能有用
只需将变量声明为final
问题在于,如果某个对象为字段分配了新值,那么使用该变量进行同步的线程可能最终使用不同的对象。如果这样做,它们可能无法正确同步
(可能您认为将变量声明为final
意味着您无法修改列表。事实并非如此。您可以向final
列表添加和删除元素。您只是无法为变量指定新值;即,使其指向不同的列表实例。)
我尝试了一个私有锁对象,但是当我使用它进行同步时,我得到了以下异常:java.lang.IllegalMonitorStateException
这是另一个问题
最可能发生的情况是,当线程不持有对象互斥时,它正在对对象调用wait
或notify
。无论使用哪种类型的对象作为锁,您都将获得该值 如果你因为不是最终决定而收到警告,你是否考虑过。。。使其成为最终版本?啊,我明白了-我认为将其声明为最终版本会阻止修改,所以我没有设置它。谢谢你把它清理干净!