`

java线程:一个死锁的小程序

 
阅读更多


死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

 

  导致死锁的根源在于不适当地运用synchronized关键词来管理线程对特定对象的访问。synchronized关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。

  由于这个原因,在使用synchronized关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。代码一是一个导致死锁的简单例子。

分类: java_线程 34人阅读 评论(0) 收藏 举报
[java] view plaincopy
  1. <span style="font-family:Arial;">  
  2. /** 
  3.  * 演示死锁的一个小程序 
  4.  * @author amber2012 
  5.  * 
  6.  */  
  7. public class DeadLock {  
  8.       
  9.     private Object obj_1 = new Object();  
  10.     private Object obj_2 = new Object();  
  11.       
  12.     public static void main(String[] args) {  
  13.           
  14.         final DeadLock deadLock = new DeadLock();  
  15.           
  16.         // 第一个线程  
  17.         new Thread(new Runnable(){  
  18.             public void run() {  
  19.                 try {  
  20.                     deadLock.method_1();  
  21.                 } catch (InterruptedException e) {  
  22.                     throw new RuntimeException(e);  
  23.                 }  
  24.             }  
  25.         }).start();  
  26.           
  27.         // 第二个线程  
  28.         new Thread(new Runnable(){  
  29.             public void run() {  
  30.                 try {  
  31.                     deadLock.method_2();  
  32.                 } catch (InterruptedException e) {  
  33.                     throw new RuntimeException(e);  
  34.                 }  
  35.             }  
  36.         }).start();  
  37.           
  38.     }  
  39.       
  40.     public void method_1() throws InterruptedException{  
  41.         synchronized (obj_1) {  
  42.             Thread.sleep(1000); // 当前线程睡一会,让另外一个线程保证能得到obj_2的执行权  
  43.             synchronized (obj_2) {  
  44.                 System.out.println("DeadLock.method_1()");  
  45.             }  
  46.         }  
  47.     }  
  48.       
  49.     public void method_2() throws InterruptedException{  
  50.         synchronized (obj_2) {  
  51.             Thread.sleep(1000); // 当前线程睡一会,让另外一个线程保证能得到obj_1的执行权  
  52.             synchronized (obj_1) {  
  53.                 System.out.println("DeadLock.method_2()");  
  54.             }  
  55.         }  
  56.     }  
  57. }  
  58. </span>  
分享到:
评论

相关推荐

    Java多线程编程总结

    #### 十、Java线程:并发协作-死锁 - 死锁是多个线程相互等待对方持有的锁而导致所有线程都无法继续执行的现象。 - 避免死锁的方法包括使用正确的锁顺序、避免嵌套锁等。 #### 十一、Java线程:volatile关键字 - ...

    Java多线程技术 线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    - **进程**:是一个正在执行的程序实例,具有独立的地址空间和资源。每个进程都包括一个或多个线程。 - **线程**:是进程内的执行单位,是最小的调度单元。同一进程内的线程共享相同的地址空间和其他资源,这意味着...

    第15讲 Java多线程.ppt

    * 进程之间的代码、内部数据和状态都是独立的,而一个程序内部的多线程是共享同一块内存空间和同一组系统资源的。 * 线程的切换比进程切换的负担要小。 多线程的优势: * 减轻编写交互频繁、涉及面多的程序的困难...

    JAVA单线程多线程

    在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型简化了程序设计,降低了程序复杂度,使得开发者可以更专注于...

    Java线程使用教程

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...

    JAVA多线程

    #### Java线程:并发协作-生产者消费者模型与死锁 生产者消费者模型是一种经典的线程间协作模式,用于解决多个线程对有限资源的生产与消费问题。死锁则是多线程程序中常见的问题,发生于多个线程互相等待对方持有的...

    安全的编写多线程的_Java_应用程序

    一个程序或进程可以包含多个线程,这些线程可以根据程序的代码执行相应的指令。 - **特性**: 多线程可以模拟并行执行,提高程序效率;线程之间共享地址空间,能够访问相同的变量或数据结构。 **2. Java Thread API...

    java多线程的讲解和实战

    1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java通过`Thread`类和`Runnable`接口来创建和管理线程。每个线程都有自己的生命周期,包括新建、就绪、运行、阻塞和结束五个...

    Java多线程详解及示例

    - 循环等待条件:存在一个等待队列,其中的线程形成一个环形链,每个线程都在等待队列中下一个线程所持有的资源。 3.2 解决死锁的策略 - 避免死锁:设置资源获取顺序,确保所有线程按照同一顺序申请资源。 - 预防...

    java线程文档大全

    Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。这份“java线程文档大全”包含...

    java线程深入解析

    线程允许一个程序内部同时执行多个独立的控制流,使得程序能够更高效地利用处理器资源。本文将深入解析Java线程的相关知识点,包括线程的定义、创建、状态管理、线程同步和安全问题。 1. **线程定义** 在Java中,...

    java线程使用教程

    Java线程是Java程序设计中非常重要的一个部分,掌握好线程的基础知识和高级用法对于写出高性能、高可用性的Java程序至关重要。无论是处理用户界面响应性、利用多核处理器优势还是进行并发编程,都需要深入理解和灵活...

    java线程入门 Java线程编程很好的入门书

    Java线程是多任务编程的重要组成部分,特别是在Java这种支持并发执行的语言中,理解和掌握线程的概念及使用至关重要。本文将基于提供的"Java线程入门"资料,深入探讨Java线程编程的基本概念、创建方法以及常见操作,...

    java多线程代码demo

    Java提供了synchronized关键字来实现线程同步,确保同一时间只有一个线程可以访问特定代码块。此外,`wait()`, `notify()`, 和 `notifyAll()` 方法用于线程间的通信,以协调对共享资源的访问。 4. **死锁**:死锁是...

    java线程实战手册

    8. **Future和Callable接口**:这些接口在异步编程中扮演重要角色,Callable可以返回一个结果,而Future则可以用来获取计算的结果或检查任务是否完成。 9. **并发集合**:Java提供了如ConcurrentHashMap、...

    Java线程(第三版)

    Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的效率和响应性。这本书详细介绍了Java线程的各个方面,包括基础知识、高级特性以及实战应用。 在Java中,线程是...

    Java线程pdf

    Java线程是Java开发者不可或缺的技能之一,它不仅提升了程序的执行效率,还增强了程序的健壮性和用户体验。然而,线程编程也带来了挑战,如线程安全、死锁等问题。因此,深入理解和熟练掌握Java线程的管理和使用,...

    Java线程基础教程完整版

    Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应性。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)管理。本教程将深入讲解Java线程的基础知识,帮助你掌握多...

    java多线程文件传输

    - **任务拆分**:将大任务分解为多个小任务,每个任务由一个线程处理,充分利用多核处理器资源。 - **线程优先级**:合理设置线程优先级可以调整线程执行顺序,但不保证优先级高的线程一定先执行。 7. **异常处理...

Global site tag (gtag.js) - Google Analytics