如何正确同步LinkedList?

时间:2019-04-28 13:59:35

标签: java concurrency synchronization

我正在编辑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上进行同步,否则无法使程序正常运行。谁能指出我需要解决的问题?谢谢

1 个答案:

答案 0 :(得分:2)

  

我正在尝试在LinkedList上进行同步,并且从我的IDE中收到一条警告,指出在非最终字段上进行同步不太可能有用。

只需将变量声明为final

如果某些东西为字段分配了一个新值,然后使用该变量进行同步的线程可能最终会使用另一个对象。如果这样做,可能 不能正确同步。

(也许您认为将变量声明为final意味着您无法修改列表。那是不正确的。您可以在final列表中添加和删除元素。您只是无法分配变量的新值;即使其指向另一个列表实例。)

  

我尝试了一个私有锁对象,但是当我使用它进行同步时,出现以下异常:java.lang.IllegalMonitorStateException

那是一个不同的问题。

最有可能发生的是,一个线程在不持有对象互斥对象的情况下正在调用对象上的waitnotify。无论将哪种类型的对象用作锁,都将得到该结果。