java中同步嵌套引起的死锁事例代码

/*
 目的:自己写一个由于同步嵌套引起的死锁!
 思路:多个线程在执行时,某一时刻,0-Thread绑定了LockA锁,1-Thread绑定了LockB锁!
 当0-Thread要去绑定LockB锁时 和 1-Thread要去绑定LockA锁时都不能绑定,此时两个线程不能继续进行!
*/
class Ticket implements Runnable{
   public boolean flag;
   Ticket(boolean flag){
      this.flag = flag;
   }
   Ticket(){
      flag=true;
   }
   public void run(){
       if(flag){
	      synchronized(MyLock.lockA){
		      System.out.println(Thread.currentThread().getName() + " lockA &&--->lockB");
			  try{
		         Thread.sleep(100);
		      }catch(InterruptedException e){
		      }
			  synchronized(MyLock.lockB){
			       System.out.println(Thread.currentThread().getName() + " lockB");
			  }
		  }
	   }
	   else{
	      synchronized(MyLock.lockB){
		      System.out.println(Thread.currentThread().getName() + " lockB &&--->lockA");
			  synchronized(MyLock.lockA){
			       System.out.println(Thread.currentThread().getName() + " lockA");
			  }
		  }
	   }
   }
}

class MyLock{
   public static final MyLock lockA = new MyLock();
   public static final MyLock lockB = new MyLock();
}

public class DeadLockDemo{
   public static void main(String[] args){
   //虽然new了两个任务对象,但是不影响演示由于同步嵌套引起的死锁情况
   //    new Thread(new Ticket(true)).start();
   //    new Thread(new Ticket(false)).start();

   ///////////////////////////////////////////////////////////

        Ticket tt = new Ticket();//只产生一个线程任务!这样写还要控制好sleep的时间才好.....
        new Thread(tt).start();
		try{
		   Thread.sleep(20);
		}catch(InterruptedException e){
		}
		tt.flag=false;
        new Thread(tt).start();
   }
}

  

java中同步嵌套引起的死锁事例代码

时间: 2024-09-30 15:37:03

java中同步嵌套引起的死锁事例代码的相关文章

Java中的嵌套类和内部类

以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很大的疑惑:嵌套类跟内部类有什么区别?只有是否有关键字static的区别吗? 所以今天找了个时间查了一下两者的详细区别,总结在这篇博客中,既方便自己的复习和学习,也启示他人吧. 1,概念: 定义在一个类内部的类,叫作"嵌套类".嵌套类分为两种:static的和非static的.后者又有一个专

Java中的嵌套类、内部类、静态内部类

在Java中我们在一个类的内部再定义一个类,如下所示: class OuterClass { ... class NestedClass { ... } } 那么在上面的例子中我们称OuterClass为外围类(enclosing class),里面的那个类称之为嵌套类(Nested Class). 嵌套类可以分为两种,静态的和非静态的,即静态嵌套类和非静态嵌套类.非静态嵌套类又叫做内部类(Inner Class).我们通常所说的静态内部类其实是不严格的,严格的说应该叫做静态嵌套类(Static

Java中初始化对象的顺序,静态代码块的用法以及Static的用法详解

(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口 两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 静态方法 (1)在Java里,可以定义一个不需要创建对象的方法,

java中int与byte数组互转代码详细分析

转载请注明出处:http://blog.csdn.net/tang9140/article/details/43404385 在java中,可能会遇到将int转成byte[]数组,或者将byte[]数组转成int的情况.下面我们来思考下怎么实现? 首先,分析int在java内存中的存储格式. 众所周知,int类型在内存中占4个字节,采用补码方式存储(假如对原码.反码.补码不熟悉,请查阅相关资料).举例: 整型-128对应内存中的二进制值为 整型128对应内存中的二进制值为 然后,考虑如何把int

【java中的 嵌套管程锁死】

原文链接    作者:Jakob Jenkov 译者:余绍亮    校对:丁一 嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景  线程1获得A对象的锁. 线程1获得对象B的锁(同时持有对象A的锁). 线程1决定等待另一个线程的信号再继续. 线程1调用B.wait(),从而释放了B对象上的锁,但仍然持有对象A的锁. 线程2需要同时持有对象A和对象B的锁,才能向线程1发信号. 线程2无法获得对象A上的锁,因为对象A上的锁当前正被线程1持有. 线程2一直被阻塞,等待线程1释放对象A上的锁. 线

java中同步和异步有什么异同?

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程: 异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待. 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式. 哪些情况建议使用同步交互呢?比如银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互.

java中JDBC连接Oracle数据库的示例代码

package com.xxxx.lunwen.test;import java.sql.*;public class DBUtil { static { try { // 加载Oracle驱动程序 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); System.out.println("oracle驱动程序加载中!"); } catch(InstantiationException e1

Java中this,static,super及finalkeyword和代码块

this: 能够使用this表示类中的属性------this.name=name 能够使用this强调调用的是本类的方法 能够使用this调用本类的构造方法------this();调用本类中无參构造方法 能够使用this表示当前对象(调用方法的对象)----最重要的用途 static: 声明属性---------属性则为全局变量 声明方法---------Person.setName("Tom");使用类名称调用static方法 final: 使用final声明的类不能有子类 使用

java多线程同步以及线程间通信详解&amp;消费者生产者模式&amp;死锁&amp;Thread.join()(多线程编程之二)

本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: [java] view plain copy print? package com.zejian.test; /** * @author zejian * @time 2016年3月12日 下午2:55:42 * @decrition 模拟卖票线程 */ public class Ticket implements Runnable { //当前拥有的票数 private