文档章节

解决线程死锁问题

miring
 miring
发布于 2017/02/28 10:41
字数 549
阅读 3
收藏 0

在编写多线程程序时,必须注意资源的使用问题。如果两个线程(多个线程时情况类似)分别拥有不同的资源,而同时又需要对方释放资源才能继续运行时,就会发生死锁。本实例演示了一种解决死锁的方式,实例运行效果如图 输入图片说明 编写类DeadLock,该类实现了Runnable接口。在run()方法中,由于去掉了一个同步块而解决了线程的死锁问题。 代码如下:

package com.mingrisoft.thread;

public class DeadLock implements Runnable {
    private boolean flag;// 使用flag变量作为进入不同块的标志
    private static final Object o1 = new Object();
    private static final Object o2 = new Object();
    
    public void run() {
        String threadName = Thread.currentThread().getName();// 获得当前线程的名字
        System.out.println(threadName + ": flag = " + flag);// 输出当前线程的flag变量值
        if (flag == true) {
            synchronized (o1) {// 为o1加锁
                try {
                    Thread.sleep(1000);// 线程休眠1秒钟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(threadName + "进入同步块o1准备进入o2");// 显示进入o1块
                System.out.println(threadName + "已经进入同步块o2");// 显示进入o2块
            }
            if (flag == false) {
                synchronized (o2) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(threadName + "进入同步块o2准备进入o1");// 显示进入o2块
                    synchronized (o1) {
                        System.out.println(threadName + "已经进入同步块o1");// 显示进入o1块
                    }
                }
            }
        }
    }
    
    public static void main(String[] args) {
        DeadLock d1 = new DeadLock();// 创建DeadLock对象d1
        DeadLock d2 = new DeadLock();// 创建DeadLock对象d2
        d1.flag = true; // 将d1的flag设置为true
        d2.flag = false; // 将d2的flag设置为false
        new Thread(d1).start();// 在新线程中运行d1的run()方法
        new Thread(d2).start();// 在新线程中运行d2的run()方法
    }
}

提示:对于4个同步块,去掉任何一个就可以解决死锁问题。 心法领悟:解决死锁的方法。 当具备以下4个条件时,就会产生死锁:资源互斥(资源只能供一个线程使用)、请求保持(拥有资源的线程在请求新的资源又不释放占有的资源)、不能剥夺(已经获得的资源在使用完成前不能剥夺)和循环等待(各个线程对资源的需求构成一个循环)。通常破坏循环等待是最有效的方法。

© 著作权归作者所有

共有 人打赏支持
miring
粉丝 0
博文 23
码字总数 14869
作品 0
长春
程序员
私信 提问
不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy 中导致死锁

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/)...

walter lv
2018/12/23
0
0
.NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/)...

walter lv
2018/12/23
0
0
【Java基础】线程同步教程

线程同步 线程同步是指多个线程对同一资源(同一对象、同一变量等)进行操作,就会产生线程同步的问题。 如下: package org.zhanghua.javase.demo.thread; /** * 线程同步演示 * * @author ...

Auhgnahz
2015/12/22
17
0
系统优化怎么做-JVM优化之开篇

大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/youhua 思否专栏:https://segmentfault.com/bl...

昌松
2018/08/21
0
0
Java多线程学习:线程基础(二)

一、线程的优先级别    线程优先级别的使用范例:   run()方法一结束,线程也就结束了。 二、线程同步    synchronized关键字的使用范例: 线程死锁的问题:   解决线程死锁的问题最...

HenrySun
2016/04/11
8
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象继承

第1章 面向对象 1.1 知识回顾 1.Java中的数据类型 2.引用数据类型String中的方法 3.IO流_读写文件 1.2 面向对象概念回顾 什么叫面向对象编程?有人是这么理解的 也有人说不对,面向对象编程是你...

stars永恒
27分钟前
0
0
Java-深入HashMap原理及内部存储结构

本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程。 public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 0; i ......

小刀爱编程
42分钟前
1
0
高并发和分布式中的幂等处理

概念 抽象概念 幂等(idempotent,idempotentce)是一个数学与计算机概念,常见于抽象代数中。 在计算机概念中,就是针对一个操作,不管做多少次,产生效果或返回的结果都是一样的。 场景距...

细节探索者
43分钟前
0
0
2019年1月份最新阿里内推Java后端面试题

阿里一面题目: osi七层网络模型,五层网络模型,每次层分别有哪些协议死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决如何判断链表有环虚拟机类加载机制,双亲委派模型...

别打我会飞
今天
2
0
MIT 6.828 main.c文件分析

#include <inc/x86.h>#include <inc/elf.h> /*这是一个简单粗略的boot loader,它唯一的工作就是从硬盘的第一个扇区启动格式为ELF的内核镜像硬盘布局这个程序(包括boot.S和mai...

FeanLau
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部