![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础
文章平均质量分 85
紫枫231
这个作者很懒,什么都没留下…
展开
-
ribbon服务列表和nacos服务列表不一致的问题
背景在学习ribbon和nacos的时候,发现当手动把服务实例下线后,nacos的服务列表已更新,但是ribbon拉取的服务列表还未更新,为了解决这个问题,我们先来了解一下他们各自的服务更新机制问题解析首先大家先思考两个问题:1,nacos是怎么拉取服务的?2,ribbon是怎么拉取服务的?在这里先明确一下:这里的拉取服务实例是一个懒加载的过程,也就是说在第一次请求的时候才会去拉取服务实例首先我们先来看下ribbon是怎么拉取服务实例的//这里是LoadBalancerFeignCli原创 2022-04-28 17:40:21 · 1637 阅读 · 9 评论 -
并发编程-ThreadLocal原理解析及内存泄露问题
ThreadLoccal基本介绍应用场景分析源码解析存在的坑和注意事项总结基本介绍什么是ThreadLocal?首先我们引用下ThreadLocal的源码注释This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one has its own, independently initializ原创 2021-11-11 19:14:55 · 335 阅读 · 0 评论 -
并发编程-读写锁ReentranReadWriteLock应用场景及源码解析
目录前言读写锁介绍什么是读写锁特性具体实现前言假设你现在需要实现这样一个需求给你一个Map集合(共享资源),实现如下需求可以允许两个线程同时调用Map的get方法读取数据不允许两个线程同时调用Map的put方法修改数据不允许两个线程一个调用put方法,一个调用get方法,也就是说当一个线程调用put方法时,另一个想调用get方法的线程需要阻塞等put方法完成你会如何实现?这里可能会有同学想到用ConcurentHashMap,确实ConcurentHashMap可以满足第一点和第二点原创 2021-11-08 17:27:39 · 415 阅读 · 0 评论 -
并发编程-Condition实现阻塞队列及源码解析
目录前言实践源码解析前言上篇文章我们使用了wait¬ify实现阻塞队列实现了一个阻塞队列,今天我们来看看如何用ReentrantLock的Condition对象来实现阻塞队列实践public static void main(String[] args) { ConditionQueue conditionQueue = new ConditionQueue(5); for (int i = 0; i < 10; i++) {原创 2021-11-01 17:30:03 · 189 阅读 · 1 评论 -
并发编程-LockSupport和wait¬ify的区别
目录LcokSupport定义常用的方法和基本原理了解应用LcokSupport定义LockSupport是一个在JUC包里的线程阻塞工具类,所有的方法都是静态方法,主要用途是让线程在任意位置阻塞,广泛应用在AQS和各种JUC的锁中常用的方法和基本原理了解public static void park(Object blocker); // 暂停当前线程public static void parkNanos(Object blocker, long nanos); // 暂停当前线程,不过原创 2021-10-19 16:40:15 · 599 阅读 · 0 评论 -
并发编程-ReentrantLock加锁解锁源码详细解析
这里写自定义目录标题AQS**加锁源码**新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入AQS当我们构造一个ReentrantLock对象的时候,可以通过传入一个布尔值来指定公平锁还是非公平锁,进入源码可以发现区别是n原创 2021-10-14 18:40:40 · 402 阅读 · 2 评论 -
线程池执行原理解析和参数设置
前言上一篇文章我们解决了父子线程数据传递的问题线程池中父子线程传递信息的问题但是文章所用线程池设置的拒绝策略会导致在任务过多的情况下取出的用户信息依然为空,这个是为什么呢?该怎么解决呢?下面我们可以通过源码来分析一下原理原理首先我们先来回顾下自定义线程池时的拒绝策略当线程池的任务队列满了之后(一般都是有界队列), 并且线程数也已经达到了最大线程数,此时就会执行拒绝策略目前JDK提供了四种拒绝策略AbortPolicy: 丢弃任务,并抛出 RejectedExecutionExcep原创 2021-09-29 16:20:29 · 190 阅读 · 0 评论 -
线程池中父子线程数据传递的问题
使用线程池执行任务时,子线程也需要获取用户信息,因为我们使用的是spring的security框架,取出用户信息的方法如下: User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 子线程调用以上方法取出的user信息为null,为什么为null,看下源码发现用户信息是从当前线程的threadlocal中取的,只有主线程设置过user信息//SecurityContextH原创 2021-09-26 18:24:51 · 840 阅读 · 0 评论 -
Stream的Collectors.groupingBy支持key为null
Stream的Collectors.groupingBy支持key为null进行分组场景在使用Collectors.groupingBy分组时,如果分组的字段中有值为null,会抛出空指针异常例如:// An highlighted blockcalss User{ private Integer age; private String sex;}public static void main(String[] args){ User user1 = new User(18, "女")原创 2020-09-01 16:59:17 · 18055 阅读 · 2 评论