博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java死锁
阅读量:4953 次
发布时间:2019-06-12

本文共 2262 字,大约阅读时间需要 7 分钟。

死锁:

  官方表达:线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源。两条线程都无法继续执行。

  大白话:两个线程1、2,两个资源one、two,线程1抢占到了资源one,同时等待内嵌的资源two的执行。同理线程2抢占到了资源two,同时等待内嵌的资源one的执行。由于线程2无法放弃所拥有的的资源two的锁,导致线程1无期限等待,同时线程2也无限期等待线程1释放资源one。由此产生“死锁”。

示例代码:()

package com.thread;public class DeathThreadDemo {    public static void main(String[] args) {        DeadLock dt0 = new DeadLock(0);        DeadLock dt1 = new DeadLock(1);        new Thread(dt0).start();        new Thread(dt1).start();    }}class DeadLock implements Runnable {    private int value;    private static Object o1 = new Object(), o2 = new Object();    public DeadLock(int value) {        this.value = value;    }    public void run() {        if (value == 0) {            synchronized (o1) {                try {                    Thread.sleep(3000);                    for (int i = 11; i < 20; i++) {                        System.out.println("o1" + i);                    }                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                synchronized (o2) {                    System.out.println("o2" + value);                }            }        }        if (value == 1) {            synchronized (o2) {                try {                    Thread.sleep(3000);                    for (int i = 1; i < 10; i++) {                        System.out.println("o2" + i);                    }                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                synchronized (o1) {                    System.out.println("o1" + value);                }            }        }    }}

注意:

示例中写的很明显,资源互相嵌套,互相牵制,从而导致死锁,实际中,很多Java API内部方法用到了同步锁,这时就要小心了。

例如:

/**     * Prints a String and then terminate the line.  This method behaves as     * though it invokes {
@link #print(String)}
and then * {
@link #println()}
. * * @param x The String to be printed. */ public void println(String x) { synchronized (this) { print(x); newLine(); } }

以上代码是习以为常的 System.out.println(“打印”); 中println() 的源码。用到了同步方法。

转载于:https://www.cnblogs.com/x-jingxin/p/10621639.html

你可能感兴趣的文章
linux下的C语言快速学习—进程和文件
查看>>
电源防反接保护电路
查看>>
stm32 堆和栈(stm32 Heap & Stack)
查看>>
SpringMVC从入门到精通之第三章
查看>>
JS基础-dom操作
查看>>
【转】Android详细的对话框AlertDialog.Builder使用方法
查看>>
Unite Beijing 2015大型活动
查看>>
loading加载的代码
查看>>
PHP框架CI CodeIgniter 的log_message开启日志记录方法
查看>>
arraylist
查看>>
关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结
查看>>
zoj 1649 Rescue (BFS)(转载)
查看>>
371. Sum of Two Integers java solutions
查看>>
2124: 等差子序列 - BZOJ
查看>>
3529: [Sdoi2014]数表 - BZOJ
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
在程序被送入后台时,向 iOS 借点时间,来完成一个长期任务
查看>>
【设计模式】工厂模式
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>