Java多线程并发环境下的synchronized死锁实例

Posted zhangphil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程并发环境下的synchronized死锁实例相关的知识,希望对你有一定的参考价值。

Java多线程并发环境下的synchronized死锁实例

Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2;而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。

例如:

public class MainClass 
    private Object lock1 = new Object();

    private Object lock2 = new Object();

    public static void main(String[] args) 
        MainClass mainClass = new MainClass();
        mainClass.demo();
    

    private void demo() 
        Thread ta = new Thread(new DeadA());
        Thread tb = new Thread(new DeadB());
        ta.start();
        tb.start();
    

    private class DeadA implements Runnable 
        private String id = "A";

        @Override
        public void run() 
            System.out.println(id + " 申请锁1...");
            synchronized (lock1) 
                System.out.println(id + " 获得锁1");

                System.out.println(id + " 申请锁2...");
                synchronized (lock2) 
                    //A得不到锁2,死锁
                    System.out.println(id + "获得锁2");
                
            

            System.out.println(id + " 运行结束");
        
    

    private class DeadB implements Runnable 
        private String id = "B";

        @Override
        public void run() 
            System.out.println(id + " 申请锁2...");
            synchronized (lock2) 
                System.out.println(id + " 获得锁2");

                System.out.println(id + " 申请锁1...");
                synchronized (lock1) 
                    //B得不到锁1,死锁
                    System.out.println(id + " 获得锁1");
                
            

            System.out.println(id + " 运行结束");
        
    

输出:

B 申请锁2...
A 申请锁1...
B 获得锁2
A 获得锁1
B 申请锁1...
A 申请锁2...

Java同步机制:synchronized,wait,notify_zhangphil的博客-CSDN博客/** * 假设A,B两个线程同时运行。但A需要某项前置条件必须满足(data数组装满)后才可以正常运转。 这里让B线程去为满足A的条件去干活。 */public class SYN int[] data = new int[100];final Object lock = new Object();public SYN() new Thread(new A())https://blog.csdn.net/zhangphil/article/details/43800949

Java线程同步synchronized wait notifyAll_zhangphil的博客-CSDN博客public class Main public static void main(String[] args) Main main = new Main(); main.test(); private void test() new Thread(new Runnable() ...https://blog.csdn.net/zhangphil/article/details/96439409

以上是关于Java多线程并发环境下的synchronized死锁实例的主要内容,如果未能解决你的问题,请参考以下文章

Semaphore替换多线程synchronized解决并发环境死锁,Java

Java并发编程:并发容器(转)

juc多线程编程学习

多线程环境,线程安全知识点Violatile和synchronized

java并发 Java线程同步:synchronized锁住的是代码还是对象

java多线程