前面总结了多个线程访问同一个对象的同步方法以同步执行,多个线程访问多个对象的同步方法则以异步方式执行,那如果多个线程分别访问一个对象中同步方法和非同步方法会如何执行那?
Demo:
MyObject类(包含了一个同步方法和一个非同步方法):
public class MyObject {
synchronized public void methodA(){
try {
System.out.println("begin methodA threadName="+Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println("end endTime="+ System.currentTimeMillis());
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void methodB(){
try {
System.out.println("begin methodB threadName="+Thread.currentThread().getName() +"begin time="+System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("end");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
两个线程类ThreadA1和ThreadB1,分别调用methodA和methodB:
public class ThreadA1 extends Thread {
private MyObject object;
public ThreadA1(MyObject object){
super();
this.object=object;
}
@Override
public void run(){
super.run();
object.methodA();
}
}
public class ThreadB1 extends Thread {
private MyObject object;
public ThreadB1(MyObject object){
super();
this.object=object;
}
@Override
public void run(){
super.run();
object.methodB();
}
}
main方法,调用同一个对象的方法:
public class Run {
public static void main(String[] args){
MyObject object=new MyObject();
ThreadA1 a=new ThreadA1(object);
a.setName("A");
ThreadB1 b=new ThreadB1(object);
b.setName("B");
a.start();
b.start();
}
}
运行结果:
begin methodA threadName=A
begin methodB threadName=Bbegin time=1528106855775
end
end endTime=1528106860775
由结果可知,虽然线程A1先持有了object对象的锁,但线程B1完全可以异步调用非synchronized类型的方法。
如果methoB()方法前加上synchronized关键字那?
运行结果:
begin methodA threadName=A
end endTime=1528109860336
begin methodB threadName=Bbegin time=1528109860336
end
前面两个实验可以得出结论:
1、A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。
2、A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法需要等待,也就是同步。