在之前我们已经说过synchronized修饰非静态方法是锁住的该类的某一个实例对象。
下面看一个例子:
public class Test185 {
synchronized public void show1() {
System.out.println("show1方法开始了");
boolean flag = true;
while(flag) {
}
System.out.println("show1方法结束了");
}
synchronized public void show2() {
System.out.println("show2方法开始了");
boolean flag = true;
while(flag) {
}
System.out.println("show2方法结束了");
}
}
public class Test186 {
public static void main(String[] args) {
MyTaskThread111 mt = new MyTaskThread111();
Thread t = new Thread(mt);
Thread t1 = new Thread(mt);
t.setName("t");
t1.setName("t1");
t.start();
t1.start();
}
}
class MyTaskThread111 implements Runnable{
Test185 t = new Test185();
@Override
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread().getName().equals("t")) {
t.show1();
}
if(Thread.currentThread().getName().equals("t1")) {
t.show2();
}
}
}
你会发现执行的结果:首先我们先看两个同步方法,锁住的是Test185的对象,也就是t。当一个线程获取到执行权的时候,因为里面是一个无限循环,没有释放,那么在Test185中,其他同步方法,没有同步锁,是无法执行的,陷入了无限等待。
其实解决办法,就是不同同步方法,而改用同步代码块,构造不同锁对象,就可以解决,这里不再演示。