关于同步_死锁_why

原创 2012年03月29日 23:55:16

能否写一个容易产生死锁的程序?

 

死锁的现象:程序挂着不动了

死锁的本质:所有的钥匙都被占用了,导致双方都失去代码的执行权;

 

线程安全隐患:一个线程还没执行完必须同步的代码,cpu就把运行权交给另一个共享代码的线程了,导致错乱;

解决方案:把该同步完成的代码封装到一个{}中,再没有执行完之前,其他线程没有权利读取和执行该{}中的代码;

同步安全原理:给需要同步的代码加个锁(synchronized),给锁配一把钥匙(Object / this / .class ),谁在执行该代码,谁就得到对应的钥匙;

                           因为只有一把钥匙,所以其他线程没有钥匙,就打不开锁,就得不到锁中的代码,也就是没权利执行锁中的代码,这样就安全了;

 

有可能产生的问题:

                   当A线程执行到一半,失去cpu的执行权,B线程得到cpu执行权,B把锁中的代码执行到一半发现里边有一部分代码加了锁,可是钥匙在A线程代码的锁上,这时,B线程可住了,需要得到A线程执行完剩下的代码后才能拿到钥匙,杯具的事情来了,因为这时B线程锁上的钥匙刚好就是A线程剩下的代码的锁的钥匙,各持一把钥匙,而且钥匙都拿不出来,因为双方锁中的代码都没执行完;(这时就是死锁)

 

写一个死锁的代码:

思路:让两条线程,各持对方需要的钥匙;

                        1,A线程和B线程的run方法中的代码加上嵌套锁;

                        2,两条线程的嵌套锁共用两把钥匙;

                        3,B线程的外套锁共用A线程内套锁的钥匙,内套锁共用A线程的外套锁的钥匙;

 

代码体现:

public class DeadLockTest {

 /**
  * 面试:写一个死锁事例
  * 两锁嵌套
  *
  * 同步安全的原理:
  * 当A线程在执行一半的代码后失去执行权,那么共享这些代码的其他线程,没有权利执行这些代码;
  * 只有当我把同步中的所有代码执行完,其他线程才能进来执行;
  *
  * 一锁不能二用,对象不可二用;
  *
  */
 public static class DeadLock implements Runnable {
  //成员变量 
  private boolean flag;
  //构造函数
  DeadLock(boolean flag){
   this.flag = flag;
  }
  //成员函数
  public void run(){
   //if else 制造双体
   if(flag){
    while(true){
     synchronized(MyLock.keyb){
      System.out.println("Thread 1 拿着 keyb");
      synchronized(MyLock.keya){
       System.out.println("Thread 1 拿着 keya");
       System.out.println("Thread 1 释放 keya");
      }
      System.out.println("Thread 1 释放 keyb");
     }
    }
   }
   else{
    while(true){
     synchronized(MyLock.keya){
      System.out.println("Thread 2 拿着 keya");
      synchronized(MyLock.keyb){
       System.out.println("Thread 2 拿着 keyb");
       System.out.println("Thread 2 释放 keyb");
      }
      System.out.println("Thread 2 释放 keya");
     }
    }//复制死锁时,最后一部分打印结果:
      /*
     Thread 2 拿着 keya
     Thread 2 拿着 keyb
     Thread 2 释放 keyb
     Thread 2 释放 keya
     Thread 2 拿着 keya    // 2拿a不放
     Thread 1 拿着 keyb */ // 1拿b不放   两把钥匙被两个人拿到时,就死了
   } 
  }
 }
 //准备两个锁的钥匙
 public static class MyLock{
  static Object keya = new Object();
  static Object keyb = new Object();
 }

 public static void main(String[] args) {
  // 建立事物对象
  DeadLock d1 = new DeadLock(true);
  DeadLock d2 = new DeadLock(false);
  // 建立线程,把对象导入线程
  Thread t1 = new Thread(d1);
  Thread t2 = new Thread(d2);
  // 启动线程
  t1.start();
  t2.start();
  

 }

}

 

                   

多线程同步与死锁深入分析

多线程同步与死锁深入分析 前言 在多线程开发中,同步与死锁是非常重要的,在本篇文章中,读者将会明白一下几点: 1、哪里需要同步 2、如何实现同步 3、以及实现同步之后会有哪些副作用 例子 ...
  • yangwenxue_admin
  • yangwenxue_admin
  • 2016年04月10日 17:53
  • 1789

Java多线程 线程同步与死锁

1.线程同步多线程引发的安全问题一个非常经典的案例,银行取钱的问题。假如你有一张银行卡,里面有5000块钱,然后你去银行取款2000块钱。正在你取钱的时候,取款机正要从你的5000余额中减去2000的...
  • kong_gu_you_lan
  • kong_gu_you_lan
  • 2017年02月25日 15:47
  • 689

Java 线程同步与死锁 学习笔记

Java 线程同步与死锁 学习笔记Java 线程同步与死锁 学习笔记 1 多线程共享数据 2 线程同步 3 同步准则 4 线程死锁 1、 多线程共享数据 在多线程操作中,多个线程可能同时处理同一个资源...
  • haha_zhan
  • haha_zhan
  • 2016年09月25日 10:02
  • 919

并发性:互斥和同步、死锁和饥饿

一、与并发相关的关键术语: 原子操作:要保证指令的序列作为一个组来操作执行,要么都不执行;要么执行要直接执行到指令完毕,中间不能中断 临界区:是一段代码,在这段代码中进程将访问共享资源,当有一个进程在...
  • u013271921
  • u013271921
  • 2015年05月03日 15:55
  • 1306

java 多线程学习笔记2-同步代码块,死锁

1、多线程-同步代码块:synchronized     当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。     如...
  • gaopinqiang
  • gaopinqiang
  • 2016年12月18日 15:08
  • 595

操作系统--进程同步与死锁

5 进程同步 5.1 进程同步的基本概念 5.1.1 并发性     进程的并发性是操作系统的基本特征,并发可以改善操作系统资源的利用率,提高系统的吞吐量。所谓并发性,是指一组进程执行在时间点上相互交...
  • Xw_Classmate
  • Xw_Classmate
  • 2016年01月24日 19:13
  • 1517

同步锁、互锁(死锁)

经历了精心动魄的活动之后,对,锁、多线程的理解进一步加深了,记得在单例模式的时候接触过一点,但那都是皮毛,简单的理解。接下来和大家共同分享学习 java中cpu分给每个线程的时间片是随机的并且在jav...
  • lishehe
  • lishehe
  • 2014年01月15日 21:32
  • 3457

进程同步及避免死锁经典问题

一、读者-写者问题 计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader),另一些进程则要求修改数据(称为写者Writer)。就共享数据而言,Read...
  • CorCplusplusorjava
  • CorCplusplusorjava
  • 2015年07月12日 19:49
  • 1270

1线程同步:互斥量,死锁

1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作。 B:线程操作共享资源的先后顺序不确定。 C:处理器对存储器的操作一般不是原子操作。 2互斥量 mutex操作原语 pthre...
  • toto1297488504
  • toto1297488504
  • 2014年09月25日 16:44
  • 1744

同步、通信与死锁

进程的同步与互斥 在多道程序的环境中,系统中的多个进程可以并发执行,同时它们又要共享系统中的资源,由此诸进程间会产生错综复杂的相互制约的关系。 一、进程间制约关系 1.竞争关系 ...
  • DJ5789121
  • DJ5789121
  • 2016年01月15日 10:34
  • 576
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于同步_死锁_why
举报原因:
原因补充:

(最多只允许输入30个字)