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){
         <span style="color: #ff0000;"> synchronized(MyLock.lockA){</span>
              System.out.println(Thread.currentThread().getName() + " lockA &&--->lockB");
              try{
                 Thread.sleep(100);
              }catch(InterruptedException e){
              }
             <span style="color: #ff0000;"> synchronized(MyLock.lockB){</span>
                   System.out.println(Thread.currentThread().getName() + " lockB");
              }
          }
       }
       else{
         <span style="color: #008000;"> synchronized(MyLock.lockB){</span>
              System.out.println(Thread.currentThread().getName() + " lockB &&--->lockA");
             <span style="color: #008000;"> synchronized(MyLock.lockA){</span>
                   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();
   }
}
时间: 2024-09-20 00:41:15

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

浅析Java中的嵌套类和内部类

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

Java 中的注解详解及示例代码_java

在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注解通常扮演以下角色 编译器指令 构建时指令 运行时指令 其中 Java内置了三种编译器指令,本文后面部分会重点介绍 Java注解可以应用在构建时,即当你构建你的项目时.构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等.软件的构建通常使用诸如Apache Ant和Mav

Android中RecyclerView嵌套滑动冲突解决的代码片段_Android

在纵向RecyclerView嵌套横向RecyclerView时,如果纵向RecyclerView有下拉刷新功能,那么内部的横向RecyclerView的横向滑动体验会很差.(只有纯横向滑动时,才能滑动内部的横向RecyclerView,否则滑动事件就会影响到下拉刷新),添加拦截判断. public class MySwipeRefreshLayout extends SwipeRefreshLayout { private boolean mIsVpDragger; private final

Java中三种简单注解介绍和代码实例_java

简单Java注解 JDK5提供的简单注解类型只有3个. 这三个都是用来预防错误或者进行提醒的,分别是: 1.Override 2.Deprecated 3.Suppresswarnings 需要注意,JDK5(另一个说法,Tiger)实际上并没有许多内置注解;相反,它允许核心Java支持注解特性的能力. JSR-175中严格规定它用来定义元数据功能. 需要由程序员编写自定义的注解类型,其他JSR标准也编写了一系列标准注解类型. 下面将用实例来深入讲解这三个简单注解. Override 注解 Ov

java中实现汉字按照拼音排序(示例代码)_java

最近項目中需要對繁體字按拼音進行排序 复制代码 代码如下: public static void main(String[] args) {    Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);        String[] arr = { "张三", "李四", "王五", "刘六" ,"周濤","戴笠",

Java中两位年份的转化程序代码

最近在项目中碰到了一个两位年份转化的问题.一个4012的YYmm的时间转化为日期时,变成1940年12月,与预想的2040年12年不一致.看了一下Java的源代码,如果不设置基准时间的话,Java的SimpleDateFormat默认转化前80年到后19年的年份.比如现在的时间是2013/4/15 10:00:00.000那么33/4/15 10:00:00.000会转化为1933年,而33/4/15 9:59:59.999会转化为2033年.修改方法是用set2DigitYearStart指定

Java中Locale.getDefault()方法获取本地国家代码

Java使用Locale 对象的getDefault()方法和和setDefault()方法获取本地国家代码设置,在代码中定义了GetSetLocale 类.先来说说为什么要国际化,国际化的程序可以运行在不同操作系统上,在确定要以本地方法实现某种功能之前需要确定本地对象Locale,或者要以某种特定地区代码显示一段文本,就需要把缺省地区设置成为给定的地区代码.本例的具体实现方法: 1.GetSetLocale 类仅包括min()方法,在该方法中得到并且打印出缺省本地国家代码设置,根据命令行参数设

Android中RecyclerView嵌套滑动冲突解决的代码片段

在纵向RecyclerView嵌套横向RecyclerView时,如果纵向RecyclerView有下拉刷新功能,那么内部的横向RecyclerView的横向滑动体验会很差.(只有纯横向滑动时,才能滑动内部的横向RecyclerView,否则滑动事件就会影响到下拉刷新),添加拦截判断. public class MySwipeRefreshLayout extends SwipeRefreshLayout { private boolean mIsVpDragger; private final

java中IP地址转换十进制数实现代码

先看实例  代码如下 class ip { private static long iptolong(string strip) //将127.0.0.1 形式的ip地址转换成10进制整数,这里没有进行任何错误处理 { int j=0; int i=0; long [] ip=new long[4]; int position1=strip.indexof("."); int position2=strip.indexof(".",position1+1); int