zoukankan      html  css  js  c++  java
  • Java线程(学习整理)--3--简单的死锁例子

    1、线程死锁的概念:

          简单地理解下吧!

          我们都知道,线程在执行的过程中是占着CPU的资源的,当多个线程都需要一个被锁住的条件才能结束的时候,死锁就产生了!     

          还有一个经典的死锁现象:

        经典的“哲学家就餐问题”,5个哲学家吃中餐,坐在圆卓子旁。每人有5根筷子(不是5双),每两个人中间放一根,哲学家时而思考,时而进餐。

    每个人都需要一双筷子才能吃到东西,吃完后将筷子放回原处继续思考,如果每个人都立刻抓住自己左边的筷子,然后等待右边的筷子空出来,同时又不

    放下已经拿到的筷子,这样每个人都无法得到1双筷子,无法吃饭都会饿死,这种情况就会产生死锁:

        每个人都拥有其他人需要的资源,同时又等待其他人拥有的资源,并且每个人在获得所有需要的资源之前都不会放弃已经拥有的资源。

    当多个线程完成功能需要同时获取多个共享资源的时候可能会导致死锁。

        1:两个任务以相反的顺序申请两个锁,死锁就可能出现

        2:线程T1获得锁L1,线程T2获得锁L2,然后T1申请获得锁L2,同时T2申请获得锁L1,此时两个线程将要永久阻塞,死锁出现

        如果一个类可能发生死锁,那么并不意味着每次都会发生死锁,只是表示有可能。要避免程序中出现死锁。

        3:要避免死锁某个程序需要访问两个文件,当进程中的两个线程分别各锁住了一个文件,那它们都在等待对方解锁另一个文件,而这永远不会发生。

    2、简单举例说明:

     1 package cn.sxt.runnables;
     2 /**
     3  * 简单的死锁例子
     4  * @author 小风微灵
     5  *
     6  */
     7 public class DeadLock extends Thread{
     8 
     9     
    10     public DeadLock(String name){
    11         super(name);
    12     }
    13     
    14     public void run() {
    15         
    16         while(true){
    17             if("天使彦".equals(Thread.currentThread().getName())){
    18                 /**
    19                  * 简单初步地预防死锁现象:
    20                  */
    21                 try {
    22                     Thread.sleep(1000);
    23                 } catch (InterruptedException e) {
    24                     e.printStackTrace();
    25                 }
    26                 
    27                 synchronized ("遥控器") {
    28                     System.out.println("天使彦拿到遥控器,准备去拿电池!");
    29                     synchronized ("电池") {
    30                         System.out.println("天使彦拿到遥控器和电池,吹着空调爽歪歪.....!");
    31                         break;
    32                     }
    33                 }
    34                 
    35                 
    36             }else if("葛小伦".equals(Thread.currentThread().getName())){
    37                 synchronized ("电池") {
    38                     System.out.println("葛小伦拿到电池,准备去拿遥控器!");
    39                     synchronized ("遥控器") {
    40                         System.out.println("葛小伦拿到遥控器和电池,吹着空调爽歪歪.....!");
    41                         break;
    42                     }
    43                 }
    44                 
    45             }
    46         }
    47     }
    48     public static void main(String[] args) {
    49         
    50         DeadLock yan=new DeadLock("天使彦");
    51         yan.start();
    52         DeadLock gxl=new DeadLock("葛小伦");
    53         gxl.start();
    54     }
    55     
    56 }
  • 相关阅读:
    基于结构化平均感知机的分词器Java实现
    HanLP分词命名实体提取详解
    [英语学习]王秒同学《21天TED英语精练团》
    [不好分类]转帖:好好说话是个“技术活”(李笑来说话太直了?)
    [英语学习]3招速成英语发音 背景音乐和学习随感
    [读书笔记]《番茄工作法图解:简单易行的时间管理方法》
    [英语学习]给宝宝的英语原版资源
    [办公自动化]如何判断服务器是否开放某端口
    [他山之石]Google's Project Oxygen Pumps Fresh Air Into Management
    [读书笔记]云计算时代的网络,读《腾云,云计算和大数据时代网络技术揭秘》
  • 原文地址:https://www.cnblogs.com/newwind/p/5658464.html
Copyright © 2011-2022 走看看