【问题标题】:How to correctly synchronize on a LinkedList?如何在 LinkedList 上正确同步?
【发布时间】:2019-04-28 13:59:34
【问题描述】:

我正在编辑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 上同步,否则我无法让程序运行。谁能指点我需要做些什么来解决这个问题?谢谢

【问题讨论】:

  • 如果您因为它不是最终版本而收到警告,您是否考虑过...使其成为最终版本?

标签: java concurrency synchronization


【解决方案1】:

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

只需将变量声明为final

如果某些东西为字段分配了新值,那么使用该变量进行同步的线程可能最终会使用不同的对象。如果他们这样做,他们可能没有正确同步。

(也许您认为将变量声明为final 意味着您不能修改列表。事实并非如此。您可以在final 列表中添加和删除元素。您只是不能为变量;即使其指向不同的列表实例。)

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

这是一个不同的问题。

最有可能发生的情况是,一个线程在对象上调用waitnotify,但它没有持有对象互斥锁。无论您使用哪种类型的对象作为锁,您都会得到它。

【讨论】:

  • 啊,我明白了——我认为将其声明为 final 会阻止修改,所以这就是我没有设置它的原因。感谢您清除它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 2011-11-06
  • 2016-03-11
  • 2023-03-17
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多