1问题描述:
假设有testA,testB方法在Syn类中,这两个方法都被synchronized锁住,问:线程A和线程B是否可以同时运行?
class Syn {
// 线程A进入testA(),线程A仍在执行
public synchronized void testA() {
}
// 线程B是否可以进入TestB()
public synchronized void testB () {
}
}
2分析:
可以给TestA()加一个死循环,使得线程A无限运行,TestB()加一条打印语句
1如果线程A运行,线程B被锁住不运行,那么没有输出
2如果两个线程同时运行,那么输出线程B中的打印语句
3代码:
package se.SE.practice;
class Syn {
// 线程1进入testA(),线程1仍在执行
public synchronized void testA() {
if (Thread.currentThread().getName().equals("A")) {
while (true) {
}
}
}
// 线程2是否可以进入TestB()
public synchronized void testB () {
if (Thread.currentThread().getName().equals("B")) {
System.out.println("线程B打印此方法");
}
}
}
class MyThread implements Runnable {
private Syn syn;
public MyThread (Syn syn){
this.syn=syn;
}
@Override
public void run() {
this.syn.testA();
this.syn.testB();
}
}
public class Thread1{
public static void main(String[] args) throws InterruptedException {
Syn syn=new Syn();
MyThread myThread=new MyThread(syn);
Thread thread=new Thread(myThread,"A");
Thread thread1=new Thread(myThread,"B");
thread.start();
Thread.sleep(2000);//为了保证A先启动,线程A启动后进入休眠状态
thread1.start();
}
}
结果:(没有输出)
为了验证以上观点,我们对线程A解锁---去掉TestA的synchronized
输出:
线程B打印此方法