多线程
文章平均质量分 64
多线程学习
寂寞旅行
编程原则>>>不写代码: 不修改原有代码,尽量不增加新代码,不重复造轮子
在开始的几年中,在csdn中查到了解决开发问题的方法,现在也想成为帮助他人的一份子,出一份力;记录工作点滴困难,让后来者少走弯路;从涉及springboot,springcloud全家桶,mybatis,mp,influxdb,nebula,mysql,redis,mongodb,rabbitmq,多线程编程,分布式锁,html,jsp,jquery;取得系统集成中级证书;
展开
-
中断锁的意义
中断锁在实际业务开发中有着重要意义可中断锁使得我们可以在多线程环境中更好地处理中断问题,从而提高程序的健壮性和响应性;减少线程阻塞的可能;在持有锁的过程中,如果线程被中断,它不能响应中断,直到释放锁。这可能导致一些问题,比如如果一个线程因为某些原因被长时间阻塞,其他线程也可能会被阻塞,这可能会导致整个程序的性能下降,甚至可能导致死锁。可中断锁解决了这个问题。在持有可中断锁的时候,如果线程接收到中断信号,它会立即释放锁,并抛出InterruptedException异常。原创 2023-10-14 10:23:40 · 247 阅读 · 0 评论 -
超时取消子线程任务
主线程需要执行一些任务,不能影响主任务执行,这些任务有超时时间,当超过处理时间后,应该不予处理;如果未超时,应该获取到这些任务的执行结果;利用Executors框架创建子线程执行任务;利用Executors框架创建延时子线程监事执行任务的线程,通过超时时间判断 执行任务 子线程是否处理完成,处理完成获取结果,未处理完成,取消执行任务的子线程;原创 2023-09-05 07:00:00 · 1598 阅读 · 0 评论 -
多线程屏障CyclicBarrier
多线程中的CyclicBarrier,同样也是juc包下的一个工具类;CyclicBarrier可以用于多线程计算数据,最后合并计算结果的场景;多线程处理有序集合。原创 2023-05-30 08:00:00 · 947 阅读 · 0 评论 -
Semaphore线程信号量
Semaphore 也是juc中的一个关键类,他与之前的lock 类似,也有公平和非公平两种,它与他们应用含义,引用场景有很大的不同;与阻塞队列类似,但是也不一样;听我细细道来~Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。它用来控制访问资源的最大线程数量;例如上厕所,只有十个坑位,所以最多只能允许十个人同时使用;原创 2023-06-01 08:00:00 · 752 阅读 · 10 评论 -
fork/join框架
使用Fork/Join框架首先要考虑到的是如何分割任务,分割之后,根据join 再进行任务结果的合并,也就是类似二分法的,分而治之的理念;fork join 框架的思想就是通过分而治之的理念,去处理大量数据;核心是利用递归处理,底层也是通过多线程实现;原创 2023-05-26 08:00:00 · 581 阅读 · 0 评论 -
多线程处理有序集合
通过多线程,处理数据是一个快速提高处理的手段,那么当用多线程处理的时候,如果遇到有序集合怎么办?例如: 我想爬取一本小说,那么爬取完成后,需要的是 一个有序的章节小说,而非混乱的 章节,如何做呢?Executors 线程池虽好用,但是不建议直接使用,可以通过全局线程池配置,然后每次使用一个配置,否则各处单独使用线程池,很乱,其次当有问题后,也不好排查;用完 Executors 记住一定要 service.shutdown();或者类似方法, 否则线程池一直存在,不结束;原创 2023-05-23 10:17:15 · 447 阅读 · 0 评论 -
RentrantReadWriteLock的锁降级
1 当执行这段代码的时候,只有一个线程能够获取到写锁,其他线程会被阻塞在读锁和写锁的lock()方法上,如果不获取读锁,那么其他线程可能会立马获取到读锁,并修改update,会造成当前线程无法感知到变化,因为判断已经结束;2 锁降级中读锁的获取是必要的,因为,当我获取到读锁之后,其他线程的写锁是无法获取成功的(保证可见性),其他读锁是可以获取成功的,所以这里读锁的获取,主要是为了防止其他写锁获取成功;在获取到写锁后,操作update ,在释放写锁之前,获取到一个读锁,然后再释放写锁;(这里是重点,为何?原创 2023-05-19 11:40:33 · 489 阅读 · 0 评论 -
多任务AB并行与C串行
多任务执行的时候,有时候有这样的场景,就是有三个事件 ABC,AB执行顺序无所谓,但是C一定要在AB执行之后,再执行;例如: 计算 1+ 2 =3;现获取1 和 2 的顺序无所谓,可以并行但是计算等于3的时候,一定要在 1 2 之后;其实这里实现的方案大同小异,但是比较推荐后两种;思路都是通过线程之间通信,完成并行之后的串行;原创 2023-05-18 07:45:00 · 549 阅读 · 0 评论 -
CPU如何保证原子操作?
原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。原创 2023-05-16 14:24:33 · 498 阅读 · 0 评论 -
Java内存模型
JMM即: java内存模型1 只要不改变程序的执行结果(单线程程序和正确同步了的多线程程序),编译器和处理器怎么优化都行。2 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。3 两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。原创 2023-05-15 20:41:54 · 398 阅读 · 0 评论 -
BlockingQueue-多线程安全集合
BlockingQueue是一个接口,是一个能够保证线程安全的队列;一般适用于生产-消费模式的场景;当使用BlockingQueue的时候, 这里要注意的最重要的事情是 BlockingQueue 用于协调生产和消费者它们之间的工作。一般来说 会使用 DelayQueue 实现生产消费的延迟场景的需求;LinkedBlockingQueue 用它来实现有界队列的生产消费模式;一般不推荐使用无界队列,因为出现问题后将一直导致oom;原创 2023-05-06 10:45:57 · 640 阅读 · 0 评论 -
CAS简介
CAS的全称是:比较并交换(Compare And Swap)。在CAS中,有这样三个值:V:要更新的变量(var)E:预期值(expected)N:新值(new)比较并交换的过程如下:判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程更新了V,则当前线程放弃更新,什么都不做。所以这里的预期值E本质上指的是“旧值”CAS是一个理论,理论的核心就是我要修改的值,是不是没有被其他线程修改过,判断为true,那么我不应该修改,判断为flase 那么我可以对其进行修改;原创 2023-05-04 10:19:10 · 569 阅读 · 0 评论 -
juc--三大接口
juc几乎提供了所有多线程下的,线程通信机制,完美解决了线程中各种场景的问题;原创 2023-05-04 15:51:56 · 1256 阅读 · 0 评论 -
volatile与synchronized
volatile与synchronized 都是java的关键字volatile一般修饰变量,被修饰的变量会及时将计算值刷新回主内存;synchronized 一般作用于 方法, 代码块等,一般分为 对象锁 和 类锁;能够保证数据可见性禁止指令重排,在一定程度上保证了多线程情况下的执行顺序,从而保证结果执行正确不能完全保证多线程情况下的结果正确: 非原子性操作无法保证类似于 synchronized 的属于悲观锁,相对性的就是乐观锁;乐观锁多用于“读多写少“的环境,避免频繁加锁影响性能。原创 2023-05-02 15:18:37 · 1442 阅读 · 0 评论 -
线程之间的通信 状态
同步阻塞? 同步非阻塞?异步阻塞?.................................搞的好乱~~~,问题一堆,总是记不清,整理下同步异步 与 阻塞非阻塞 其实是两部分,分开看;这样就不会乱了首先 同步异步,说的是调用方是否及时收到被调用方的反馈, 如果调用方里面收到了被调用方的消息,那么就是同步的; 如果是被调用方很久之后通知调用方,那么就是异步;例如: 我给114打电话查...原创 2022-06-22 15:26:16 · 120 阅读 · 0 评论 -
2020-10-14 初入多线程
个人认为的经典文章:[http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html](http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html)进程:电脑中的一个后台程序,如一个java程序,一个360软件线程:进程中可调度的最小单位,如360软件中...原创 2020-10-22 11:54:49 · 229 阅读 · 0 评论 -
2020-10-27 多线程学习4
三个线程分别打印A B C ,循环打印五遍,结果为 ABCABCABCABC;分析:每个线程固定做打印的事情,并且有一定顺序,那么需要一个变量通知,即 A结束通知B (A>B),B>C,C>A.....下面给出两种解法(其实是一种):基于sync// 基于syncpublic class wubian { private int flag = 1; ...原创 2020-10-27 09:35:57 · 92 阅读 · 0 评论 -
2020-10-26 多线程学习2
十个线程分别计算1-10.11-20......91-100,最后计算总和是多少?分析:首先应该有十个线程,然后每个线程计算一部分,将十个线程的结果相加即可。给出几种写法:第一种:sync关键字public class 十个线程 { private int shu = 0; private int count = 0; public static void m...原创 2020-10-26 15:34:10 · 87 阅读 · 0 评论 -
2020-10-26 多线程学习1
join关键字 测试:public class TestJoin { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub for (int i = 0; i < 3; i++) { ...原创 2020-10-26 15:34:06 · 74 阅读 · 0 评论 -
2020-10-27 多线程学习3
交替打印两个数组的元素int[] arr1 = new int[]{1, 3, 5, 7, 9};int[] arr2 = new int[]{2, 4, 6, 8, 10};分析:两个数组分别打印,那么一定需要一个标识来代表打印哪一个数组中的元素。public class 交替打印两个数组 { int[] arr1 = new int[]{1, 3, 5, 7, 9}; ...原创 2020-10-27 09:35:52 · 145 阅读 · 0 评论 -
java多线程问题
业务场景:业务处理完成之后,需要发送消息(发送短息/或者系统消息),其实此时是不需要强制 发送消息成功的.换句话说,当发送消息失败的时候,我们无需理会,但是不能因为发送消息失败而影响主线程的已有业务逻辑.此时需要新开一个线程,去处理附加的这个发送消息的逻辑;Executors.newSingleThreadExecutor().execute(() -> { // 发送系统消息 sendSystemMessage(userId,te原创 2021-10-16 17:08:32 · 274 阅读 · 0 评论