静态和非静态多线程

时间:2013-09-07 14:26:26

标签: java

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

2 个答案:

答案 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