当一个线程进入一个对象的synchronized() 方法后,其他线程是否可以进入此对象的其他方法?
1、其他方法generalMethod() 没有加入synchronized修饰符
<span style="font-size:18px;">package thread;
public class Test {
public synchronized void synchronizedMethod(){
System.out.println("begin calling synchronizedMethod");
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("finish calling synchronizedMethod");
}
public void generalMethod(){
System.out.println("calling generalMethod");
}
}
</span>
<span style="font-size:18px;">package thread;
public class MultiThread {
static final Test t = new Test();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1 = new Thread(){
public void run(){
t.synchronizedMethod();
}
};
Thread t2 = new Thread(){
public void run(){
t.generalMethod();
}
};
t1.start();
t2.start();
}
}
</span>
结果:
begin calling synchronizedMethod
calling generalMethod
finish calling synchronizedMethod
结论:当一个线程进入一个对象多个一个synchronize()方法后,其他线程是否可以进入该对象的其他方法取决于方法本身,如果该方法是非synchronized()方法,那么是可以访问的。
2、其他方法generalMethod() 加入synchronized修饰符
<span style="font-size:18px;">package thread;
public class Test {
public synchronized void synchronizedMethod(){
System.out.println("begin calling synchronizedMethod");
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("finish calling synchronizedMethod");
}
public synchronized void generalMethod(){
System.out.println("calling generalMethod");
}
}</span>
结果:
begin calling synchronizedMethod
finish calling synchronizedMethod
calling generalMethod
结论:当一个线程进入一个对象多个一个synchronize()方法后,其他线程是否可以进入该对象的其他方法取决于方法本身,如果该方法是synchronized()方法,那么是不可以访问的。
3、其他方法generalMethod() 加入synchronized static 修饰符
<span style="font-size:18px;">package thread;
public class Test {
public synchronized void synchronizedMethod(){
System.out.println("begin calling synchronizedMethod");
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("finish calling synchronizedMethod");
}
public synchronized static void generalMethod(){
System.out.println("calling generalMethod");
}
}</span>
结果:
begin calling synchronizedMethod
calling generalMethod
finish calling synchronizedMethod
结论:如果其他方法是静态方法,它用的同步锁是当前类的字节码,与非晶态的方法不能同步(因为非静态的方法用的是this),因此,静态方法可以被调用