synchronized关键字与对象锁

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值