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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 以梦为码 中级黑马   /  2015-7-15 12:44  /  363 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

死锁  
死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。  
导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,
因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。  
由于这个原因,在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。下面我写了一个死锁的代码(根据老师的写的)

//---------------死锁---------------
//当同步中嵌套同步,就有可能出现死锁的现象
//多线程争夺同一资源(对象锁) 产生的假死现象 -- 死锁

//定义两个对象,当作同步中的锁,保证对象唯一  A B
class LockA {public static final LockA locka=new LockA();}
class LockB{public static final LockB lockb=new LockB();}

class ThreadDemo implements Runnable{
        private boolean flag;
        public ThreadDemo(boolean flag){
                this.flag=flag;}
        public void run(){
                while(true){
        if(flag){
                //如果变量值是true,先进去A,在进去B
                        synchronized(LockA.locka){
                                System.out.println("if...locka");
                                synchronized(LockB.lockb){
                                        System.out.println("else...lockb");
                                }
                        }
        }else{
                //变量的值是false,先进去B,在进去A
                        synchronized(LockB.lockb){
                                System.out.println("if...lockb");
                                synchronized(LockA.locka){
                                        System.out.println("else...locka");
                                }
                        }
               
              }
                }
  }
}

class DuoXianCheng{
        public static void main(String[] args){
                ThreadDemo d1=new ThreadDemo(false);
                ThreadDemo d2=new ThreadDemo(true);
                Thread t1=new Thread(d1);
                Thread t2=new Thread(d2);
                t1.start();
                t2.start();
        }
}

0 个回复

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