形成死锁的前提是同步代码块嵌套。

什么是死锁?当一个线程拿到锁以后在这个锁内部的代码需要访问另一段的代码的时候另外一个程序的锁被另外一个线程拿到,这样的话,就造成了两个锁互不想让程序没法往下执行的这种状况就是死锁。

  1. class DeadDemoA implements Runnable
  2. {
  3. Object obj = new Object();
  4. int x = ;
  5.  
  6. public void run()
  7. {
  8.  
  9. if(x == ){
  10.  
  11. while(true)
  12. {
  13.  
  14. synchronized(obj)
  15. {
  16. System.out.println("-----");
  17.  
  18. showA();
  19.  
  20. System.out.println("-----");
  21.  
  22. }
  23. showA();
  24.  
  25. }
  26.  
  27. }else{
  28.  
  29. while(true)
  30. {
  31. showA();
  32. x = x+;
  33. x = x%;
  34. }
  35.  
  36. }
  37.  
  38. }
  39.  
  40. public synchronized void showA()
  41. {
  42.  
  43. synchronized (obj)
  44. {
  45.  
  46. System.out.println("SI suo");
  47.  
  48. }
  49.  
  50. }
  51.  
  52. }
  53.  
  54. class DeadLock
  55. {
  56.  
  57. public static void main(String[] args) {
  58.  
  59. DeadDemoA a = new DeadDemoA();
  60. Thread t1 = new Thread(a);
  61. Thread t2 = new Thread(a);
  62. Thread t3 = new Thread(a);
  63. Thread t4 = new Thread(a);
  64.  
  65. t1.start();
  66. t2.start();
  67. t3.start();
  68. t4.start();
  69.  
  70. }
  71.  
  72. }

以上就是一个死锁。

简单来说就是一段程序代码中有两个同步的代码块嵌套,也就是有两个锁,但是一个锁的执行依赖另外一个锁。

代码中A方法要调用B方法,同时这两个都是同步的,有各自的锁A比如说有A锁,B比如说有B锁,那么A方法要执行完成的话,必须同时具备A锁和B锁,如果此时B锁被其他线程拿到的话,这个时候A就等待B锁,同时其他线程也没法执行A方法,这个时候就是相互僵持,成为死锁。同时要注意,锁这个概念是针对线程的,跟本身的程序没有关系。我们再来写个死锁的示例:

  1. class DDlock1 implements Runnable
  2. {
  3.  
  4. private Object obj = new Object();
  5.  
  6. public void run()
  7. {
  8.  
  9. while(true)
  10. {
  11. synchronized (obj)
  12. {
  13. show();
  14.  
  15. }
  16. show();//let other thread get the lock
  17. }
  18.  
  19. }
  20.  
  21. public synchronized void show()
  22. {
  23.  
  24. synchronized(obj){
  25.  
  26. System.out.println("Dead lock example~");
  27. }
  28.  
  29. }
  30.  
  31. }
  32.  
  33. class DeadLock1
  34. {
  35.  
  36. public static void main(String[] args) {
  37.  
  38. DDlock1 d = new DDlock1();
  39.  
  40. Thread t1 = new Thread(d);
  41. Thread t2 = new Thread(d);
  42. Thread t3 = new Thread(d);
  43. Thread t4 = new Thread(d);
  44.  
  45. t1.start();
  46. t2.start();
  47. t3.start();
  48. t4.start();
  49.  
  50. }
  51.  
  52. }

java学习多线程之死锁的更多相关文章

  1. Java学习多线程第一天

    内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1     多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...

  2. Java学习---多线程的学习

    基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它 ...

  3. java学习——多线程

    本文内容来源于  历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容.这个内容可以称为线程要执行的任务. 多线 ...

  4. [Java学习]多线程

    关于多进程与多线程 使用多进程的目的:提高CPU利用率. 使用多线程的目的:提高应用程序?利用率. 多线程与多进程区别:进程间内存独立:同一个进程的线程间共享"堆内存和方法区内存" ...

  5. Java学习多线程第二天

    内容介绍 线程安全 线程同步 死锁 Lock锁 等待唤醒机制 1    多线程 1.1     线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果 ...

  6. Java:多线程<三>死锁、线程间通讯

    死锁: 同步嵌套同步,而且使用的锁不是同一把锁时就可能出现死锁 class Test implements Runnable { private boolean flag; Test(boolean ...

  7. java学习多线程之生产者消费者

    在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系.那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三.李四负责生产烤鸭,王五.马六负责吃烤鸭,那么前者生产完烤 ...

  8. java学习多线程之卖票示例

    这一节我们来说一个示例就是卖票示例: 需求: 我们现在有100张票,然后分四个窗口来卖,直到卖完为止. 思路: 1.先定一个一个票类,描述票的属性,还有打印卖出的票,并且实现Runnable中的run ...

  9. java学习多线程之创建多线程一

    现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...

随机推荐

  1. SQL SERVER HTTP请求

    --开启Sql Server 通讯配置-- sp_configure ; GO RECONFIGURE WITH OVERRIDE; GO sp_configure ; GO RECONFIGURE ...

  2. C++Primer笔记二

    真是一本好书,就这么点,就感觉学到很多了,当然也是我水平太差. 用shell或者bash的时候有一个文件重定向,就是每次程序运行的时候,我们都需要手动输入内容,然后程序输出内容,这时可以用文件来代替. ...

  3. java main函数不执行?

    今天脑袋短路,对于这个问题纠结了好久.这个问题具体是这样的: public class test { public static void main(String[] args) { test2 t ...

  4. Highcharts在IE中不能一次性正常显示的一种解决办法

    由于客户要求必须在IE浏览器下兼容图表,故选用了兼容性较好的Highcharts.另外说一句,博主尝试过ichartjs.ECharts.YUI,兼容性都没有Highcharts给力(所有的兼容性问题 ...

  5. CDN调度器HAProxy、Nginx、Varnish

    http://www.ttlsa.com/web/the-cdn-scheduler-nginx-haproxy-varnish/ CDN功能如下:1.将全网IP分为若干个IP段组,分组的依据通常是运 ...

  6. oracle 11g 64位安装sqldeveloper打开不了

    oracle 11g 64位安装sqldeveloper打开不了解决方法: 1.到官网下载对应版本的sqldeveloper. 2.找对应安装路径下的F:\app\Administrator\prod ...

  7. cognos 10.2.2 导入samples数据源报错解决

    操作系统:windows 2008R2 X64 数据库:oracle 10.2.0.1 X32 sid:cognosdb86 安装完samples后,执行IBM安装目录webcontent\sampl ...

  8. ASP.NET MVC5总结(三)登陆中常用技术解析之session与cookie

    1.session机制 session机制是在服务器端保持状态的方案,在做系统登陆时,我们往往会用到session来存储一些用户登录的重要信息,而这些信息是不能存在cookie中的. 当访问量增多时, ...

  9. 时间处理总结(三)javascript与WCF

    1.WCF提交时间时,若需接受DateTime需转换为"\/Date(928120800000+0800)\/"这种格式 var DateToJson = function (js ...

  10. iOS 高级开发 runtime(三)

    三 .动态添加方法 我们可以通过runtime动态地添加方法.那么到底啥叫动态添加方法呢?动态添加方法就是当我们程序运行时才知道我们应该调用哪个方法.我们首先需要了解这一点,当我们编写完一段代码后,我 ...