并发
并发
小熊123~
优秀是一种习惯
展开
-
线程池自定义异常处理方法
// 线程工厂,用于为线程池中的每条线程命名ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("judge-pool-%d") .setUncaughtExceptionHandler((thread, throwable)-> logger.error("ThreadPool {} got exception", thread,t.原创 2020-09-11 14:08:06 · 653 阅读 · 0 评论 -
volatile(多线程可见)
每个线程都有自己的工作内存,同时还有一个共享的主内存。 多个线程并发读写一个共享变量时,有可能一个线程修改了变量的值,但是其他线程看不到,也就是对其他线程不可见。 当共享变量加了volatile后,只要一个线程修改了这个变量的值,立马强制刷回主内存,接着强制过期其他线程的工作内存中的缓存,当其他线程读取变量值时,强制从主内存加载最新值。 valatile主要作用是保证可见性和有序性,有序性是涉及到复杂的指令重排内存屏障等,volatile是不能保证原子性的,得依赖synchronize、Reent..原创 2020-08-18 00:01:35 · 207 阅读 · 0 评论 -
Java8优化CAS(AtomicInteger,LongAdder)
CAS:compare and set(先比较再设置)AtomicInteger底层是用的无锁化的CAS机制,当大量的线程同时并发修改一个AtomicInteger时,可能有很多线程不停地自旋,进入一个无线重复的循环中。Java8推出了一个新类,LongAdder,尝试使用分段CAS和自动分段迁移的方式来大幅度提升多线程高并发执行CAS操作的性能。这种高并发访问下的分段处理机制实际上是一个很常见的并发优化手段。...原创 2020-08-18 00:12:52 · 330 阅读 · 0 评论 -
AQS
AQS: AQS:AbstractQueuedSynchronizer(抽象队列同步器) ReentrantLock内部包含了一个AQS对象,这个AQS对象就是ReentrantLock可以实现加锁和释放锁的关键性的核心组件 AQS: 加锁状态 int state 当前加锁线程 等待队列公平锁和非公平锁: 公平锁:新来的线程进等待队列排队,等待加锁 非公平锁:新来的线程不进等待队列排队,直接加锁 ReentrantLock(默.原创 2020-08-18 14:32:59 · 158 阅读 · 0 评论 -
CountDownLatch
public static void main(String[] args) { //声明countDownLatch CountDownLatch countDownLatch = new CountDownLatch(2); //创建pool int corePoolSize = 2; int maximumPoolSize = 10; long keepAliveTime = 120; TimeUnit timeUnit = TimeUnit.SECONDS; BlockingDe..原创 2020-08-21 14:01:52 · 148 阅读 · 0 评论 -
Semaphore
public static void main(String[] args) throws Exception{ //主线程 System.out.println("thread start"); //声明semaphore int count = 10; Semaphore semaphore = new Semaphore(5); //创建pool int corePoolSize = 10; int maximumPoolSize = 20; long keepAliveTim.原创 2020-08-21 15:10:57 · 140 阅读 · 0 评论 -
首页聚合接口之异步执行
import com.boot.lea.mybot.dto.UserBehaviorDataDTO;import com.boot.lea.mybot.service.UserService;import com.google.common.util.concurrent.ThreadFactoryBuilder;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import jav.原创 2020-12-10 17:40:06 · 194 阅读 · 0 评论 -
Java线程池实现原理及其在美团业务中的实践
原文链接随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。一、写在前面1.1 线程池是什么线程池(转载 2021-01-19 11:53:36 · 159 阅读 · 0 评论 -
页面修改线程池参数_1
public class ThreadChangeDemo { //创建 private static ThreadPoolExecutor createExecutor(int corePoolSize, int maximumPoolSize){ return new ThreadPoolExecutor(corePoolSize, .原创 2021-01-20 11:07:38 · 221 阅读 · 0 评论 -
页面修改线程池参数_2
除了修改核心线程数和最大线程数,实际中还经常需要修改阻塞队列长度,但是发现没有修改队列长度的方法,因为 LinkedBlockingQueue 的 capacity 被 final 修饰了。我们可以按照这个思路自定义一个队列,让其可以对 capacity 参数进行修改即可。操作起来也非常方便,把 LinkedBlockingQueue 粘贴一份出来,修改个名字,然后把 capacity 参数的 final 修饰符去掉,并提供其对应的 get/set 方法。//拷贝一份LinkedBlockin原创 2021-01-20 14:16:21 · 299 阅读 · 2 评论 -
页面修改线程池参数_3
允许核心线程数回收executor.allowCoreThreadTimeOut(true);原创 2021-01-20 14:33:36 · 120 阅读 · 0 评论 -
页面修改线程池参数_4
Java8CompletionService 处理线程池public class ThreadChangeDemo { //创建 private static ThreadPoolExecutor createExecutor(int corePoolSize, int maximumPoolSize, .原创 2021-01-20 15:59:22 · 376 阅读 · 0 评论