java 线程释放_Java多线程之释放对象的锁

由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的。在以下情况下,持有锁的线程会释放锁:

1. 执行完同步代码块。

2. 在执行同步代码块的过程中,遇到异常而导致线程终止。

3. 在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放锁,进行对象的等待池。

除了以上情况外,只要持有锁的此案吃还没有执行完同步代码块,就不会释放锁。因此在以下情况下,线程不会释放锁:

1. 在执行同步代码块的过程中,执行了Thread.sleep()方法,当前线程放弃CPU,开始睡眠,在睡眠中不会释放锁。

2. 在执行同步代码块的过程中,执行了Thread.yield()方法,当前线程放弃CPU,但不会释放锁。

3. 在执行同步代码块的过程中,其他线程执行了当前对象的suspend()方法,当前线程被暂停,但不会释放锁。但Thread类的suspend()方法已经被废弃。

避免死锁的一个通用的经验法则是:当几个线程都要访问共享资源A、B和C时,保证使每个线程都按照同样的顺序去访问他们,比如都先访问A,再访问B和C。

java.lang.Object类中提供了两个用于线程通信的方法:wait()和notify()。需要注意到是,wait()方法必须放在一个循环中,因为在多线程环境中,共享对象的状态随时可能改变。当一个在对象等待池中的线程被唤醒后,并不一定立即恢复运行,等到这个线程获得了锁及CPU才能继续运行,又可能此时对象的状态已经发生了变化。

6

2

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2008-12-07 20:13

浏览 7914

评论

5 楼

danni505

2009-10-16

一个线程由于异常而终止,其原持有的对象锁要被释放,那么我想问,这个释放锁是由谁了进行?又是如何进行的?

4 楼

yoyo08

2008-12-10

ChinaEstone 写道

利用java.utils.concurrent并发工具包可以更好的进行线程间的通信,并且可以很好的控制同步。  

说的对 确实是这样

3 楼

ChinaEstone

2008-12-10

利用java.utils.concurrent并发工具包可以更好的进行线程间的通信,并且可以很好的控制同步。

75a3bf8974c9bd5a56863a745113d139.gif

2 楼

yoyo08

2008-12-07

netbaixc@gmail.com 写道

引用

一个wait的线程可能因为jvm本身的实现而自动得去恢复锁的持有,因为有如此的约定,所以一个合乎逻辑的程序都应该在循环体里wait.

wait()也可以带参数的

引用

java.lang.Object类中提供了两个用于线程通信的方法:wait()和notify()。需要注意到是,wait()方法必须放在一个循环中,因为在多线程环境中,共享对象的状态随时可能改变。当一个在对象等待池中的线程被唤醒后,并不一定立即恢复运行,等到这个线程获得了锁及CPU才能继续运行,又可能此时对象的状态已经发生了变化。  这里说的有点含糊,实际本质原因是因为JVM实现规范里有约定, The thread may be removed from the wait set due to any one of the following actions, and will resume sometime afterward. ~~~An internal action by the implementation. Implementations are permitted, although not encouraged, to perform "spurious wake-ups" -- to remove threads from wait sets and thus enable resumption without explicit instructions to do so. Notice that this provision necessitates the Java coding practice of using wait only within loops that terminate only when some logical condition that the thread is waiting for holds. http://java.sun.com/docs/books/jls/third_edition/html/memory.html意思就是说一个wait的线程可能因为jvm本身的实现而自动得去恢复锁的持有,因为有如此的约定,所以一个合乎逻辑的程序都应该在循环体里wait.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值