两个线程进入runnable的同步方法

时间:2012-07-15 11:34:56

标签: java multithreading concurrency synchronization

这是我遇到问题的代码 -

public class WaitTest {
    public static void main(String[] args) {
        Runner rr = new Runner();
        Thread t1 = new Thread(rr,"T1");
        Thread t2 = new Thread(rr,"T2");
        t1.start();
        t2.start();
    }
}

class Runner implements Runnable{
    int i=0;
    public void run(){
        try{
            if(Thread.currentThread().getName().equals("T1")){
                bMethod();
                aMethod();
            }
            else{
                aMethod();
                bMethod();
            }
        }catch(Exception e){}
    }

    public synchronized void aMethod() throws Exception{
        System.out.println("i="+i+",Now going to Wait in aMethod "+Thread.currentThread().getName());
        Thread.currentThread().wait();
        System.out.println("Exiting aMethod "+Thread.currentThread().getName());
    }

    public synchronized void bMethod() throws Exception{
        System.out.println("i="+i+",Now going to Wait bMethod "+Thread.currentThread().getName());
        i=5;
        notifyAll();
        System.out.println("Exiting bMethod "+Thread.currentThread().getName());
    }
}

输出结果为:

i=0,Now going to Wait bMethod T1
Exiting bMethod T1
i=5,Now going to Wait in aMethod T1
i=5,Now going to Wait in aMethod T2

我的问题是:

  

为什么T2进入aMethodT1在里面等待?以及为什么T2打印   i=5

中的aMethod.

3 个答案:

答案 0 :(得分:4)

当您执行wait时,您的线程会释放锁并进入等待状态。此时允许另一个线程进入该方法。您正在使用Runnable的单个实例,因此当一个线程将其设置为5时,这就是另一个线程读取的内容。

答案 1 :(得分:2)

1。 wait立即释放锁,并将锁定移至另一个主题。

2。 notify仅在同步块的右括号时释放锁定    到了。

3。由于此处只有一个Runnable实例,因此在i = 5之后,当synchronized块结束时......然后释放锁定。

答案 2 :(得分:0)

此代码未执行wait-notify模式。 Thread.currentThread().wait()调用会抛出IllegalMonitorStateExceptionrun方法会捕获并忽略该T1T2Exiting aMethod都会抛出此异常,因此您看不到打印的行notify

bMethod中的wait来电被浪费了,因为rr Runnable的内在锁上没有任何线程{{1}}。