博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程中释放锁的方式
阅读量:6705 次
发布时间:2019-06-25

本文共 1067 字,大约阅读时间需要 3 分钟。

# 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。

# 调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {...} 代码段内唤醒A。
# 当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。
# 如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。
# obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。
# 当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。
wait()/sleep()的区别
前面讲了wait/notify机制,Thread还有一个sleep()静态方法,它也能使线程暂停一段时间。sleep与wait的不同点是:sleep并不释放锁,并且sleep的暂停和wait暂停是不一样的。obj.wait会使线程进入obj对象的等待集合中并等待唤醒。
  
但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException。
  
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep /join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。

需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException。

 

转载地址:http://qvflo.baihongyu.com/

你可能感兴趣的文章
dubbo分布式事务的设想
查看>>
在OS上kill掉v$session中status值为killed的进程
查看>>
网站网络带宽 和 流量的区别
查看>>
JAVA学习日志(7-2-子父类中成员的特点)
查看>>
Struts 标签与ognl的性能问题
查看>>
WordPress的replytocom参数避免被百度蜘蛛抓取解决方案,将这个参数屏蔽掉
查看>>
浅析如何在Linux系统中如何安装软件
查看>>
VirtualBox和VMware镜像文件互转
查看>>
MySql多表联查
查看>>
硬盘整数分区最精确地方法
查看>>
Java基础--关于分支、循环、数组的部分练习题及详解
查看>>
分布式文件存储
查看>>
LVS高可用方案
查看>>
环形链表解决约瑟夫游戏问题
查看>>
NFS服务器
查看>>
MIUI V5八门神器不能用?一招教你搞定
查看>>
fastcgi_params 与 fastcgi.conf的差异
查看>>
文件操作最小权限
查看>>
系统学习redis之五——redis数据类型之list类型及操作
查看>>
Linux 中分区间数据迁移,原目录不变 - rsync
查看>>