java - 两个线程执行两个 `synchronized` 方法?

标签 java multithreading synchronized

我正在阅读有关 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() 吗?

最佳答案

,两个线程不可能同时运行 eateatDinner 方法。 (警告:只要在类的相同实例上调用这些方法)

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 完成eatDinnereat

添加: 回复您的评论

@Raj: If two threads are created by same class instances, then?

线程是如何创建的并不重要——无论是在同一个类中还是在代码中完全不同的位置发生。两个不同的线程始终是独立的。

它只与您同步的对象的监视器有关:每个对象实例都有一个“监视器”。您看不到此监视器 - 它没有名称,但它在那里,并且由 synchronized 关键字以及 waitnotify 使用notifyAll 方法在 java.lang.Object 中定义。

关于java - 两个线程执行两个 `synchronized` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22433466/

相关文章:

java - 根据 java 内存模型,synchronized 到底做了什么?

关于接口(interface)的java一般问题

javascript - 使用 postman 向运行 SparkJava 的本地主机服务器发出请求,但不能使用浏览器中的 javascript

objective-c - 可能的? NSThread 通过单例 Objective-C iOS 请求 URL

java - 解决获取多个锁时的死锁

java - 空的 synchronized(this){} 对线程之间的内存可见性有什么意义吗?

Java的synchronized方法并不是同步的

java - 在 Java 中调用外部 Web 服务的最有效方法?

java - 在数组的数组中查找模式

c# - 如何正确读取 Interlocked.Increment'ed int 字段?