调用同步队列方法时出现线程干扰

时间:2015-04-27 21:58:28

标签: java multithreading

运行我的程序,这是多线程的,似乎导致线程干扰,即使我使用关键字 synchronized 作为对我的部分有影响的方法问题在于。

我有一个静态嵌套类 ,其中包含以下方法:

public synchronized boolean addQueuer(String ID)
{
    if (!buffer.isFull())
    {
        buffer.enqueue(ID);
        return true;
    }
    return false;
}

private synchronized void removeQueuer()
{
    buffer.dequeue();
}

缓冲区是一个包装的简单队列。

在两个不同的主题中,我称之为这些方法。在封装器中,main方法具有以下代码行:

while (true)
{
    stations[0].addQueuer("M");
    Thread.sleep(FREQ_TIMER);
}

哪里的电台是电台的数组,在我的测试中包含一个电台

Station 中,我有以下 run()函数用于实现Runnable(我通过创建此类的实例启动一个线程,然后调用这个线程的start()

public void run()
{
    try
    {
        Thread.sleep(ESTIMATED_SERVICE_TIME);

        while (!buffer.isEmpty())
        {
            removeQueuer();
        }
        if (isOpen)
            run();
    } catch (InterruptedException interruptException)
    {
        threadMessage("This station was interrupted.");
    }
}

出了什么问题:

我调整了 CONSTANTS ,这样缓冲区应该比清空时更快填满。但是,当我运行我的程序时,缓冲区可能从7开始,在下一个循环中下一次运行时下降到6,然后它将永远保持在6。

首先,对同一对象的两个同步方法的调用不可能进行交错。当一个线程正在为对象执行同步方法时,所有其他线程调用同一对象的同步方法阻塞(暂停执行),直到第一个线程完成对象为止。 - Java Tutorials

为什么放置同步还不够?如果需要任何其他背景/信息,请发表评论,我会尽力。

修改:已添加the entire code

0 个答案:

没有答案