![](https://csdnimg.cn/release/download_crawler_static/18938828/bg1.jpg)
[收稿日期] 2006 04 01
[作者简介] 陈更力 (1968 ) , 男 , 1990 年大学毕业 , 硕士 , 讲师 , 现主要从事计算机网络应用 、 协议工程 、 信息安全研究工作 。
Java 并 发 线 程 中 的 死 锁 问 题 研 究
陈更力 ,张 青
(长江大学计算机科学学院 ,湖北 荆州 434023)
[摘要] 发展了进程级死锁的理论 , 给出了线程级死锁的定义并指出其现象 。 在深入分析了 Java 同步机制
的基础上 ,结合具体项目 , 以关系图为工具分析合作线程之间的关系 , 系统地分析了 Java 并发线程中可
能出现的死锁问题 , 并给出了解决并发线程间潜在死锁的算法 。
[关键词] Java ;线程 ; 并发 ; 死锁 ; 解锁
[中图分类号] T P311 畅1 [文献标识码] A [文章编号] 1673 1409 (2006) 02 0072 03
线程即轻量级进程
[1]
。 线程级死锁是指在 2 个或多个并发线程中 , 如果每个线程持有某种资源而又
都等待着别的线程释放它或它们现在保持着的资源 , 否则不能向前推进 。 此时 , 每个线程都占用了一定
的资源但又都不能向前推进 , 称这一组线程产生了死锁 。 此时 , 整个计算机系统是有效运行的 , 而发生
线程级死锁的进程是无效率 、 停滞的 。
为避免出现线程级死锁 ,必须在多线程程序中做同步管理 ,并采取下列措施 : 明确每个线程的功
能 ,确定在程序中需要进行线程同步的位置 ;当从一个同步方法调用另一个同步方法时 ,一定要谨慎 ;
尽量缩短加锁时间 ;如果某线程需要几种不同资源 ,按种类给资源编号 。 笔者根据具体的项目 , 采用一
种新的算法 , 在各个阶段检测并排除了潜在的线程级死锁隐患 。
1 Java 中的多线程的同步机制
Java 多线程同步机制的实现是基于管程机制
[2]
。 在 Java 中每个对象都包含一把同步锁和一个线程
等待集合 , 当对象生成时它们随之自动生成 。 线程等待集的初值为空 , 同步锁的初始状态为开锁状态 。
只有当对象 obj 的同步锁处于开锁状态时 , obj 中的 Synchronized 方法或以 obj 作为同步参数的
Synchronized 块才允许访问 obj 。
当线程 thread1 运行对象 obj 的 Synchronized 方法 (块) 时 ,首先上锁 obj 的同步锁 ,thread1 上锁
obj 成功后 , 才继续执行 Synchronized 方法 (块) 内语句 。 当 Synchronized 方法 (块) 正常结束或异常
退出时 , 同步锁解锁动作自动执行 。
进一步的分析发现 Java 中的线程同步机制有如下功能 :
1) “synchronized” 关键字明确告诉 Java 解释器确保 Synchronized 方法的线程级安全 。 那么这意味
着在同一个类创建的诸多对象中 , 一次只有一个对象的 Synchronized 方法能够投入运行 , 其他的用同
一个类创建的其他的线程只能等待 , 直到当前正在运行的线程运行完毕 。 其根本原因是这些对象共享了
同一份方法代码 , 而此时这段代码处于互斥状态 。
2) “synchronized (obj) { … }” 这种方法块模式使
j
ava 在 { … } 中的代码运行时锁定对象 obj 中的
所有方法 , 不能够向对象 obj 发消息 。
3) 执行 “synchronized (obj) { … }” 的线程不能被挂起 , { … } 中的代码执行不能被中断 。
如下的财务程序的例子说明 “Synchronized” 关键字在 Java 的并发线程中的作用 。
p
ublic class M utexAccount extends Applet implements Runnable
{ int balance = 100 ; T extArea text1 , text2 ;
T hread 会计 , 出纳 ;
·27·
长江大学学报 (自科版)
2006 年 6 月 第 3 卷 第 2 期 理工卷
Journal of Yangtze University (Nat Sci Edit) Jun畅2006 , Vol畅3 No畅2
Sci & Eng V