1

我有这段代码

public MultiThreadedSum(ArrayBuffer ArrayBufferInst)
{
    this.ArrayBufferInst = ArrayBufferInst;
    Sum = 0;
    Flag = false;
    StopFlag = false;
}

public synchronized void Sum2Elements()
{

    while(Flag)
    {
        try {wait();}
        catch (InterruptedException e){}
    }

    Flag = true;

    if (StopFlag)
    {
        notifyAll();
        return;
    }

    System.out.println("Removing and adding 2 elements.");

    Sum = ArrayBufferInst.Sum2Elements();

    notifyAll();
}

public synchronized void InsertElement()
{

    while(!Flag)
    {
        try {wait();}
        catch (InterruptedException e){}
    }

    Flag = false;

    if (StopFlag)
    {
        notifyAll();
        return;
    }

    System.out.println("Inserting the sum.");

    ArrayBufferInst.InsertElement(Sum);

    if (ArrayBufferInst.RetunrSize() == 1)
    {
        StopFlag = true;
    }

    System.out.println(ArrayBufferInst);

    notifyAll();
}

如您所见,我首先将 Flag 设置为 false,以便其中一个线程可以进入 Sum2Elements 方法并将其更改为 true,然后让每个人都等待。

我知道在同步代码中,只有一个线程可以做它的事情,这里我有两个同步方法,这是否意味着 2 个线程在每个 notifyall 之后都试图执行这个方法?

如果是这样,一个线程是否不可能进入 Sum2Elements,在另一个线程进入 InsertElement 之前将标志更改为 true,然后跳过 while 循环?

谢谢

4

3 回答 3

1

只有一个线程可以持有对象的锁。然后只有那个线程可以进入那个对象的同步方法。

然而,线程可以通过调用 Object.wait() 释放锁而不从方法返回。

所以你的代码看起来不错!

does it mean that 2 threads are trying to conduct this methods after each notifyall? 
Ans : It is very much possible for two threads to be in two of your synchronized methods since you are calling wait().

is it not possible for one thread to enter Sum2Elements, change the flag to true before the other thread enters InsertElement, and by that skipping the while loop?
Ans : Yes this is possible again for the same reason specified above.
于 2013-05-28T05:39:44.300 回答
0

锁是在类的对象上获得的,而不是在任何特定的同步方法上。这两种方法都是实例方法。因此,如果其中一个线程已经为一个对象输入了任何同步方法,A 说,那么任何其他线程都不能为该对象输入任何同步方法,直到正在运行的线程不调用notifyAll()方法。在那个阶段,所有等待的线程都竞争成为活动的,但它取决于线程调度程序来选择一个要成为活动的线程。

如果您希望两个不同的线程同时访问这些同步方法,那么这两个线程应该对类的 2 个不同对象进行操作。

于 2013-05-28T11:08:35.193 回答
0

Only one thread can execute one of two method at a time because both are synchronized though order is undefined

正如我所说的,一个方法一次只能由一个线程执行,除非执行线程释放lock通过调用wait方法和其他线程获取lock并执行其他synchronized方法,这使您的两个语句成为可能

于 2013-05-28T05:57:19.150 回答