文档章节

Java:一个简单的死锁实例

 旅人_t
发布于 2017/04/15 17:39
字数 373
阅读 12
收藏 0

    对于一个多线程程序,如果它的多个线程要使用同一部分资源,我们就可以使用某种加锁机制,比如sycrhronized方法,来防止多个线程同时使用这个资源。但使用加锁机制可能会导致死锁现象:当一个线程在执行某任务是需要等待另一个线程,而后者又要等待其它线程……最后一个线程又要等待第一个线程。这些线程都在等待其它线程释放锁,都没有执行完毕。

    下面是一个简单的死锁问题的演示代码。有两个类:TestDeadLock和RunnableImpl。TestDeadLock调用main()方法,RunnableImpl实现Runnable类。

TestDeadLock类:

package com.testDeadLock;

/**
 * Java 死锁实例
 * Created by 旅人_t on 2017/4/14.
 */
public class TestDeadLock {
    //主方法
    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        Object obj2 = new Object();
        Thread thread1 = new Thread(new RunnableImpl(obj1, obj2));
        Thread thread2 = new Thread(new RunnableImpl(obj2, obj1));

        thread1.setName("thread1");
        thread2.setName("thread2");

        thread1.start();
        Thread.sleep(1000);
        thread2.start();
    }//主方法结束
}

 

RunnableImpl类:

package com.testDeadLock;

/**
 * Java 死锁实例
 * Created by  旅人_t  on 2017/4/14.
 */
public class RunnableImpl implements Runnable {

    //声明变量
    private Object obj1, obj2;

    //构造方法
    public RunnableImpl(Object obj1, Object obj2) {
        this.obj1 = obj1;
        this.obj2 = obj2;
    }//构造方法结束

    @Override
    public void run() {
        String name = Thread.currentThread().getName();

        System.out.println(name + ": " + obj1 + " start");
        synchronized(obj1) {
            System.out.println(name + ": " + obj1 + " doing");
            doing();

            System.out.println(name + ": " + obj2 + " start");
            synchronized(obj2) {
                System.out.println(name + ": " + obj2 + " doing");
                doing();
            }//inner synchronized() end
            System.out.println(name + ": " + obj2 + " over");

        }//synchronized() end
        System.out.println(name + ": " + obj1 + " over");

    }//run() end

    private void doing() {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }//doing() end
}

 

© 著作权归作者所有

粉丝 0
博文 1
码字总数 373
作品 0
秦皇岛
私信 提问
java中高级大公司多线程面试题

1)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编...

java成功之路
2018/10/30
0
0
15个顶级Java多线程面试题及回答

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

LCZ777
2014/05/27
0
0
Java程序员面试中的多线程问题

摘要:很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题,这...

长平狐
2012/11/28
72
0
Java程序员面试中的多线程问题

很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题,这些问题...

长平狐
2012/11/12
64
0
【阿里面试系列】Java线程的应用及挑战

文章简介 上一篇文章【「阿里面试系列」搞懂并发编程,轻松应对80%的面试场景】我们了解了进程和线程的发展历史、线程的生命周期、线程的优势和使用场景,这一篇,我们从Java层面更进一步了解...

Java架构资源分享
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

跨域的理解,以及解决方案!

/*什么是跨域? * 跨域的主要原因是浏览器的同源策略。 * =>>所谓的同源策略就是A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。 * 什么是同源? * =>>同源就是协议相同、域名相同...

流年那么伤
6分钟前
1
0
Nginx配置try_fiels,php无法获取$_GET参数

平时开发都是用LNMP,新安装的虚拟机在配置nginx的rewrite的时候使用try_files命令。但是在写的时候配置成“try_files $uri $uri/ /index.php?q=args;”, 在PHP的web程序中,打印$_GET为空。...

叫我哀木涕
6分钟前
0
0
【原创】Microsoft Edge可以用localhost访问但无法用IP访问

Microsoft Edge可以用localhost和127.0.0.1访问但无法用本机IP访问, chrome ie都可以推测是edge的问题,网络是专用网络,防火墙也关了: 在edge里 按F12 以在控制台里看到这句 CONSOLE21301...

shzwork
7分钟前
0
0
Python利用数学方程式画4种不一样的心型图案

前言 下面这四个心型图案,是通过科学地计算,根据数学方程式生成的,虽然做的不是特别完美,但是基本的还是能实现的 第一个心型 结果图 第二心型 结果图 学习从来不是一个人的事情,要有个相互监...

A_裙232550246
7分钟前
0
0
微信带场景参数的二维码生成与使用?

微信公众号推广时,用户通过扫二维码关注公众号,需要统计用户是通过谁的二维码进行关注。 在用户扫码关注公众号时,二维码带上推广者的参数,在关注公众号后,获取到该推广者的参数。 目前有...

wxgzhgncj
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部