zoukankan      html  css  js  c++  java
  • Java线程十五:并发协作-死锁

    Java线程:并发协作-死锁
     
    线程发生死锁可能性很小,即使看似可能发生死锁的代码,在运行时发生死锁的可能性也是小之又小。
     
    发生死锁的原因一般是两个对象的锁相互等待造成的。
     
    在《Java线程:线程的同步与锁》一文中,简述死锁的概念与简单例子,但是所给的例子是不完整的,这里给出一个完整的例子。
     
     
    public class Test { 
            public static void main(String[] args) { 
                    DeadlockRisk dead = new DeadlockRisk(); 
                    MyThread t1 = new MyThread(dead, 1, 2); 
                    MyThread t2 = new MyThread(dead, 3, 4); 
                    MyThread t3 = new MyThread(dead, 5, 6); 
                    MyThread t4 = new MyThread(dead, 7, 8); 

                    t1.start(); 
                    t2.start(); 
                    t3.start(); 
                    t4.start(); 
            



    class MyThread extends Thread { 
            private DeadlockRisk dead; 
            private int a, b; 


            MyThread(DeadlockRisk dead, int a, int b) { 
                    this.dead = dead; 
                    this.a = a; 
                    this.b = b; 
            

            @Override 
            public void run() { 
                    dead.read(); 
                    dead.write(a, b); 
            


    class DeadlockRisk { 
            private static class Resource { 
                    public int value; 
            

            private Resource resourceA = new Resource(); 
            private Resource resourceB = new Resource(); 

            public int read() { 
                    synchronized (resourceA) { 
                            System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!"); 
                            synchronized (resourceB) { 
                                    System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!"); 
                                    return resourceB.value + resourceA.value; 
                            
                    
            

            public void write(int a, int b) { 
                    synchronized (resourceB) { 
                            System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!"); 
                            synchronized (resourceA) { 
                                    System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceB的锁!"); 
                                    resourceA.value = a; 
                                    resourceB.value = b; 
                            
                    
            
    }
     
    下面死锁的情况发生了,真是难得一见啊:
     
  • 相关阅读:
    wordPress屏蔽中国境内的IP
    中国IP地址大全
    WebGL之点精灵的旋转(Rotation Sprite)
    WebGL之点上添加图片(using texture on point)
    potree--加载二进制格式文件
    potree--如何控制八叉树子节点的显示?
    重启tomcat后,访问登陆接口响应慢--Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [27,572] milliseconds.
    Unirest
    配置规范
    函数编写建议
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254364.html
Copyright © 2011-2022 走看看