我正在编辑LinkedList
并收到警告,因为我的同步变量不是最终变量。如何使此线程安全?
我正在尝试在LinkedList
上进行同步,并且从我的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);
}
我想使此线程安全,但是除非在LinkedList
上进行同步,否则无法使程序正常运行。谁能指出我需要解决的问题?谢谢
答案 0 :(得分:2)
我正在尝试在LinkedList上进行同步,并且从我的IDE中收到一条警告,指出在非最终字段上进行同步不太可能有用。
只需将变量声明为final
。
如果某些东西为字段分配了一个新值,然后使用该变量进行同步的线程可能最终会使用另一个对象。如果这样做,可能 不能正确同步。
(也许您认为将变量声明为final
意味着您无法修改列表。那是不正确的。您可以在final
列表中添加和删除元素。您只是无法分配变量的新值;即使其指向另一个列表实例。)
我尝试了一个私有锁对象,但是当我使用它进行同步时,出现以下异常:java.lang.IllegalMonitorStateException
那是一个不同的问题。
最有可能发生的是,一个线程在不持有对象互斥对象的情况下正在调用对象上的wait
或notify
。无论将哪种类型的对象用作锁,都将得到该结果。