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
。无论使用哪种类型的对象作为锁,您都将获得该值

如果你因为不是最终决定而收到警告,你是否考虑过。。。使其成为最终版本?啊,我明白了-我认为将其声明为最终版本会阻止修改,所以我没有设置它。谢谢你把它清理干净!