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; 
                            
                    
            
    }
     
    下面死锁的情况发生了,真是难得一见啊:
     
  • 相关阅读:
    Xposed学习一:初探
    drozer浅析三:命令实现与交互
    drozer源码学习二:info+scanner
    drozer源码学习:app
    android dalvik浅析一:解释器及其执行
    智能汽车安全风险及防护技术分析
    几维安全“把手伸向金融交易系统”
    几维安全携手苏宁易购,创造企业安全建设新模式
    传输协议不安全,数据泄露谁之过?——流量劫持技术分析
    【一周安全热点】黑客“撞库”破解抖音百万账户密码两月获利上百万元|美国佛罗里达州向勒索软件运营商支付60万美元赎金
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254364.html
Copyright © 2011-2022 走看看