java 并发 饥饿锁(阻塞导致死锁)案例

本文参考自大佬 公众号:路人甲java
添加链接描述

饥饿是指某一个或者多个线程因为种种原因无法获得所要的资源,导致一直无法执行。比如它的优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致低优先级线程无法工作

package juc;

import java.util.concurrent.*;

/**
 * @author yanjun.liu
 * @date 2020/6/19--17:57
 * 饥饿锁
 */
public class A {
    /**
     * 获取一个单例线程池,只有一个线程,任何有序执行,先到先执行
     * 这个线程会保证你的任务执行完成,如果当前线程意外终止,会创建一个新线程继续执行任务
     */
    private  static ExecutorService single=Executors.newSingleThreadExecutor();
    public static class  AnotherCallable implements Callable<String>{
        @Override
        public String call() throws Exception {
            System.out.println("in AnotherCallable");
            return "another- success";
        }
    }
    public static class MyCallable implements Callable<String>{
        @Override
        public String call() throws Exception {
            System.out.println("in MyCallable");
            //因为线程池中只有一个线程,执行下一行代码的时候,需要重新启动一个线程去执行
            //但是唯一的线程已经被new MyCallable();所占用,所以下面一行代码,没有线程,也就无法继续往下执行,线程阻塞(程序死锁)
            Future<String> submit = single.submit(new AnotherCallable());
            return submit.get();
        }
    }
    public static void main(String[] args) throws Exception {
        MyCallable myCallable = new MyCallable();
        Future<String> submit = single.submit(myCallable);
        System.out.println(submit.get());
        System.out.println("over");
        single.shutdown();
    }
}

最后执行结果

in MyCallable

newSingleThreadExecutor 创建只有一个线程的线程池,看看它的构造函数
初始线程数为1,最大线程数1,空闲线程数在多长时间内没任务会被回收参数为0,new LinkedBlockingQueue(),如果不指定容量,默认为Integer.MAX_VALUE,也就是无界队列,一直可以放,直至内存爆炸。。。,可以手动设置大小避免

根据线程池的执行顺序,初始线程不够用,放队里,队里不够用,创建最大线程数,最大线程数满了,使用拒绝策列,拒绝任务,所以这个线程池,只会有一个线程执行

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值