文档详情

Java并发编程实践-教程-06章.pdf

发布:2019-06-27约2.68万字共18页下载文档
文本预览下载声明
第 6 章 死锁 第 6 章 死锁1 6.1 死锁概述2 6.2 死锁示例3 6.3 避免死锁和死锁诊断7 6.4 减小锁的竞争和粒度9 6.4.1 缩小锁的范围9 6.4.2 减小锁的粒度11 6.5 使用MTRAT诊断死锁12 6.6 饿死和活锁16 参考资料:18 Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无 限期地阻塞,因此程序不可能正常终止,这种情况叫死锁。本章将对 Java 多线程编程中可 能出现死锁的情况进行详细的讲解,以及如何采用 MTRAT 来检查死锁。 6.1死锁概述 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区 别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得 线程间的通信较进程简单。编写多线程序时,必须注意每个线程是否干扰了其他线程的工作。 每个进程开始生命周期时都是单一线程,称为“主线程”,在某一时刻主线程会创建一个对等 线程。如果主线程停滞则系统就会切换到其对等线程。和一个进程相关的线程此时会组成一 个对等线程池,一个线程可以杀死其任意对等线程。 因为每个线程都能读写相同的共享数据。这样就带来了新的麻烦:由于数据共享会带来 同步问题,进而会导致死锁的产生。 由多线程带来的性能改善是以可靠性为代价的,主要是因为有可能产生线程死锁。死锁 是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。 由于线程被无限期地阻塞,因此程序不能正常运行。简单的说就是:线程死锁时,第一个线 程等待第二个线程释放资源,而同时第二个线程又在直接或间接等待第一个线程释放资源。 这里举一个通俗的例子:如在人行道上两个人迎面相遇,为了给对方让道,两人同时向一侧 迈出一步,双方无法通过,又同时向另一侧迈出一步,这样还是无法通过。假设这种情况一 直持续下去,这样就会发生死锁现象。 更形象的例子如下: 五个哲学家围坐在一圆桌旁,每人的两边放着一支筷子,共五支 筷子。大家边讨论问题边用餐。并规定如下的条件是: 1 )每个人只有拿起位于自己两边的筷子,合成一双才可以用餐。 2 )用餐后每人必须将两只筷子放回原处。 我们可以想象,如果每个哲学家都彬彬有礼,并且高谈阔论,轮流吃饭,则这种融洽的 气氛可以长久地保持下去。但是可能出现这样一种情景:当每个人都拿起自己左手边的筷子, 并同时去拿自己右手边的筷子时,会发生什么情况:五个人每人拿着一支筷子,盯着自己右 手边的那位哲学手里的一支筷子,处于僵持状态。这就是发生了“线程死锁”。 多个线程竞争共享资源时可能出现的一种系统状态:线程 1 拥有资源 1,并等待资源2 , Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 而线程 2 拥有资源 2 ,并等待资源 3,…, 以此类推,线程n 拥有资源 n-1,并等待资源 1。在这 种状态下,各个线程互不相让,永远进入一种等待状态。于是出现了死锁的现象。 虽然线程死锁只是系统的一种状态
显示全部
相似文档