如果我在同一个类上同步了两个方法,它们能同时在同一个对象上运行吗?例如:

class A {
    public synchronized void methodA() {
        //method A
    }

    public synchronized void methodB() {
        // method B
    }
}

我知道我不能在两个不同的线程中对同一个对象运行methodA()两次。在methodB()中也是如此。

但我可以运行methodB()在不同的线程,而methodA()仍在运行?(同一对象)


当前回答

你同步的是对象而不是类。所以它们不能同时在同一物体上运行

其他回答

清楚地说,静态同步和非静态同步方法都可能同时或并发地运行,因为一个有对象级锁,另一个有类级锁。

这两种方法都锁定同一个监视器。因此,你不能同时从不同的线程在同一个对象上执行它们(两个方法中的一个会阻塞,直到另一个方法完成)。

是的,它们可以同时运行两个线程。如果创建类的2个对象,每个对象只包含一个锁,并且每个同步方法都需要锁。 如果你想同时运行,创建两个对象然后使用那些对象引用来运行。

Java线程在进入实例同步Java方法时获得一个对象级锁,在进入静态同步Java方法时获得一个类级锁。

在您的示例中,方法(实例)属于同一个类。因此,当一个线程进入java synchronized方法或块时,它会获得一个锁(方法被调用的对象)。因此,在第一个方法完成并释放lock(on object)之前,不能在同一对象上同时调用其他方法。

不,这是不可能的,如果这是可能的,那么这两个方法可以同时更新同一个变量,这很容易破坏数据。