文档章节

解决线程死锁问题

miring
 miring
发布于 2017/02/28 10:41
字数 549
阅读 2
收藏 0
点赞 0
评论 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
长春
程序员
【Java基础】线程同步教程

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

Auhgnahz
2015/12/22
17
0
Java多线程学习:线程基础(二)

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

HenrySun
2016/04/11
8
0
java并发编程(九): 避免活跃性危险

避免活跃性危险: 本部分讨论活跃性故障的原因,及如何避免它们。 死锁: 典型的哲学家进餐问题。 锁顺序死锁: 如上面哲学家进餐有可能发生下面的情况: 上面发生死锁的根本原因在于两个线程...

ihaolin
2014/04/04
0
7
Java线程面试问题

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。那么你就应该准备很多关于多线程的问题,一般面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多...

沧海为水
2016/11/28
127
0
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
0
0
【转】15个顶级Java多线程面试题及回答

Java 线程面试问题   在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务...

一只死笨死笨的猪
2014/09/30
0
0
线程同步与死锁

一.多线程共享数据 在多线程的操作中,多个线程有可能同时处理同一个资源,这就是多线程的共享数据。 二.线程同步 解决数据共享的安全问题,必须使用同步,所谓同步就是指多个线程在同一个时...

tank_99
2016/11/22
0
0
突发奇想-怎么写一个死锁?

刚把手头上的项目代码撸完,闲来看看博客,然后就看到了线程这块的东西。之前有简单的记录过线程和进行的零碎知识。 JAVA基础知识系列---进程、线程安全 看着看着就想着怎么能写一个死锁呢,...

glmapper
2017/12/11
0
0
java并发编程——死锁

第一部分:概述 我们用经典的“哲学家进餐”问题来理解死锁的概念。五个哲学家坐在一个圆桌旁,他们一共只有五根筷子(不是五双),每两人中间有一根筷子,他们时而思考,时而吃饭,吃完以后...

isam
2016/05/27
71
2
线程死锁一引起的系列思考

发生死锁必须具备以下的4个条件 1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资...

梦想游戏人
2016/04/07
63
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
17分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
23分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
24分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
26分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
29分钟前
0
0
python连接mysql数据库

安装好必要的pymysql插件 pip install pymysql 写好配置文档 DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), #......

南桥北木
31分钟前
0
0
linux下安装 Zookeeper

Zookeeper 注册中心安装 安装: wget http://www.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gztar zxvf zookeeper-3.3.3.tar.gzcd zookeeper-3.3.3cp conf/zoo_......

颖辉小居
33分钟前
0
0
C#判断文件的真实类型(非扩展名判断)

public static void CheckFileType() { string path = @"D:\word.doc"; System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read); ......

Lytf
34分钟前
0
0
java - 把日志生成到指定目录

1.按天小时生成日志文件 log4j.appender.ruiming.DatePattern='_'yyyy-MM-dd-HH 2.最大日志文件数据 log4j.appender.ruiming.MaxBackupIndex=100 3.下图画圈圈的很关键,是生成到知道目录必备...

轻量级赤影
35分钟前
0
0
少走弯路,给Java 1~5 年程序员的建议

今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。 在大家看之前,LZ要先声...

Java填坑之路
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部