最近我的朋友在面试中被问到这个问题。
问题:我们有A类,有两种方法X1和X2。 X1是静态同步的,X2是同步的。
class A {
public static synchronized X1() {
}
public synchronized X2() {
}
}
现在我们知道静态同步在CLASS上获得了锁定并且同步获得了对调用对象的锁定。
采访者问及#34;锁定CLASS是什么意思?"。锁始终在Object上完成。那么在静态同步的情况下实际发生了什么。它在WHICH OBJECT上获得锁定?
有人可以为我清除这个概念,因为它在这里有点混乱。
答案 0 :(得分:3)
根据Oracle concurrency tutorial:
您可能想知道静态同步方法会发生什么 调用,因为静态方法与类关联,而不是 宾语。在这种情况下,线程获取内部锁 与类关联的类对象。因此可以访问类的静态 字段由锁定控制,该锁定与任何锁定不同 班级的实例。
答案 1 :(得分:-1)
正如此SO answer完全指出
there is no link between synchronized static methods and sync'ed non static methods in
this context
证明这一点。
public class SimpleClassTest {
静态同步方法
public static synchronized void X1() {
System.out.println("Before X1 Exec.. From"+Thread.currentThread().getName());
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("After X1 Exec.. From"+Thread.currentThread().getName());
}
非静态同步方法
public synchronized void X2() {
System.out.println(" X2 Exec.. From"+Thread.currentThread().getName());
}
第一种方法只是睡了一段时间然后醒来。 第二种方法是同步但不是静态的。
现在尝试创建两个线程并同时调用此方法(约)
public static void main(String args[]){
final SimpleClassTest instance = new SimpleClassTest();
静态的第一个线程
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
SimpleClassTest.X1();
}
},"Thread1");
非静态的第二个线程
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
instance.X2();
}
},"Thread2");
现在启动两个线程
t1.start();
t2.start();
结果
Before X1 Exec.. FromThread1
X2 Exec.. FromThread2
After X1 Exec.. FromThread1
从结果中两个线程都运行而没有相互锁定。因为如果第一个线程锁定第二个线程锁定的同一个对象,那么线程2将等到第一个线程完成。
因此,我们确信两者并行运行。
Firs线程已经锁定SimpleClasstest.class,因为它是静态方法,与实例无关。
第二个线程已锁定实例,因为它是非静态的。
希望它清除