zoukankan      html  css  js  c++  java
  • 线程死锁问题

    一、定义

      线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

    二、实例

     1 package com.sxy.thread;
     2 
     3 /**
     4  * 线程Thread1率先占有了resource1, 继续运行时需要resource2, 但此时resource2却被线程Thread2占有了,
     5  * 因此只能等待Thread2释放resource2才能够继续运行; 同时,Thread2也需要resource1,
     6  * 它只能等待Thread1释放resource1才能够继续运行, 因此,Thread1和Thread2都处于等待状态, 
     7  * 谁也无法继续运行,即产生了死锁。
     8  * 
     9  * @author sunxy
    10  */
    11 public class DeadLock {
    12 
    13     public static void main(String[] args) {
    14         dead_lock();
    15     }
    16 
    17     private static void dead_lock() {
    18         // 两个资源
    19         final Object resource1 = "resource1";
    20         final Object resource2 = "resource2";
    21         // 第一个线程,想先占有resource1,再尝试着占有resource2
    22         Thread t1 = new Thread() {
    23             public void run() {
    24                 // 尝试占有resource1
    25                 synchronized (resource1) {
    26                     // 成功占有resource1
    27                     System.out.println("Thread1 1:locked resource1");
    28                     // 休眠一段时间
    29                     try {
    30                         Thread.sleep(50);
    31                     } catch (InterruptedException e) {
    32                         e.printStackTrace();
    33                     }
    34                     // 尝试占有resource2,如果不能占有,该线程会一直等到
    35                     synchronized (resource2) {
    36                         System.out.println("Thread1 1:locked resource2");
    37                     }
    38                 }
    39             }
    40         };
    41         // 第二个线程,想先占有resource2,再占有resource1
    42         Thread t2 = new Thread() {
    43             public void run() {
    44                 // 尝试占有resource2
    45                 synchronized (resource2) {
    46                     // 成功占有resource2
    47                     System.out.println("Thread 2 :locked resource2");
    48                     // 休眠一段时间
    49                     try {
    50                         Thread.sleep(50);
    51                     } catch (InterruptedException e) {
    52                         e.printStackTrace();
    53                     }
    54                     // 尝试占有resource1,如果不能占有,该线程会一直等到
    55                     synchronized (resource1) {
    56                         System.out.println("Thread1 2:locked resource1");
    57                     }
    58                 }
    59             }
    60         };
    61         // 启动线程
    62         t1.start();
    63         t2.start();
    64     }
    65 }

    结果分析:

      线程Thread1率先占有了resource1,继续运行时需要resource2,但此时resource2却被线程Thread2占有了,因此只能等待Thread2释放resource2才能够继续运行;同时,Thread2也需要resource1,它只能等待Thread1释放resource1才能够继续运行,因此,Thread1和Thread2都处于等待状态,谁也无法继续运行,即产生了死锁。

  • 相关阅读:
    18-行列式及其性质
    17-正交矩阵和Gram-Schmidt正交化
    14-正交向量与子空间
    centOS7.3 离线安装docker
    10-四个基本子空间
    使用vim打造python-ide
    09-线性相关性、基、维数
    python小实例
    Elasticsearch学习之ES节点类型以及各种节点的分工
    基于Kibana和ES的苏宁实时日志分析平台
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5765030.html
Copyright © 2011-2022 走看看