IllegalMonitorStateException with ArrayList NotifyAll() Wait

本文关键字:Wait NotifyAll with ArrayList IllegalMonitorStateException | 更新日期: 2023-09-27 18:09:30

我知道关于这个话题有很多答案,我想我已经全部读过了。大多数答案不包括他们使用的名称空间,并且编译他们建议的代码实际上是不可能的。

我正在使用VS 2015 community with Xamarin,这是一个Android项目。

我的命名空间:

using Android.Graphics;
using Android.Util;
using Java.Lang;
using Java.Util;
我代码:

public static int updateWait()    // Called by a thread.
{
    int value = 0;
     try
    {
        while (msgList.IsEmpty)
        {
            msgList.Wait();
        }
        value = (int)msgList.Get(0);
        msgList.Remove(0) ;
    }
    catch (Exception e)
    {
        Log.Debug("", "" + e);
    }
    return value;
}
public static void updateNotify()   // called by a service
{
    if (msgList.IsEmpty)
    {
        msgList.Add(1000);
    }
    try
    {
            msgList.NotifyAll();
    }
    catch ( Exception e)
    {
        Log.Debug("", "" + e);
    }
}

上面的代码工作正确,因为来自活动的线程似乎被阻塞,直到服务调用updateNotify()。问题是每次调用msgList.NotifyAll()都会生成IllegalMonitorStateException,我忽略了。
因为只有一个线程发出通知,只有一个线程等待,所以没有同步问题——但是异常令人担忧。

IllegalMonitorStateException with ArrayList NotifyAll() Wait

如果当前线程不拥有对象的监视器,则不能在对象上调用notify()。你应该把它放在同步块中。

synchronized(msgList) {
  msgList.NotifyAll();
}

如果有人仍然感兴趣,请尝试:

lock(msgList) { 
   msgList.NotifyAll();
}