我不熟悉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 !!应该只在两个线程同时在同步方法中时发生。怎么会发生这种情况?
答案 0 :(得分:5)
你正在调用wait()
,这将释放它所调用的监视器的锁定。然后它会在唤醒时重新获取锁定(由于超时或通知监视器)。如果您只是试着睡一会儿,请使用不会释放任何锁的Thread.sleep(1000)
。
答案 1 :(得分:1)
wait()
方法释放锁并为其他线程提供获取锁并执行的机会。
如果您希望在1秒内获得执行线程sleep()
,则应使用wait()
代替not to release the lock