【发布时间】:2017-11-05 22:51:06
【问题描述】:
我用static 函数和非静态函数作为synchronized 尝试了一个面试问题,其中一个函数是非同步的。如下代码:
public class Resource {
public static synchronized void m1() throws InterruptedException {
System.out.println("Entering m1 method");
Thread.sleep(10000);
System.out.println("Leaving m1 method");
System.out.println();
}
public synchronized void m2() throws InterruptedException {
System.out.println("Entering m2 method");
Thread.sleep(2000);
System.out.println("Leaving m2 method");
System.out.println();
}
public void m3() throws InterruptedException {
System.out.println("Entering m3 method");
Thread.sleep(2000);
System.out.println("Leaving m3 method");
System.out.println();
}
public synchronized void m4() throws InterruptedException {
System.out.println("Entering m4 method");
Thread.sleep(2000);
System.out.println("Leaving m4 method");
System.out.println();
}
}
public class ThreadDemo {
public static void main(String[] args) {
final Resource resource = new Resource();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
resource.m1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
resource.m2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
resource.m3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
try {
resource.m4();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
t3.start();
t4.start();
}
}
这里创建了四个线程。
- T1 正在调用静态同步(m1)
- T2、T4 正在调用 synchronized(m2, m4) 和
- T3 正在调用非同步 (m3)。
它的输出是:
Entering m1 method
Entering m3 method
Entering m2 method
Leaving m3 method
Leaving m2 method
Entering m4 method
Leaving m4 method
Leaving m1 method
我的问题是:
1) 静态同步方法使类级锁定。这里的类级别锁定是什么意思?如果一个线程已经获得锁并且类级别的锁被占用,那么为什么线程 T2 和 T3 开始执行?
2) T4 正在等待完成 T2。虽然同步应用在两种不同的方法上,但为什么 T4 还要等待呢?如果对象级锁定在 T2、T4 中起作用,那么在上述几点中,为什么类级锁定不起作用?
【问题讨论】:
标签: java multithreading synchronization static-methods