我正在尝试了解JAVA中的同步。我写了一个小程序。
class A implements Runnable {
public void run() {
Random r = new Random();
int i = r.nextInt(10);
if(i<5){
print();
}else{
display();
}
}
public synchronized void display()
{
System.out.println("display");
print(); // Line no: 19
}
public synchronized void print()
{
System.out.println("print");
}
}
public class Test {
public static void main(String argv[]) throws Exception {
A a = new A();
Thread t = new Thread(a, "A");
Thread t1 = new Thread(a, "B");
t.start();
t1.start();
}
}
考虑第一种情况:我在print方法的第一行放了一个 debug 点。
现在线程A
开始运行并且数字随机生成数字 1 。
它会调用print
方法,因为我的第一行有调试点。它会等我恢复。
现在,在此期间,线程B
开始运行并编号随机生成的数字 8 。
它应该调用display
方法,但我看到执行没有进入display
方法。只有在确保线程A已完成执行后才能进入。
线程B
不应该进入display
方法并等待line no 19.
同一个对象生成的两个线程不能执行2个不同的同步方法吗?
请解释。
答案 0 :(得分:0)
要输入对象的同步方法,线程必须获取与该对象关联的内部锁。锁被绑定到对象。每种方法都没有自己的锁。
由于线程A位于Runnable的synchronized方法内,因此另一个线程必须等待锁定被释放才能输入synchronized方法,无论方法是否相同。