我试图弄清楚同步方法是如何工作的。根据我的理解,我创建了两个线程T1 and T2这将调用相同的方法addNew
,由于该方法是同步的,难道它不应该先为一个线程执行 for 循环的所有迭代,然后再为另一个线程执行吗?输出不断变化,有时打印正确,有时打印 T1 中的值与 T2 值混合。代码很简单,有人可以指出我做错了什么吗?谢谢。
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new A());
Thread t2 = new Thread(new A());
t1.setName("T1");
t2.setName("T2");
t1.start();
t2.start();
}
}
public class B {
public synchronized void addNew(int i){
Thread t = Thread.currentThread();
for (int j = 0; j < 5; j++) {
System.out.println(t.getName() +"-"+(j+i));
}
}
}
public class A extends Thread {
private B b1 = new B();
@Override
public void run() {
b1.addNew(100);
}
}
Each A
实例有自己的B
实例。方法addNew
是一个实例方法B
。因此,在调用期间隐式获取的锁addNew
是接收器上的锁B
实例。每个线程都在调用addNew
在不同的B
,因此锁定不同的锁。
如果你想all B
实例使用公共锁,创建单个共享锁,并在主体中获取它addNew
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)