java线程死锁

java通过synchronized关键字包装代码块、方法或通过Lock、ReadWriteLock锁的机制来实现多线程并发同步操作,但是使用不当,会造成死锁!
下面写一个案例

先定义两个执行实体类

public class First {
    public synchronized void foo(Second second){
        System.out.println("当前线程名:" + Thread.currentThread().getName() + "进入了First实例的foo方法");
        try {
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("当前线程名:" + Thread.currentThread().getName() + " 企图调用Second实例的last方法");
        second.last();
    }

    public synchronized void last(){
        System.out.println("进入了First实例的last方法内部");
    }
}


public class Second{
    public synchronized void bar(First first) {
        System.out.println("当前线程名:" + Thread.currentThread().getName()
                + "进入了Second实例的bar方法");
        try {
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("当前线程名:" + Thread.currentThread().getName()
                + "企图调用First实例的last方法");
        first.last();
    }

    public synchronized void last() {
        System.out.println("进入了Second类的last内部");
    }
}

编写启动调用类
public class DeadLock implements Runnable {
    First first = new First();
    Second second = new Second();
    public void init(){
        Thread.currentThread().setName("主线程");
        first.foo(second);
        System.out.println("进入了主线程之后");
    }

    public void run() {
        Thread.currentThread().setName("副线程");
        second.bar(first);
        System.out.println("进入副线程之后");
    }

    public static void main(String[] args){
        DeadLock lock = new DeadLock();
        new Thread(lock).start();
        lock.init();
    }
}

然后运行DeadLock的main方法,实现效果如下:
java线程死锁_第1张图片
线程执行到画线部分戛然而止,而且虚拟机永不停止(图中画方框处),此时就造成了死锁,程序不停止,也不报错,所有线程都想被阻塞!

如下图解实现过程
java线程死锁_第2张图片
心得:在多线程调用中,合理利用synchronized,和Lock,合理使用wait() 和 notify()、notifyAll()来进行线程间的通信协作。避免造成死锁!

你可能感兴趣的:(java,编码,synchronized,java,线程)