美文网首页
线程饥饿锁

线程饥饿锁

作者: 黄殿玺 | 来源:发表于2020-09-25 23:10 被阅读0次

java并发编程实战(Brian Goetz)中描述:


image.png

结论1:在线程池中,如果任务依赖于其他任务,那么可能产生死锁。
结论2:在单线程池中,如果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交的任务结果,那么通常会引发死锁。

先验证结论2

package java_concurrent;

import java.util.concurrent.*;

public class ThreadDeadlock {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //同一个线程池
        ExecutorService es = Executors.newFixedThreadPool(1);

        Future f = es.submit(new RenderPageTask(es));
        System.out.println("s1");
        System.out.println(f.get());
        System.out.println("s4");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        es.shutdown();
    }

}

//任务1
class RenderPageTask implements Callable<String>{

    ExecutorService es;

    public RenderPageTask(ExecutorService es){
        this.es = es;
    }

    @Override
    public String call() throws Exception {
        System.out.println("task1 call....");
        Future<String> header, footer;
        header = es.submit(new LoadFileTask(es, "header.html"));
        System.out.println("s2");
        //将发生死锁因为,由于任务等待子任务的结果
        String h = header.get();
        System.out.println("s3");
        return h;
    }
}

//任务2
class LoadFileTask implements Callable<String>{
    ExecutorService es;
    String s;

    public LoadFileTask(ExecutorService es, String s){
        this.es = es;
        this.s = s;
        System.out.println(s);
    }

    @Override
    public String call() throws Exception {
        System.out.println("task2 call....");
        return this.s;
    }
}

输出结果是

相关文章

  • 线程饥饿锁

    java并发编程实战(Brian Goetz)中描述: 结论1:在线程池中,如果任务依赖于其他任务,那么可能产生死...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • java多线程-7-ReentrantReadWriteLock

    概述 成功获取读锁(含读锁重入),会有自旋锁(CLH,无饥饿)特性,传递唤醒队列线程直到写锁或队尾 释放锁时比较严...

  • java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

    死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地...

  • 死锁、活锁、饥饿锁、无锁

    死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地...

  • 高并发编程-05-活跃性问题

    死锁,饥饿,活锁 1,死锁 多个线程,各自占对方的资源,都不愿意释放,从而造成死锁 工具:使用jconsole可以...

  • 4.0.6.守护线程,线程死锁

    守护线程会随着主线程的结束而结束DaemonThread 线程 1, 线程 2,锁1,锁2 线程1 有锁1,想拿锁...

  • 003 线程活跃性 | 死锁 | 活锁 | 饥饿 | 无锁

    死锁 两个或多个线程相互等待对方释放锁,则会出现死锁现象。java虚拟机没有检测,也没有采用措施来处理死锁情况,所...

  • 悲观锁:一个线程得到锁,其它线程挂起,synchronized 乐观锁:一个线程得到锁,其它线程不断重试, cas...

  • sleep,wait, join yield

    锁池:所有需要竞争同步锁的线程都会放在锁池中,当一个线程得到锁后,其他线程都会在锁池中等待,当线程释放锁之后,其他...

网友评论

      本文标题:线程饥饿锁

      本文链接:https://www.haomeiwen.com/subject/pgrtjktx.html