多线程:同步方法的错误行为

时间:2012-04-03 08:33:29

标签: java multithreading

我不熟悉java中的多线程并试图理解关键字同步 我有以下代码:

class LockObject {
    int threadsGoingThrough = 0;

    synchronized void locked() {
        threadsGoingThrough++;

        try {
            wait(1000);
        } catch (Exception e) {
            System.out.println("Exception " + e);
        }

        if (threadsGoingThrough > 1) {
            System.out.print("  !! ouups !! "); 
        }
        ;
        threadsGoingThrough--;
    }
}

Thread-class:

class LockTester extends Thread {
    LockObject myLock;
    String message;

    public void run() {
        while (true) {
            myLock.locked();
            System.out.print(message);
        }
    }
}

我的主要看起来像这样:

LockObject theLock = new LockObject();
LockTester threadA = new LockTester();
threadA.myLock = theLock;
threadA.message = "A";

LockTester threadB = new LockTester();
threadB.myLock = theLock;
threadB.message = "B";

threadA.start();
threadB.start();

如果我现在在两个线程中运行此代码,而不是它提供以下输出:

!! ouups !!一个 !! ouups !! B !! ouups !!一个 !! ouups !! B !! ouups !!一个 !! ouups !!乙

!! ouups !!应该只在两个线程同时在同步方法中时发生。怎么会发生这种情况?

2 个答案:

答案 0 :(得分:5)

你正在调用wait(),这将释放它所调用的监视器的锁定。然后它会在唤醒时重新获取锁定(由于超时或通知监视器)。如果您只是试着睡一会儿,请使用不会释放任何锁的Thread.sleep(1000)

答案 1 :(得分:1)

wait()方法释放锁并为其他线程提供获取锁并执行的机会。

如果您希望在1秒内获得执行线程sleep(),则应使用wait()代替not to release the lock