假设我有一个包含静态和非静态同步方法的类,并且一个线程试图访问静态方法。因此,锁定将在课堂上获得。现在我的问题是,如果另一个线程同时尝试访问非静态方法,它是否能够访问它?
答案 0 :(得分:3)
Java中的每个类在运行时都会获得一个Class<YourClass>
实例。在类或static
方法上进行同步时,您正在同步该实例。
public static synchronized void doSomething() {}
// or explicit
synchronized (YourClass.class) {}
如果Thread
位于另一个中,则其中任何一个都会阻止,因为YourClass.class
返回同步方法正在使用的同一个Class<YourClass>
实例。
如果是实例方法
public synchronized void doOther() {}
// or explicit
synchronized (instance)
调用doOther()
隐式执行
synchronized (this)
围绕方法。
在static
案例中,您在synchronizing
个实例上Class
。在instance
案例中,您是班级实例的synchronizing
。那是两个不同的显示器。由于它们是不同的监视器,因此Thread
执行static doSomething()
将不会阻止另一个Thread
执行实例doOther()
。
答案 1 :(得分:1)
是。
锁定在类对象上的静态同步方法
例如对于MyClass类,它的MyClass.class为
实例同步方法锁定在Java中由“this”关键字表示的Object的当前实例。
由于这两个对象都不同,因此它们具有不同的锁定,因此当一个线程正在执行静态同步方法时,java中的其他线程不需要等待该线程返回而是获取单独的锁定表示字节。
了解更多here