Java多线程死锁的产生实例

死锁产生的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

示例:死锁实例

package cn.thread.lock;

public class ThreadLock implements Runnable{
    private static Object o1=new Object(), o2=new Object();
    private int flag1=0;
    
    @Override
    public void run() {
        System.out.println("flag1=" + flag1);
        if(flag1==0){
            synchronized (o1) {
                System.out.println(Thread.currentThread().getName()+"我已经锁定o1");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                synchronized (o2) {
                    System.out.println(Thread.currentThread().getName()+"我已经锁定o2");
                }
            }
            
        }
        if(flag1==1){
            synchronized (o2) {
                System.out.println(Thread.currentThread().getName()+"我已经锁定o2");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println(Thread.currentThread().getName()+"我已经锁定o1");
                }
            }
            
        }
        
    }
    public static void main(String[] args) {
        ThreadLock r=new ThreadLock();
        
        ThreadLock r1=new ThreadLock();
        r1.flag1=0;
        r.flag1=1;
        Thread t=new Thread(r);
        Thread t1=new Thread(r1);
        t1.setName("t1");
        t.setName("t");
        t1.start();
        t.start();
        
    }

}

说明:1.一个资源每次只能被一个进程使用--》

`  a.所以要使用 synchronized 关键字,保证一个资源被一个进程使用。

    b.o1,o2一定要是静态的,保证是同一个资源。

原文地址:https://www.cnblogs.com/sloveling/p/synchronized_thread.html