46 Matching Annotations
  1. Dec 2023
    1. 对于多个线程访问共享资源出现数据混乱的问题,需要进行线程同步

      所谓的共享资源:其实就是一块内存,有三个线程,其中a线程和b线程在同一个时间点去往这个内存里面写数据,与此同时呢,c线程它从这个内存里边呢读数据。所谓的共享资源就是多个线程共同访问的变量,这些变量通常为全局数据区变量或者堆区变量,这些变量对应的共享资源也被称之为临界资源。

  2. Dec 2022
    1. 一个多线程程序的渐次瓦房店过程通常是这样的:开始,熟悉各种锁和内存栅的老手搭了易于维护的高性能架子出来,然后非熟练技工往上增加功能后无法解决神秘的死锁,只得把细粒度锁换成了对象锁,而最后接手的转码小工索性把对象锁全拆了改全局锁,然后破口大骂线程库:啥破玩意为什么只有一颗CPU在工作
  3. Aug 2022
    1. 换句话说线程在跑

      线程是gc root,然后线程又是引用了外部的线程池,只要线程不被回收(核心线程在allowCoreThreadTimeOut为false的情况下不会被回收),那么线程池也不会被回收。

    2. 线程在跑

      线程是gc root,然后线程又是引用了外部的线程池,只要线程不被回收(核心线程在allowCoreThreadTimeOut为false的情况下不会被回收),那么线程池也不会被回收。

    3. 任何时候,都应该为自定义线程池指定有意义的名称,以方便排查问题
    4. 禁止使用这些方法来创建线程池,而应该手动 new ThreadPoolExecutor 来创建线程池
    1. 会根据用每个线程的 thread 的一个实例字段 threadLocalRandomProbe 是否为 0 来判断是否当前线程实例是否为第一次调用随机数生成方法,从而决定是否要给当前线程初始化一个随机的 threadLocalRandomSeed 种子值

      current()会初始化一个随机的种子,而跳过了,就只能用一个固定的值

    1. THREAD(线程隔离):使用该方式,HystrixCommand将会在单独的线程上执行,并发请求受线程池中线程数量的限制。SEMAPHORE(信号量隔离):使用该方式,HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受信号量的个数的限制。
  4. Apr 2022
    1. 使用了消息队列的方案(具体实现见 comm/messagequeue 目录),把绝大多数非阻塞操作放到消息队列里执行。并且规定,基础组件与调用方之间的交互必须1. 尽快完成,不进行任何阻塞操作;2. 单向调用,避免形成环状的复杂时序。消息队列的引入很好的改善了死锁问题,但消息队列的线程模型中,我们还是不能避免存在需要阻塞的调用,例如网络操作。在未来的尝试中,我们计划引入协程的方式,将线程模型尽可能的简化。

      线程模型、 消息队列、 非阻塞操作、 基础组件、 调用方、 单向调用、 环状的复杂时序。

      消息队列的线程模型。

      阻塞的调用,如:网络操作。

      阻塞,与非阻塞的区分,是在于哪里?