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死锁实例的主要内容,如果未能解决你的问题,请参考以下文章
Semaphore替换多线程synchronized解决并发环境死锁,Java
多线程环境,线程安全知识点Violatile和synchronized