我正在阅读有关 JAVA 同步的内容。
我的类中有 2 个方法。
public synchronized void eat()
{
System.out.println("eat");
eatDinner();
}
public synchronized void eatDinner()
{
System.out.println("eat");
}
我的两个方法都是同步的。
现在是否可以有 2 个线程,其中一个调用 eat()
,另一个调用 eatDinner()
同时运行?
如果 thread2 尚未执行 eatDinner() 。 thread1 可以从 eat()
调用 eatDinner()
吗?
最佳答案
不,两个线程不可能同时运行 eat
和 eatDinner
方法。 (警告:只要在类的相同实例上调用这些方法)
synchronized
关键字应用于非静态方法时,会在对象本身上进行同步。
您的代码可以重写,而不改变含义,如下:
public void eat() {
synchronized (this) {
System.out.println("eat");
eatDinner();
}
}
public void eatDinner() {
synchronized (this) {
System.out.println("eat");
}
}
这可能会让您更容易看到它们在同一个监视器上同步。 每个java对象都有一个监视器。
只要“thread1”持有对象的监视器,它就可以进入同一监视器上的其他同步
block 。在另一个线程获得监视器的所有权之前,“thread1”必须退出所有同步块(synchronized block)(这些 block 存在的次数与它进入同步块(synchronized block)的次数相同)。
因此,如果 eatDinner
已经在 eat
方法中,线程 1 就可以调用它 - 没问题。但如果 thread2
当前处于 eat
方法中,则 thread1
在调用 eatDinner
时将阻塞,直到 thread2 完成eatDinner
和eat
。
添加: 回复您的评论
@Raj: If two threads are created by same class instances, then?
线程是如何创建的并不重要——无论是在同一个类中还是在代码中完全不同的位置发生。两个不同的线程始终是独立的。
它只与您同步的对象的监视器有关:每个对象实例都有一个“监视器”。您看不到此监视器 - 它没有名称,但它在那里,并且由 synchronized
关键字以及 wait
、notify 使用
和 notifyAll
方法在 java.lang.Object
中定义。
关于java - 两个线程执行两个 `synchronized` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22433466/