Java演示死锁代码

死锁代码

public class DeadLock {

    final Object lockA = new Object();    final Object lockB = new Object();

    public static void main(String[] args) {        DeadLock demo = new DeadLock();        demo.startLock();    }

    public void startLock() {        ThreadA a = new ThreadA(lockA, lockB);        ThreadB b = new ThreadB(lockA, lockB);

        // start threads        a.start();        b.start();    }

}

class ThreadA extends Thread {

    private Object lockA = null;    private Object lockB = null;

    public ThreadA(Object a, Object b) {        this.lockA = a;        this.lockB = b;    }

    public void run() {        synchronized (lockA) {            System.out.println("*** Thread A: ***: Lock A");            try {                sleep(3000);            } catch (InterruptedException e) {                e.printStackTrace();            }            synchronized (lockB) {                System.out.println("*** Thread A: ***: Lock B");            }        }

        System.out.println("*** Thread A: ***: Finished");    }

}

class ThreadB extends Thread {

    private Object lockA = null;    private Object lockB = null;

    public ThreadB(Object a, Object b) {        this.lockA = a;        this.lockB = b;    }

    public void run() {        synchronized (lockB) {            System.out.println("*** Thread B: ***: Lock B");            try {                sleep(3000);            } catch (InterruptedException e) {                e.printStackTrace();            }            synchronized (lockA) {                System.out.println("*** Thread B: ***: Lock A");            }        }

        System.out.println("*** Thread B: ***: Finished");    }

}

控制台截图:

  

原文地址:https://www.cnblogs.com/chenmingjun/p/9671043.html

时间: 2024-11-09 03:49:45

Java演示死锁代码的相关文章

DotNet,PHP,Java的数据库连接代码大全(带演示代码)

C#数据库连接字符串 Web.config文件 <connectionStrings> <!--SQLServer数据库连接--> <add name="conn_sqlserver" connectionString="server=127.0.0.1;uid=testuser;pwd=testPwd;database=db_test;pooling=true;min pool size=10;max pool size=1024;connec

Java演示设计模式中的单件模式的代码

下边代码内容是关于Java演示设计模式中的单件模式的代码,应该是对小伙伴们有所用处. public class SimpleSingleton { private static SimpleSingleton singleInstance = new SimpleSingleton(); private SimpleSingleton() { } public static SimpleSingleton getInstance() { return singleInstance; } } 调用

Java 程序死锁问题原理及解决方案

本文已经于2015年8月24日发表于IBM开发者论坛 Java 语言通过 synchronized 关键字来保证原子性,这是因为每一个 Object 都有一个隐含的锁,这个也称作监视器对象.在进入 synchronized 之前自动获取此内部锁,而一旦离开此方式,无论是完成或者中断都会自动释放锁.显然这是一个独占锁,每个锁请求之间是互斥的.相对于众多高级锁 (Lock/ReadWriteLock 等),synchronized 的代价都比后者要高.但是 synchronzied 的语法比较简单,

java技巧--提高代码运行效率

java技巧--提高代码运行效率 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资源的并发访问 第二,控制实例的产生,以达到节约资源的目的 第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信 - 2.尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的

java多线程死锁

原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一 java中死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁.死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候. 例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了.线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情.为了得到彼此的对象(A和B),它们将永远阻塞下去.这种情况就是一个死锁. 该情况如下: Thread 1

java的死锁学习

学习java的死锁写的代码 也是看书上的然后自己敲了一个 <span style="font-size:18px;">package synchronization.java.test; /** * 关于java中线程死锁例子 * 在学习操作系统的时候有线程死锁但是也只是理解也没有亲自动手敲过 * 现在学java既然学到这里了就敲了一个简单的以进餐为例的代码 * @author hello * @version 8 */ public class DeadLock { st

Java线程死锁解决方法(转)

转自:http://leowzy.iteye.com/blog/740859 Java线程死锁如何避免这一悲剧  Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键.不幸的是,使用上锁会带来其他问题.让我们来看一些常见问题以及相应的解决方法: Java线程死锁 Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成.假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭.他们都需要获得两个锁:共享

Java多线程死锁避免方法

一.什么是死锁当两个或两个以上的线程在执行过程中,因为争夺资源而造成的一种相互等待的状态,由于存在一种环路的锁依赖关系而永远地等待下去,如果没有外部干涉,他们将永远等待下去,此时的这个状态称之为死锁.经典的 "哲学家进餐" 问题很好地描述了死锁状况:5个哲学家去吃中餐,坐在一张圆桌旁,他们有5根筷子(而不是5双),并且每两个人中间放一根筷子,哲学家们要么在思考,要么在进餐,每个人都需要一双筷子才能吃到东西,并在吃完后将筷子放回原处继续思考,有些筷子管理算法 (1) 能够使每个人都能相对

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相