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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 水蛭31 中级黑马   /  2015-6-18 08:51  /  405 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程——死锁问题:
在同步中, 有时会产生死锁,这样我们需要尽量避免死锁的发生,
什么是死锁呢?——同步里面嵌套同步;
你持有一个锁,我也有一个锁, 我要到你那里去运行,我要拿你的锁,但是谁都不放锁, 就导致程序死锁了,程序死锁, 程序就挂着不动了,
如何产生死锁呢?
代码如下:
  1. class Test implements Runnable
  2. {
  3.         private boolean flag;
  4.         Test(boolean flag){
  5.                 this.flag=flag;
  6.         }
  7.         public void run(){
  8.                 if(flag){
  9.                         while(true)
  10.                         {
  11.                                 synchronized(Mylock.locka){//同步中嵌套同步
  12.                                         System.out.println("a锁说:这是我的锁");
  13.                                         synchronized(Mylock.lockb){
  14.                                                 System.out.println("a锁说:谢谢你的b锁");
  15.                                         }
  16.                                 }
  17.                         }
  18.                 }
  19.                 else{
  20.                         while(true)
  21.                         {
  22.                                 synchronized(Mylock.lockb){
  23.                                         System.out.println("b锁说:这是我的锁");
  24.                                         synchronized(Mylock.locka){
  25.                                                 System.out.println("b锁说:谢谢你的a锁");
  26.                                         }
  27.                                 }
  28.                         }
  29.                 }
  30.         }
  31. }
  32. //为了方便
  33. class Mylock
  34. {
  35.         static Object locka=new Object();//静态的目的为了方便调用
  36.         static Object lockb=new Object();
  37. }
  38. class ThreadDeadTest
  39. {
  40.         public static void main(String[] args)
  41.         {
  42.                 Thread t1= new Thread(new Test(true));
  43.                 Thread t2= new Thread(new Test(false));
  44.                 t1.start();
  45.                 t2.start();
  46.         }
  47. }
复制代码
运行结果:

从代码分析, 开始线程二抢到CPU的执行权, b锁向a锁要到了锁, 所以就
出现了和谐的状态;
但是之后, 就出现了死锁。 ,谁都不给谁, 就僵持着,哎!!!



2 个回复

倒序浏览
谢谢了,如果有什么需要改的, 可以告诉我,
回复 使用道具 举报
好搞笑的,,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马