0

假设我有一个具有静态和非静态同步方法的类,并且一个线程尝试访问静态方法。因此,将在类上获取锁。现在我的问题是,如果另一个线程同时尝试访问非静态方法,它是否能够访问它?

4

2 回答 2

3

Java 中的每个类在运行时都有一个Class<YourClass>实例。当您在类或static方法上同步时,您正在对该实例进行同步。

public static synchronized void doSomething() {}
// or explicit
synchronized (YourClass.class) {}

Thread如果 a在另一个中,则其中任何一个都会阻塞,因为返回同步方法正在使用YourClass.class的相同实例。Class<YourClass>

如果是实例方法

public synchronized void doOther() {}
// or explicit
synchronized (instance)

调用doOther()隐式执行

synchronized (this) 

围绕方法。

在这种static情况下,您synchronizing在一个Class实例上。在这种instance情况下,你在synchronizing你的类的一个实例上。那是两个不同的显示器。因为它们是不同的监视器,所以 on Threadexecutestatic doSomething()不会阻塞另一个正在Thread执行的实例doOther()

于 2013-09-07T14:31:20.107 回答
1

是的。静态同步方法锁定在类对象上,
例如对于 MyClass 类,它的 MyClass.class
而实例同步方法锁定在 Java 中用“this”关键字表示的 Object 的当前实例上。

由于这两个对象不同,它们具有不同的锁,因此当一个线程正在执行静态同步方法时,java中的其他线程不需要等待该线程返回,而是会获取单独的锁,表示为字节。

在这里阅读更多

于 2013-09-07T14:33:30.157 回答