同一任务和对象锁的问题

偶尔翻开java编程思想看看多线程的篇章,意焦突然卡在某个问题上不动了。这个问题看过多少次多少遍了,此刻才领会,顿时感觉自己好笨拙的思维。

问题是这样的:一般来说,在多线程程序中,某个任务在持有某对象的锁后才能运行任务,其他任务只有在该任务释放同一对象锁后才能拥有对象锁,然后执行任务。于是,想到,同一个任务在持有同一个对象的锁后,在不释放锁的情况下,继续调用同一个对象的其他同步(synchronized)方法,该任务是否会再次持有该对象锁呢?

答案是肯定的。[color=red]同一个任务在调用同一个对象上的其他synchronized方法,可以再次获得该对象锁。[/color]

多线程编程是一件很微妙的事情,这里考验人的不是大局而是细节,细节的细节。希望能唤醒自己愚笨的思维。

 package thread.thread1;

/**
* 同一任务可以再次持有对象锁 create on 2010.08.04 08:27
*
* @since jdk1.6
* @author maozj
* @version 1.0
*
*/
public class SynchronizedClassHolder {
/**
* Test client
* @param args
*/
public static void main(String[] args) {
new Thread() {
public void run() {
new SynchronizedClassHolder().f1();
}
}.start();
}

private static int count = 10;

/**
* synchronized f1()
*/
public synchronized void f1() {
if (--count > 0) {
System.out.println("f1() calling f2() count " + count);
f2();
}
}

/**
* synchronized f2()
*/
public synchronized void f2() {
if (--count > 0) {
System.out.println("f2() calling f1() count " + count);
f1();
}
}
}

输出:
f1() calling f2() count 9
f2() calling f1() count 8
f1() calling f2() count 7
f2() calling f1() count 6
f1() calling f2() count 5
f2() calling f1() count 4
f1() calling f2() count 3
f2() calling f1() count 2
f1() calling f2() count 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值