一个死锁的例子

先举个栗子。

/**
 * Created by Benjamin on 07/30/030.
 */
public class TestDeadLock implements Runnable {
    public int    flag = 1;
    static Object o1   = new Object(), o2 = new Object();

    @Override
    public void run() {
        System.out.println("flag = " + flag);
        if (flag==1){
            synchronized (o1) {
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println("1");
                }
            }
        }

        if (flag==0){
            synchronized (o2){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println("0");
                }
            }
        }
    }

    public static void main(String[] args) {
        TestDeadLock t1 = new TestDeadLock();
        TestDeadLock t2 = new TestDeadLock();
        t1.flag = 1;
        t2.flag = 0;
        new Thread(t1).start();
        new Thread(t2).start();
    }
}
产生死锁的原因主要是:
  • 系统资源不足
  • 资源分配不当
  • 推进顺序不合适
产生死锁的四个必要条件:
  • 互斥:一个资源每次只能被一个进程使用
  • 资源保持:一个进程被阻塞时,不释放已有资源
  • 不可抢占:正在使用的资源不能被剥夺
  • 循环等待:循环等待未被分配的资源
例子死锁的原因:

静态对象o1和o2是类的资源。当flag=1的线程请求到o1资源时,再申请资源o2时,o2资源已经被flag=0的线程占有,并且后者需要申请资源o1才能继续执行。这样,二者就形成了相互等待的情形,故而形成死锁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、竞态条件: 定义:竞态条件指的是一种特殊的情况,在这种情况下各个执行单元以一种没有逻辑的顺序执行动作,从而导致...
    Hughman阅读 5,129评论 0 7
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,473评论 11 349
  • 知识点:一. 什么是线程: 进程是指运行中的应用程序,每一个进程都有自己独立的内存空间。一个应用程序可以同时启动多...
    木有鱼丸啦阅读 3,821评论 0 0
  • 1) 煮一杯温酒, 君可初饮否? 啖食青梅挽香溢, 覆手难弃, 此去盼佳期。 2) 煮一杯温酒, 君可复饮否? 又...
    季末未盈阅读 4,162评论 0 0
  • 佩琦发微信跟我吐槽,比如佩琦妈妈爱在旁人面前议论她的私事,比如她觉得在家得不到她想要的关爱,比如她想有个完完全全属...
    麦子飞呀飞阅读 851评论 0 0