假设我有一个具有静态和非静态同步方法的类,并且一个线程尝试访问静态方法。因此,将在类上获取锁。现在我的问题是,如果另一个线程同时尝试访问非静态方法,它是否能够访问它?
问问题
347 次
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 Thread
executestatic doSomething()
不会阻塞另一个正在Thread
执行的实例doOther()
。
于 2013-09-07T14:31:20.107 回答
1
是的。静态同步方法锁定在类对象上,
例如对于 MyClass 类,它的 MyClass.class
而实例同步方法锁定在 Java 中用“this”关键字表示的 Object 的当前实例上。
由于这两个对象不同,它们具有不同的锁,因此当一个线程正在执行静态同步方法时,java中的其他线程不需要等待该线程返回,而是会获取单独的锁,表示为字节。
在这里阅读更多
于 2013-09-07T14:33:30.157 回答