1、首先定义一个类Myobject。其中 methodA()为同步方法,methodB()为非同步方法
public class MyObject {
synchronized public void methodA(){
try {
System.out.println("begin methodA name:"+Thread.currentThread().getName());
Thread.sleep(2000);
System.out.println("end Time:"+System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
public void methodB(){
try {
System.out.println("begin methodB name:"+Thread.currentThread().getName()+" begin time:"+
System.currentTimeMillis());
Thread.sleep(2000);
System.out.println("end");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、定义两个线程类,ThreadA和ThreadB在其run方法中分别调用MyObject 的methodA()和methodB()
public class ThreadA extends Thread{
private MyObject object;
public ThreadA(MyObject object) {
this.object = object;
}
@Override
public void run() {
super.run();
object.methodA();
}
}
public class ThreadB extends Thread{
private MyObject object;
public ThreadB(MyObject object) {
this.object = object;
}
@Override
public void run() {
super.run();
object.methodB();
}
}
3、在main方法运行
public static void main(String[] args) {
MyObject object = new MyObject();
ThreadA a = new ThreadA(object);
a.setName("A");
ThreadB b = new ThreadB(object);
b.setName("B");
a.start();
b.start();
}
4、打印结果
begin methodA name:A
begin methodB name:B begin time:1495549479884
end
end Time:1495549481884
5、将Myobject类中的methodB()方法也加上关键字synchronized,再次运行main函数,打印结果如下:
begin methodA name:A
end Time:1495549998374
begin methodB name:B begin time:1495549998374
end
由此我们可以得出以下结果:
1、A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法
2、A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型方法,则需要等待,也就是同步。
------------转自Java多线程编程核心技术