问题:当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法?
分几种情况分析:
第一种:当一个线程进入一个对象的一个synchronized方法后,其他线程要进入此对象的其他synchronized方法
public class Person {
public synchronized void eat() {
System.out.println(".......eat...........执行时间:"+ new Date() );
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void drink() {
System.out.println(".......drink...........执行时间:"+ new Date());
}
}
----------------------------------
public class SynTest {
public static void main(String[] args) {
Person person = new Person();
SynEat synEat = new SynEat(person);
SynDrink synDrink = new SynDrink(person);
Thread t1 = new Thread(synEat);
Thread t2 = new Thread(synDrink);
t1.start();
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
}
t2.start();
}
}
class SynEat implements Runnable{
private Person person;
public SynEat(Person person) {
this.person = person;
}
@Override
public void run() {
person.eat();
}
}
class SynDrink implements Runnable{
private Person person;
public SynDrink(Person person) {
this.person = person;
}
@Override
public void run() {
person.drink();
}
}
执行结果:
结论:当一个线程进入一个对象的一个synchronized方法后,其他线程是不能进入此对象的其他synchronized方法
第二种:当一个线程进入一个对象的一个synchronized方法后,其他线程要进入此对象的其他非synchronized方法
测试代码省略...将第一种情况中的Person类中的drink方法去掉synchronized即可
执行结果:
结论:当一个线程进入一个对象的一个synchronized方法后,其他线程是可以进入此对象的其他非synchronized方法
第三种:当一个线程进入一个对象的一个synchronized方法后,其他线程要进入此对象的其他静态synchronized方法
执行结果:
结论:当一个线程进入一个对象的一个synchronized方法后,其他线程可以进入此对象的其他静态synchronized方法
注:若两synchronized方法都有static修饰的话,当一个线程进入对象的一个static synchronized方法后,其他线程不可以进入此对象的其他静态synchronized方法