同步方法调用另一个同步方法的锁

2 下列的叙述正确的是()
public class Test2 {
public static synchronized void main(String[] args) {
Thread t = new Thread(){
public void run()
{
Sogou();
}
};
t.run();
//t.start();
System.out.println(“Hello”);
}
static synchronized void Sogou()
{
System.out.println(“Sogou”);
};
}
A HelloSogou
B SogouHello
C 不确定
D hello
注解:我觉得误区有两个:一个是run和start区别.Thread.run()是调用方法,Thread. start()是启动线程;另一个是锁持有问题。这个题是调用方法,和多线程就无关。本题只有一个线程,持有HelloSogou.class锁。那么,就是另一个问题:同步方法调用另一个同步方法的锁问题?
public synchronized void methodA(int a, int b){}
public synchronized void methodB(int a)
{
methodA(a, 0);
}
首先要明白两个问题,1.锁的对象是谁?2.谁持有了锁?
假设方法A和B是在同一个类Test中的两个方法。
Test t=new Test();
t.methodB();
调用methodB()方法,获得锁,锁是对象t;锁谁持有?当前线程(不可以说是methodB持有该锁),methodB又调用methodA,也需要锁t,该线程已持有t,当然可以直接调用methodA.类比到此题,只有一个主线程,调用main,持有HelloSogou.class锁,那当然可以直接调用Sogou方法。
第二,如果是t.statrt(),那么这个题,静态同步函数的锁是该类的字节码文件.class。此题中,main函数和Sogou方法都是static的,所以持有相同锁 HelloSogou.class ,那么,在main线程(main 是一个线程也是一个进程 )中又开了一个线程.调用Sogou方法,锁会冲突。
我的分析是:调用main函数(一个线程),main函数开启另一个线程,并启动,但是main函数和Sogou方法是同一个锁,所以main
函数执行完毕后才会释放锁,Sogou方法才会执行,这就是为什么,换成start,是HelloSogou。
第三,将Sogou方法的锁改为其他.class锁,那么,HelloSogou和SogouHello都可能出现。因为没有互斥现象了,变为抢占式.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值