美文网首页
Java中的死锁(DeadLock)

Java中的死锁(DeadLock)

作者: 雪糕的粑粑 | 来源:发表于2016-12-29 17:43 被阅读0次

同步会导致另一个可能的问题就是死锁(deadlock)。如果两个线程需要独占访问统一的一个资源集,而每个线程分别有这些资源的不同子集锁,就会发生死锁。如果两个线程都不愿意放弃已经拥有的资源,就会进入无限停止状态。
下面是一个简单的死锁例子


public classDeadLock {

    public static final Stringres1="res1";
    public static final Stringres2="res2";

    public static void  main(String[] args) {
        Thread lock1 = new Thread(new Lock1());
        lock1.start();
        Thread lock2 = new Thread(new Lock2());
        lock2.start();
    }

    static class Lock1 implements Runnable {

        @Override
        public void  run() {
            synchronized(DeadLock.res1) {
                System.out.println("thread-1 locked res1");
                try{
                    Thread.sleep(300);
                    synchronized(DeadLock.res2) {
                        System.out.println("thread-1 locked res2");
                    }
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static class Lock2 implements Runnable {

    @Override
    public void run() {
        synchronized(DeadLock.res2) {
            System.out.println("thread-2 locked res2");
            try{
                Thread.sleep(300);
                synchronized(DeadLock.res1) {
                    System.out.println("thread-2 locked res1");
                }
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
      }
    }
}

要防止死锁,最重要的技术是避免不必要的同步。如果有其它方法可以确保线程安全,比如让对象不可变或保存对象的一个局部副本。如果确实要使用同步,要保持同步块尽可能小,而且尽量不要一次同步多个对象。

相关文章

  • Java中的死锁(DeadLock)

    同步会导致另一个可能的问题就是死锁(deadlock)。如果两个线程需要独占访问统一的一个资源集,而每个线程分别有...

  • java笔记——通过例子理解死锁的定义

    通过例子理解死锁的定义 代码:Deadlock.java DeadlockTest.java (2)代码:Dead...

  • Java多线程之死锁(Deadlock)及死锁避免(Deadlo

    线程死锁(Thread Deadlock) 数据库死锁(Database Deadlocks) 死锁避免 (Dea...

  • 死锁

    第11章:死锁和进程通信 死锁概念 死锁处理方法 死锁预防(Deadlock Prevention) 死锁避免(D...

  • 死锁(DeadLock)

    所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用...

  • 死锁 deadLock

    什么是死锁 如果两个线程互相持有对方获得的锁 并尝试获得对方的那把锁 就会造成死锁 死锁的示例代码 死锁如何使用j...

  • JavaSE Day18 多线程

    1. 什么是死锁?英语怎么拼? Deadlock 两个或者多个线程永远阻塞,相互等待对方释放资源 2. Java ...

  • GCD解析

    死锁(Deadlock) 在串行队列中,当前队列的调度块内(包含嵌套)调用当前队列的同步任务会死锁异步调度块要等自...

  • iOS/Swift多线程之---如何避免数据竞争(Data ra

    多线程编程中, 常见的问题有 死锁Deadlock死锁指的是由于两个或多个执行单元之间相互等待对方结束而引起阻塞的...

  • 慕课网高并发实战(十)- 死锁

    死锁发生的必要条件 package com.mmall.concurrency.example.deadLock;...

网友评论

      本文标题:Java中的死锁(DeadLock)

      本文链接:https://www.haomeiwen.com/subject/qadpvttx.html