小灰灰-58
昨夜西风凋碧树,独上高楼,望尽天涯路。。
展开
-
分页多线程处理大批量数据
因为需要从一个返利明细表中获取大量的数据,生成返利报告,耗时相对较久,作为后台任务执行。但是后台任务如果不用多线程处理,也会要很长时间才能处理完。另外考虑到数据量大,不能一次查询所有数据在内存中处理,为了防止内存溢出,分页查询数据,然后分批次多线程处理。原创 2024-03-20 13:01:16 · 509 阅读 · 0 评论 -
并发编程(九)——集合相关面试问题
TreeNode中不但包含了红黑树的parent,left,right,red之外,还有维护的prev,以及继承自父类的next。而且在ConcurrentHashMap的有参构造中,虽然可以穿度一个负载因子的参数,但是无法修改他,在有参构造的逻辑里,仅仅是拿着传入的loadFactor计算初始数组的长度。在协助扩容前,有几个判断,主要是判断扩容是否结束,以及协助扩容的线程是否已经达到最大值的这两个判断,这两个判断没有将扩容标识戳做左移操作,就直接与sizeCtl做判断了,这种判断是没有任何意义的。原创 2024-01-31 14:15:29 · 381 阅读 · 0 评论 -
ThreadLocal使用及应用场景分析
定义提供线程局部变量;一个线程线程局部变量在多个线程中,分别有独立的值(副本)。特点简单(开箱即用)、快速(无额外开销)、安全(线程安全)。场景多线程场景(资源持有、线程一致性、并发计算、线程安全等场景)。实现原理Java中用哈希表实现。应用范围几乎所有提供多线程特征的语言。原创 2024-01-22 09:20:33 · 652 阅读 · 0 评论 -
并发编程(八)——异步编程
FutureTask是一个可以取消异步任务的类。FutureTask对Future做的一个基本实现。可以调用方法区开始和取消一个任务。一般是配合Callable去使用。异步任务启动之后,可以获取一个绑定当前异步任务的FutureTask。可以基于FutureTask的方法去取消任务,查看任务是否结果,以及获取任务的返回结果。FutureTask内部的整体结构中,实现了RunnableFuture的接口,这个接口又继承了Runnable, Future这个两个接口。原创 2024-01-19 12:39:31 · 438 阅读 · 0 评论 -
并发编程(七)——JUC并发工具
CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。需要一个并发安全的计数器来操作。CountDownLatch就可以实现。给CountDownLatch设置一个数值。可以设置3。每个业务处理完毕之后,执行一次countDown方法,指定的3每次在执行countDown方法时,对3进行-1。主线程可以在业务处理时,执行await,主线程会阻塞等待任务处理完毕。原创 2024-01-14 21:58:42 · 220 阅读 · 0 评论 -
并发编程(六)——并发集合
红黑树是一种特殊的平衡二叉树,首选具备了平衡二叉树的特点:左子树和右子数的高度差不会超过1,如果超过了,平衡二叉树就会基于左旋和右旋的操作,实现自平衡。每个节点必须是红色或者黑色。根节点必须是黑色。如果当前节点是红色,子节点必须是黑色所有叶子节点都是黑色。从任意节点到每个叶子节点的路径中,黑色节点的数量是相同的。当对红黑树进行增删操作时,可能会破坏平衡或者是特性,这是红黑树就需要基于左旋、右旋、变色来保证平衡和特性。原创 2024-01-06 17:51:37 · 408 阅读 · 0 评论 -
并发编程(五)——线程池
首先ThreadPoolExecutor中,一共提供了7个参数,每个参数都是非常核心的属性,在线程池去执行任务时,每个参数都有决定性的作用。但是如果直接采用JDK提供的方式去构建,可以设置的核心参数最多就两个,这样就会导致对线程池的控制粒度很粗。所以在阿里规范中也推荐自己去自定义线程池。手动的去new ThreadPoolExecutor设置他的一些核心属性。自定义构建线程池,可以细粒度的控制线程池,去管理内存的属性,并且针对一些参数的设置可能更好的在后期排查问题。原创 2024-01-06 17:31:40 · 992 阅读 · 0 评论 -
并发编程(四)——阻塞队列
首先PriorityBlockingQueue是一个优先级队列,他不满足先进先出的概念。会将查询的数据进行排序,排序的方式就是基于插入数据值的本身。如果是自定义对象必须要实现Comparable接口才可以添加到优先级队列排序的方式是基于二叉堆实现的。底层是采用数据结构实现的二叉堆。优先级队列PriorityBlockingQueue基于二叉堆实现的。PriorityBlockingQueue是基于数组实现的二叉堆。二叉堆是什么?二叉堆就是一个完整的二叉树。任意一个节点大于父节点或者小于父节点。原创 2024-01-06 13:50:41 · 946 阅读 · 0 评论 -
并发编程(三)——锁
AQS就是AbstractQueuedSynchronizer抽象类,AQS其实就是JUC包下的一个基类,JUC下的很多内容都是基于AQS实现了部分功能,比如ReentrantLock,ThreadPoolExecutor,阻塞队列,CountDownLatch,Semaphore,CyclicBarrier等等都是基于AQS实现。首先AQS中提供了一个由volatile修饰,并且采用CAS方式修改的int类型的state变量。原创 2024-01-05 21:39:14 · 1132 阅读 · 1 评论 -
并发编程(二)——并发编程的三大特性
不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题,用JMM屏蔽掉各种硬件和操作系统带来的差异。让Java的并发编程可以做到跨平台。JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算。然后再写回主内存中(不一定!原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他。i < 100;i++) {原创 2024-01-05 21:24:31 · 1069 阅读 · 1 评论 -
并发编程(一)——线程的基础概念
什么是多线程?多线程是指:**单个进程中同时运行多个线程。**多线程的不低是为了提高CPU的利用率。可以通过避免一些网络IO或者磁盘IO等需要等待的操作,让CPU去调度其他线程。这样可以大幅度的提升程序的效率,提高用户的体验。原创 2024-01-05 21:16:21 · 1319 阅读 · 1 评论