
Java多线程与并发
文章平均质量分 97
Java多线程与并发
道友老李
提供工业机器视觉解决方案(涵盖光源、相机、镜头、结构、视觉技术等)和自研接近开关传感器(衰减系数1)产品,联系方式:18271933684(同vx)。
展开
-
【Java】多线程和高并发编程(一):线程的基础概念
如果在main线程中调用了t1.join(2000),那么main线程会进入到等待状态,需要等待t1执行2s后,在恢复到就绪状态等待CPU调度。CPU在极短的时间内,反复切换执行不同的线程,看似好像是并行,但是只是CPU高速的切换。如果在main线程中调用了t1.join(),那么main线程会进入到等待状态,需要等待t1线程全部执行完毕,在恢复到就绪状态等待CPU调度。不如要处理一个网络等待的操作,开启一个线程去处理需要网络等待的任务,让当前业务线程可以继续往下执行逻辑,效率是可以得到大幅度提升的。原创 2025-02-08 05:00:00 · 16747 阅读 · 0 评论 -
【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
阻塞队列中,如果需要线程挂起操作,判断有无数据的位置采用的是while循环 ,为什么不能换成if。生产者消费者是设计模式的一种。E走判断,发现有空余位置,可以添加数据到队列,E添加数据,走enqueue。如果判断是if,A在E释放锁资源后,拿到锁资源,直接走enqueue方法。此时A线程就是在putIndex的位置,覆盖掉之前的数据,造成数据安全问题。是基于数组实现的队列结构,数组长度不可变,必须提前设置数组长度信息。线程A,线程B,线程E,线程C。如果队列是满的, 就一直挂起,直到被唤醒,或者被中断。原创 2025-02-10 05:00:00 · 17358 阅读 · 41 评论 -
【Java】多线程和高并发编程(三):锁(中)深入ReentrantLock
AQS就是AbstractQueuedSynchronizer抽象类,AQS其实就是JUC包下的一个基类,JUC下的很多内容都是基于AQS实现了部分功能,比如ReentrantLock,ThreadPoolExecutor,阻塞队列,CountDownLatch,Semaphore,CyclicBarrier等等都是基于AQS实现。首先AQS中提供了一个由volatile修饰,并且采用CAS方式修改的int类型的state变量。原创 2025-02-09 05:00:00 · 16665 阅读 · 0 评论 -
【Java】多线程和高并发编程(三):锁(下)深入ReentrantReadWriteLock
写锁加锁流程// 写锁加锁的入口// 阿巴阿巴!!if (!// 读写锁的写锁实现tryAcquire// 拿到当前线程// 拿到state的值// 得到state低16位的值// 判断是否有线程持有着锁资源if (c!= 0) {// 当前没有线程持有写锁,读写互斥,告辞。// 有线程持有写锁,持有写锁的线程不是当前线程,不是锁重入,告辞。// 当前线程持有写锁。锁重入。// 没有超过锁重入的次数,正常 + 1// 尝试获取锁资源// CAS拿锁!原创 2025-02-10 05:00:00 · 20368 阅读 · 59 评论 -
【Java】多线程和高并发编程(二):并发编程的三大特性
不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题,用JMM屏蔽掉各种硬件和操作系统带来的差异。让Java的并发编程可以做到跨平台。JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算。然后再写回主内存中(不一定!原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他。i < 100;i++) {原创 2025-02-08 05:00:00 · 15825 阅读 · 13 评论 -
【Java】多线程和高并发编程(四):阻塞队列(中)LinkedBlockingQueue、PriorityBlockingQueue
首先PriorityBlockingQueue是一个优先级队列,他不满足先进先出的概念。会将查询的数据进行排序,排序的方式就是基于插入数据值的本身。如果是自定义对象必须要实现Comparable接口才可以添加到优先级队列排序的方式是基于二叉堆实现的。底层是采用数据结构实现的二叉堆。优先级队列PriorityBlockingQueue基于二叉堆实现的。PriorityBlockingQueue是基于数组实现的二叉堆。二叉堆是什么?二叉堆就是一个完整的二叉树。任意一个节点大于父节点或者小于父节点。原创 2025-02-11 05:00:00 · 16251 阅读 · 12 评论 -
【Java】多线程和高并发编程(三):锁(上)锁的分类、深入synchronized
偏向锁在升级为轻量级锁时,会涉及到偏向锁撤销,需要等到一个安全点(STW),才可以做偏向锁撤销,在明知道有并发情况,就可以选择不开启偏向锁,或者是设置偏向锁延迟开启。:如果在一个循环中,频繁的获取和释放做资源,这样带来的消耗很大,锁膨胀就是将锁的范围扩大,避免频繁的竞争和获取锁资源带来不必要的消耗。:当前线程获取到A锁,在获取之后尝试再次获取A锁,无法获取到的,因为A锁被当前线程占用着,需要等待自己释放锁再获取锁。:线程A获取到了锁资源,线程B没有拿到,线程B去排队,线程C来了,先尝试竞争一波。原创 2025-02-09 05:00:00 · 16405 阅读 · 48 评论 -
【Java】多线程和高并发编程(四):阻塞队列(下)DelayQueue、SynchronousQueue
DelayQueue就是一个延迟队列,生产者写入一个消息,这个消息还有直接被消费的延迟时间。需要让消息具有延迟的特性。DelayQueue也是基于二叉堆结构实现的,甚至本事就是基于PriorityQueue实现的功能。二叉堆结构每次获取的是栈顶的数据,需要让DelayQueue中的数据,在比较时,跟根据延迟时间做比较,剩余时间最短的要放在栈顶。// 发现DelayQueue中的元素,需要继承Delayed接口。// 接口继承了Comparable,这样就具备了比较的能力。原创 2025-02-11 05:00:00 · 15306 阅读 · 14 评论