240 发简信
IP属地:江苏
  • 非常感谢你的文章!如果没有这篇文章,可能我还得看很久才能理出头绪。非常感谢!
    有几处我看到的和文章中说的不一样。写下来,可做讨论:
    1. workQueues的偶数位置(外部提交的任务)是不配线程的。它们是shared的,就是总是被偷去执行的。
    2. 外部提交的任务不是随机找位置的,是确定的。每个线程维护一个数(probe),只要这个数不变,每次提交任务都到同一个任务队列;如果那个队列太忙了,就会提交失败,这时候就把数变一下,重新提交,直到成功,将来的任务也都会提交到这个新地方。
    3. 子任务fork()出来的新任务永远放在执行它的worker所拥有的队列里。如果它不被偷,就是原来的队列;如果被偷了,就是偷窃者的队列。
    4. 新的任务队列及其对应的worker线程的产生是被动的方式:每当有新任务来的时候,都会调用signalWork()方法。这个方法检查当前的线程是否够用,如果不够用,就释放一个闲置线程(idle worker);如果没有闲置线程,就创建一个新线程。新线程创建后,配给它一个新建的任务队列,然后在workQueues里找一个合适的位置(奇数位置)把任务队列放进去,这个位置不是随机的,而是算出来的:从上一次新建队列的位置向后移动一个固定的偏移量。
    5. 补偿线程的意思是:一个线程执行join()的时候知道自己注定要去block了,因此唤醒或者新建一个线程补偿自己block之后的算力损失。

  • 120
    JUC源码分析-线程池篇(五):ForkJoinPool - 2

    通过上一篇(JUC源码分析-线程池篇(四):ForkJoinPool - 1)的讲解,相信同学们对 ForkJoinPool 已经有了一个大概的认识,本篇我们将通过分析源码的...

  • 120
    Disruptor详解

    Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题。与Kafka、RabbitMQ用于服务间的消息队列不同,disrupto...

  • 120
    grpc之http2协议

    gRPC 是基于 HTTP/2 协议的,要深刻理解 gRPC,理解下 HTTP/2 是必要的。 演进 http2.0的前世是http1.0和http1.1这两兄弟。虽然之前仅...

  • 看一下源码,一个是Object 一个是ObjectFactory,把三级放到一级的时候singletonFactory.getObject()了。

    spring为什么要使用三级缓存解决循环依赖

    一 spring为什么要使用多级缓存 首先清楚spring中bean 的加载过程: 1 解析需要spring管理的类为beanDefinition 2 通过反射实例化对象 3...

  • 有一说一要弄懂,需要学习一下epoll的知识才行

    java NIO 运行原理介绍

    开篇 回想研究生期间在H3C做项目的时候第一次接触epoll的异步事件,心血来潮看了下java的NIO的实现,希望同样感兴趣的人一起看看。Netty是java NIO的集大成...

  • 写的挺不错,把事件的意义说了,就是发现用不用事件都可以读写,就很奇怪

    NIO SelectionKey事件理解

    在Java NIO编程中,我们可以在通道上注册OP_ACCEPT,OP_CONNECT,OP_READ,OP_WRITE,下面我们分别看下各种事件在源码中的注释说明: OP_...

  • 这好像是我第二次看了,但是这一次懂了更多了,所以看起来感触更多了

    Spring中的aware接口

    Spring中有很多继承于aware中的接口,这些接口到底是做什么用到的。 aware,翻译过来是知道的,已感知的,意识到的,所以这些接口从字面意思应该是能感知到所有Awar...

  • 俺也一样

    Java Agent简介

    这个是之前写类加载器篇时候挖的坑,来填坑了。 引言 以前在做后台服务开发的时候,SpringBoot每次改动代码都需要手动重启才能生效,感觉贼麻烦,后来使用Spring提供的...

  • 大哥,你也太吊了

    Java 注解处理器 (Annotation Processor)

    Java 中的注解(Annotation) 是一个很方便的特性在Spring当中得到了大量的应用 , 我们也可以开发自己的注解来提高我们的开发效率之前自己开发过很多运行时通过...

  • 代码缩进一下,看起来会更好

    ConcurrentHashMap底层实现原理(JDK1.7 & 1.8)

    前言 我们都知道HashMap在多线程情况下,在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新ha...

  • 120
    @validated注解实现

    用法 @validated和@valid不同点 在spring项目中,@validated和@valid功能很类似,都可以在controller层开启数据校验功能。但是@va...

  • 兄弟,写的真的不错

    [Elasticsearch](四)SpringBoot整合Elasticsearch的方式(TransportClient、Data-ES、Elasticsearch SQL、REST Cli...

    目录: https://github.com/dolyw/ProjectStudy/tree/master/Elasticsearch 项目地址 Github:https:/...

  • [Elasticsearch](四)SpringBoot整合Elasticsearch的方式(TransportClient、Data-ES、Elasticsearch SQL、REST Cli...

    目录: https://github.com/dolyw/ProjectStudy/tree/master/Elasticsearch 项目地址 Github:https:/...

  • 等于没说

    ES(elasticsearch)搜索引擎

    什么是搜索? 根据一个搜索词,检索出所有包含该词的数据例如:用户在搜索框输入一个词,客户端软件发送一个请求到后台,后台通过sql语句从数据库中找出相关条目(数据库会一条一条的...

  • 120
    Netty入门教程——认识Netty

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。Netty 是一个广泛使用的 J...

  • 120
    Java泛型详解

    一,打破砂锅问到底 泛型存在的意义?泛型类,泛型接口,泛型方法如何定义?如何限定类型变量?泛型中使用的约束和局限性有哪些?泛型类型的继承规则是什么?泛型中的通配符类型是什么?...

  • 这个最好从源头理解:
    ->AbstractAutowireCapableBeanFactory.initializeBean
    实例化bean的时候调用
    ->AbstractAutowireCapableBeanFactory.invokeAwareMethods

    private void invokeAwareMethods(final String beanName, final Object bean) {
    if (bean instanceof Aware) {
    if (bean instanceof BeanNameAware) {
    ((BeanNameAware) bean).setBeanName(beanName);
    }
    if (bean instanceof BeanClassLoaderAware) {
    ClassLoader bcl = getBeanClassLoader();
    if (bcl != null) {
    ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
    }
    }
    if (bean instanceof BeanFactoryAware) {
    ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
    }
    }
    }