A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Demo_黑马 中级黑马   /  2016-5-24 21:12  /  412 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[size=14.6666669845581px]关于多线程中"死锁"的问题
   多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁
   资源无法释放,因此同时等待,结果都拿不到
         所以, 尽量不要嵌套使用
  1. package com.heima.syn;

  2. public class Demo5_DeadLock {

  3.         /**
  4.          * @param args
  5.          */
  6.         private static String s1 = "筷子左";
  7.         private static String s2 = "筷子右";

  8.         public static void main(String[] args) {
  9.                 new Thread() {
  10.                         public void run() {
  11.                                 while(true) {
  12.                                         synchronized(s1) {
  13.                                                 System.out.println(getName() + "...获取" + s1 + "等待" + s2);
  14.                                                 synchronized(s2) {
  15.                                                         System.out.println(getName() + "...拿到" + s2 + "开吃");
  16.                                                 }
  17.                                         }
  18.                                 }
  19.                         }
  20.                 }.start();
  21.                
  22.                 new Thread() {
  23.                         public void run() {
  24.                                 while(true) {
  25.                                         synchronized(s2) {
  26.                                                 System.out.println(getName() + "...获取" + s2 + "等待" + s1);
  27.                                                 synchronized(s1) {
  28.                                                         System.out.println(getName() + "...拿到" + s1 + "开吃");
  29.                                                 }
  30.                                         }
  31.                                 }
  32.                         }
  33.                 }.start();
  34.         }
  35. }
复制代码
结果是:
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-0...拿到筷子右开吃
[size=14.6666669845581px]Thread-0...获取筷子左等待筷子右
[size=14.6666669845581px]Thread-1...获取筷子右等待筷子左
然而程序还在进行...
但是结果却不再变化,说明程序出现了"死锁",所以的所以, 尽量不要嵌套使用同步代码哦!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马