![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JUC并发和多线程
文章平均质量分 61
JUC并发和多线程相关文章
拄杖忙学轻声码
希望学习的同时也能和大家交流分享技术
展开
-
Java浅谈CountDownLatch的用法
await() 方法是用来阻塞线程的,等待倒计锁被减到0的时候,才会唤醒该方法继续执行。也可以设置等待超时时间,如 countDownLatch.await(30, TimeUnit.SECONDS),设置超时时间则需要判断等待结果,true等待未超时、false等待已超时。countDown() 方法是用来执行线程计数器-1的,也就是多线程运行完之后,都调用此方法将计数器变成0,最后调用await()方法唤醒阻塞的位置,继续执行。1、countDown() 是用来执行倒计锁 -1。原创 2023-02-24 03:00:44 · 2820 阅读 · 0 评论 -
SpringBoot项目中控制线程池、多线程事务提交、回滚的方式
1、由于多线程每个线程都是一个异步任务,所以每个线程都是一个单独的事务,通常使用的声明式事务 @Transactional() 是无法控制多线程中事务的。成功写入10000条数据。插入数据过程中模拟出现异常,事务会全部回滚。此方式没有第一种方式可靠,推荐第一种方式。2、所以只能另寻解决方式。原创 2023-02-20 05:58:46 · 4948 阅读 · 8 评论 -
Java把一个大集合拆分成多个小集合,可以利用多线程提升并发处理效率
在开发中,如果一个集合中的数据量特别大,那么对这个集合进行循环处理业务可能就会比较耗时,为了提升效率,可以考虑把大集合拆分成多个小集合,然后用多线程对拆分后的多个小集合进行处理。从结果看,达到拆分后的预期。2、实际项目中使用案例代码。原创 2023-01-17 09:33:14 · 4021 阅读 · 3 评论 -
Redisson实现分布式锁原理、自动续期机制、应用场景
前言:在学习分布式锁之前,应该首先要分析一下使用分布式锁的必须要考虑的一些问题1、互斥性:在并发的任意时刻,只能有一个线程拿到锁2、防锁死:即使有一个线程在持有锁的期间崩溃而未能主动释放锁,还要有其他方式去释放锁从而保证其他进程能获取到锁3、加锁和解锁的必须是同一个线程,解铃还须系铃人4、锁续期:执行业务耗时的时间超过了锁的等待时间,必须进行锁续期一、Redisson实现分布式锁1、加锁原理【1】Redisson 和 Redis 实现分布式锁是一致的,是不过 Redisson 是封装了 lua 脚本,原创 2022-12-03 18:28:38 · 2606 阅读 · 0 评论 -
Java中ExecutorService线程池和日程线程池的拒绝策略说明
4、CallerRunsPolicy:谁提交任务谁来执行这个任务,即将任务执行放在提交的线程里面,减缓了线程的提交速度,相当于负反馈。3、DiscardOldestPolicy:丢弃任务队列中等待事件最长的,即最老的任务,和上一个区别是上一个丢弃的是新提交的任务,这个丢弃的是最老的任务。1、线程池已经处于饱和状态无力再执行任务(线程数达到了最大线程数,等待队列也满了),如果再次提交任务会被拒绝。1、Java线程池处理任务并不是能无限处理的,也有上限,看下任务资源上限后的拒绝策略。原创 2022-12-02 10:26:25 · 507 阅读 · 0 评论 -
java使用(ThreadLocal、ReentrantLock(JVM锁)、Redisson分布式锁)解决全局共享变量并发安全问题
(当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本)3、此问题可以使用自定义局部变量中转处理解决,也可以使用 ThreadLocal、JVM锁(ReentrantLock)、分布式锁(Redisson) 来解决。2、因为有可能本次线程赋值后还没处理完业务,后续的线程已经把变量值改掉,那么这时候本次线程拿到的就是其他线程赋的值,这个时候会出现并发问题,导致变量值混乱。原创 2022-11-10 16:12:36 · 1051 阅读 · 0 评论 -
Java中Synchronized锁和ReentrantLock锁的概念和理解
3、ReentrantLock基于CAS,它需要手动解锁,它默认是非公平锁,也可以自定义为公平锁,是可重入锁。2、非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。1、公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。2、Synchronized基于锁对象,遇到异常JVM可以自动释放锁,同时它是不公平锁,是可重入锁。1、二者默认都是非公平锁,lock 可以指定为公平锁。原创 2022-11-07 17:47:03 · 494 阅读 · 0 评论 -
Java线程池ExecutorService、日程线程池、CompletableFuture、延迟执行器的 execute()、submit()、runAsync() 等异步线程出现异常分析
4、ScheduledExecutorService 日程线程池中 schedule()、execute() 和 submit() 都不会输出异常信息、但会终止程序,需要用 try/catch 捕捉异常打印出来 e.printStackTrace() (抛出系统异常或业务异常即可。1、在都不捕捉异常的情况下,execute() 会输出异常信息并终止程序,submit() 不会输出异常信息、但会终止程序。1、线程池任务、异步线程任务中出现运行时异常,会打断当前线程运行并且看不见异常信息,但不会打断主线程。原创 2022-11-07 16:28:36 · 4060 阅读 · 0 评论 -
ExecutorService配置线程池对象、日程线程池对象和基本使用示例
2、核心线程被全部占用时,开始启用活动线程数,当活动活动线程数等于核心线程数时,此时不再继续增加活动线程数,而是把任务丢进工作队列,当工作队列也满了还在继续增加任务,那么就继续增加活动线程数直至最大。线程池是高级开发必备的技能之一,线程池在实际开发中使用频率非常高非常重要,这里介绍一下线程池的基本使用方法。1、使用线程池创建线程比较方便,线程池中的线程可以复用(一旦空闲即可复用)1、提前把多个线程创建好,放入线程池中,使用时直接获取,使用完放回池中。1、多线程是异步的,每个线程都是独立的,事务也是独立的。原创 2022-09-23 17:51:47 · 880 阅读 · 0 评论 -
创建多线程继承Thread类和实现Runnable接口有什么区别?
1、使用上的区别,看代码class MyThread extends Thread{ @Override public void run() { System.out.println("do things"); }}class MyRunnable implements Runnable{ @Override public void run() { System.out.println("do things");原创 2021-10-21 00:31:04 · 338 阅读 · 0 评论