synchronized关键字与对象锁

来源:互联网 发布:李泽厚美的历程知乎 编辑:程序博客网 时间:2024/06/06 03:57

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多线程编程核心技术



原创粉丝点击