[英]Locking with synchronized method on same instance
我正在运行以下代码:
public class SyncMethods {
public static void main(String... args) {
new SyncMethods().syncMethodsInvoker();
}
public void syncMethodsInvoker() {
System.out.println("inside syncMethodsInvoker()");
Thread t1 = new SyncMethodThread(this);
Thread t2 = new SyncMethodThread(this);
t1.start();
t2.start();
try {
t1.join();
t2.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized void firstSyncMethod(String threadName) {
System.out.format("begin firstSyncMethod() %s\n", threadName);
for (int i = 0; i < 5; i++) {
System.out.format("looping firstSyncMethod() %s #%s for object %s\n", threadName, i, this);
try {
this.wait(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("end firstSyncMethod() " + threadName);
}
private class SyncMethodThread extends Thread {
final private SyncMethods sm;
public SyncMethodThread(SyncMethods sm) {
this.sm = sm;
}
@Override
public void run() {
System.out.format("inside run() %s, sm: %s\n", this.getName(), sm);
sm.firstSyncMethod(this.getName());
}
}
}
我得到这个输出:
inside syncMethodsInvoker()
inside run() Thread-0, sm: multithreading.SyncMethods@6189a0b9
inside run() Thread-1, sm: multithreading.SyncMethods@6189a0b9
begin firstSyncMethod() Thread-0
looping firstSyncMethod() Thread-0 #0 for object multithreading.SyncMethods@6189a0b9
begin firstSyncMethod() Thread-1
looping firstSyncMethod() Thread-1 #0 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #4 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #4 for object multithreading.SyncMethods@6189a0b9
end firstSyncMethod() Thread-1
end firstSyncMethod() Thread-0
由于两个线程都锁定在同一实例上,因此我期望循环进行如下操作:
looping firstSyncMethod() Thread-0 #0 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #4 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #0 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #4 for object multithreading.SyncMethods@6189a0b9
我在这里做错了什么?
由于这一行, this.wait(100);
这会导致当前线程释放锁并等待100ms。 因此,另一个线程可以获得该锁。
此方法使当前线程(称为T)将自己置于该对象的等待集中,然后放弃对该对象的所有同步声明 。 线程T出于线程调度目的而被禁用,并且处于休眠状态,直到发生以下四种情况之一:...
用埃里克森(Erickson)对问题的评论来补充答案:如果要在“等待”时保留锁定,请使用Thread.sleep()
(或TimeUnit.MILLIS.sleep()
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.