
并发编程
白小T~
每天学习一个知识点,十年之后我也是大牛。
展开
-
CountDownLatch+spring发布事件实现多线程
@AutowiredApplicationContext applicationContext;CountDownLatch countDownLatch = new CountDownLatch(1);//发布事件,用来加载指定活动的奖品信息applicationContext.publishEvent(new InitPrizeToRedisEvent(this,lottery.getId(), countDownLatch));//开始抽奖lotteryItem = doPlay(lot原创 2021-11-24 11:39:31 · 176 阅读 · 0 评论 -
RateLimiter 实现限流
// 允许每秒最多10个任务public static final RateLimiter limiter = RateLimiter.create(10);//异步,批量删除人脸库信息new Thread(() -> { if (CollectionUtils.isNotEmpty(leaveCodeList)){ for (String empCode : leaveCodeList) { limiter.acquire();原创 2021-11-24 11:37:49 · 202 阅读 · 0 评论 -
Semaphore实现限流
@Slf4jpublic class PortraitImport implements Callable<Response> { private TemporaryWorkerService temporaryWorkerService; private Semaphore semaphore; private MultipartFile file; private Integer type; public PortraitImport(Semaph原创 2021-11-24 11:36:55 · 453 阅读 · 0 评论 -
多线程之交替打印
方法1public static Thread t1; public static Thread t2; public static void main(String[] args) { char[] cs = {'a','b','c','d'}; int[] is = {1,2,3,4}; CountDownLatch countDownLatch = new CountDownLatch(1); Object lock =原创 2021-04-14 23:32:21 · 130 阅读 · 0 评论 -
单机版MapReduce-Fork-Join
什么是Fork/joinFork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。工作原理如图,首先把一个大任务分割成三个子任务,如果分割出来的子任务比较大的情况下又将分割出来的子任务进行二次分割,然后将各个任务的最终结果进行汇总就得到大任务的结果。每一个任务可以通过一个线程去执行,充分利用了多核心...原创 2020-04-21 22:53:53 · 380 阅读 · 0 评论 -
怎么去解决死锁的问题
1.不小心死锁了怎么办?1.1什么是死锁?在使用线程的使用过程中,我们无法避免加锁的情况,那么加锁就可能会导致死锁。如果出现了死锁的情况,我们需要怎么去解决呢?首先,我们来看下什么是死锁,下面这张图很形象的说明了什么是死锁,路口的四辆车都分别等待对面车道的车让行,相互等待,形成了死锁的状态。在线程中,死锁是这样定义的,一组相互竞争相同资源的线程因为相互等待而导致永久阻塞,这种现象就叫做死锁。...原创 2020-04-21 22:23:38 · 2828 阅读 · 0 评论 -
浅谈线程池
1.线程池的基本认识1.1什么是线程池提前创建好若干个线程放在一个容器中。如果有任务需要处理,则将任务直接分配给线程池中的线程来执行,任务处理完成后这个线程不会被销毁而是等待后续分配任务。1.2线程池的好处降低创建线程和销毁线程的性能开销提高响应速度,当有新任务需要执行时不需要等待线程创建就可以立马执行合理的设置线程池大小可以避免因为线程数超过硬件资源瓶颈带来的问题2.Java中...原创 2020-04-19 23:05:16 · 146 阅读 · 0 评论 -
CyclicBarrier简单使用
什么是CyclicBarrier?CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续工作。使用场景当存在需要所有子任务都完成时,才执行主任务,这个时候可以选择使用CyclicBarrier。代码示例CyclicBa...原创 2020-04-19 18:11:29 · 264 阅读 · 0 评论 -
Semaphore简单使用
什么是SemaphoreSemaphore也就是我们常说的信号灯,Semaphore可以控制同时访问的线程的个数,通过acquire获取一个许可,如果没有就等待,通过release释放一个许可。有点类似限流的作用。叫信号灯的原因也和他的用处有关。比如,某个商场就5个停车位,每个车位只能停一辆车,如果这个时候来了10辆车,必须要等前面有空的车位了才能进入。测试代码public class Se...原创 2020-04-19 17:28:16 · 135 阅读 · 0 评论 -
CountDownLatch
1.什么是CountDownLatch?CountDownLatch是一个工具类,它允许一个或者多个线程一直等待,直到其他线程的操作执行完毕再执行,从命名可以解读到CountDown是倒数的意思,类使用我们倒计时的概念。我们来看如下一段代码:注意到一共有两个线程,线程里面分别去执行countDown,CountDownLatch我们传入的值是3。这样永远看不到输出“线程执行完毕”这句话。...原创 2020-04-19 10:21:03 · 127 阅读 · 0 评论 -
从ReentrantLock去分析J.U.C核心之AQS
一、ReentrantLock的初步认识1.1 什么是锁锁是用来解决多线程并发访问共享资源所带来多大数据安全性问题的手段。对一个共享资源加锁后,如果有一个线程获得了锁,那么其他线程无法访问这个共享资源。加锁前:加锁后:如上图所示:有两个线程取访问balance,同时对其进行修改,A用户修改成原来的值减去1000,B用户修改成原来的值减去50,正常的情况这种余额的修改是不能小于0的,...原创 2020-04-18 22:04:17 · 168 阅读 · 0 评论 -
线程的安全性分析及ThreadLocal简单分析
并发编程问题的源头-原子性、可见性、有序性如何理解线程安全线程的使用带来了非常多的便利,同时,也给我们带来了很多困扰。当多个线程访问某个对象时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。线程安全问题的本质原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作...原创 2020-04-16 22:00:33 · 249 阅读 · 0 评论 -
线程的基本认识及操作
线程的基本介绍什么是线程线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。进程的执行逻辑为什么会有线程多线程的本质是:合理的利用多核心CPU资源来实现线程的并行处理,来实现同一个进程内的多个任务的并行执行,同时基于线程本身的异步执行特性,提升任务处理的效率。在多核CPU中,利用多线程可以实现真正意义上的并行执行在一个应用进程中,会存在多个同时执...原创 2020-04-15 22:28:42 · 268 阅读 · 0 评论