java - 多线程死锁测试

 纤沙湖之歌 发布于 2022-10-26 20:34
package test;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * Created by rhwayfun on 16-4-3.
 */
public class ThreadTest {

    private static DateFormat format = new SimpleDateFormat("HH:mm:ss");

    public synchronized void tryOther(ThreadTest other) throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " enter tryOther method at " + format.format(new Date()));      
        System.out.println(Thread.currentThread().getName() + " tryOther method is about to invoke other method at " + format.format(new Date()));
        other.other();
    }

    public synchronized void other() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " enter other method atatatatat " + format.format(new Date()));
    }

    public static void main(String[] args) throws InterruptedException {
        final ThreadTest d1 = new ThreadTest();
        final ThreadTest d2 = new ThreadTest();

        Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    d1.tryOther(d2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "threadA");

        Thread t2 = new Thread(new Runnable() {
            public void run() {
                try {
                    d2.tryOther(d1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "threadB");

        t1.start();
        //让threadA先运行一秒
        TimeUnit.SECONDS.sleep(1);
        t2.start();

    }
}

如上,随便找的产生死锁的代码,问题:
TimeUnit.SECONDS.sleep(1);加上这行后,不存在死锁问题。sleep并不释放锁,为何这边死锁情况会消失。
输出结果为:
threadA enter tryOther method at 15:37:39
threadA tryOther method is about to invoke other method at 15:37:39
threadA enter other method atatatatat 15:37:39
threadB enter tryOther method at 15:37:40
threadB tryOther method is about to invoke other method at 15:37:40
threadB enter other method atatatatat 15:37:40

注掉这行,正常死锁。
输出结果为:
threadB enter tryOther method at 15:37:10
threadA enter tryOther method at 15:37:10
threadB tryOther method is about to invoke other method at 15:37:10
threadA tryOther method is about to invoke other method at 15:37:10

3 个回答
  • 自己突然知道为什么了,懒得删帖子了。写下我的看法,如果有错,欢迎指正,轻喷
    在没有sleep时,a线程启动,完成tryOther方法,释放锁并去执行other方法,此时b获得锁执行tryOther方法,
    此时a在other方法中所需资源被b线程锁住,b在执行完tryOther后需要获得a资源,由此产生死锁。

    加上sleep后。在a执行tryOther方法释放锁,此时b线程并没有执行,此时顺利获得other锁。2s后b线程执行,
    无死锁环境。

    2022-10-27 01:18 回答
  • 双方在争同一把锁,不会死锁啊

    2022-10-27 01:18 回答
  • 线程A拿到tryOther锁但是他还要得到other的锁
    线程B拿到tryOther的锁但是他还要拿到other的锁
    有可能A刚刚释放锁B也刚刚释放tryOther的锁.
    此时但是他们同时都想要获取other的锁 此时谁也不让谁 发生死锁
    解决方法让俩个线程不要同时去抢第二把锁.让A停一会
    但是如果你把时间调成纳秒级别 多次尝试也会发生死锁
    不建议这样预防死锁.如果并发量高的情况下.

    2022-10-27 01:18 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有