
并发编程
文章平均质量分 92
阿立聊全栈
浙江大学,10年上市公司Java高级讲师,基础扎实;Java办公文章优质创作者;优快云认证博客专家;Java编程领域有着丰富的经验和技能,熟练掌握前后端技术,全栈。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java高并发领域经典的书籍
这本书由Joshua Bloch和Doug Lea等人撰写,是Java并发编程的经典之作。它详细介绍了Java并发工具包(java.util.concurrent)中的所有内容,包括线程池、并发集合、同步工具等。这本书由Ken Arnold和Peter Haggar编写,是Java并发编程的经典教程。虽然这本书不是专门讲解Java并发的,但它展示了如何在实际应用中(例如数据挖掘)使用并发技术来提高系统性能。在Java高并发领域,有一些经典的书籍,它们对于理解和解决高并发问题非常有帮助。原创 2024-10-30 09:03:49 · 572 阅读 · 0 评论 -
常用并发设计模式精讲
思考:在一个线程 T1 中如何优雅的终止线程 T2?正确思路:两阶段终止模式。原创 2024-09-26 15:16:12 · 1457 阅读 · 0 评论 -
CPU缓存架构详解&高性能内存队列Disruptor实战
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j2在内的很多知名项目都应用了Disruptor以获取高性能。原创 2024-09-25 16:11:04 · 2060 阅读 · 0 评论 -
深入理解并发原子性、可见性、有序性与JMM内存模型
JSR-133使用happens-before的概念来指定两个操作之间的执行顺序。由于这两个操作可以在一个线程之内,也可以在不同的线程之内。因此,JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证。JSR-133规范对happens-before关系的定义如下:1)如果一个操作happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。这是JMM对程序员的承诺, 注意,这只是JMM向程序员做出的保证。原创 2024-09-23 09:45:14 · 1600 阅读 · 0 评论 -
线程池ForkJoinPool实战及其工作原理分析
归并排序(Merge Sort)是一种基于分治思想的排序算法。归并排序的基本思想是将一个大数组分成两个相等大小的子数组,对每个子数组分别进行排序,然后将两个子数组合并成一个有序的大数组。因为常常使用递归实现(由先拆分后合并的性质决定的),所以我们称其为归并排序。将数组分成两个子数组对每个子数组进行排序合并两个有序的子数组归并排序的时间复杂度为O(nlogn),空间复杂度为O(n),其中n为数组的长度。原创 2024-09-21 10:48:36 · 1573 阅读 · 0 评论 -
线程池ThreadPoolExecutor实战及其原理分析
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如Tomcat。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。原创 2024-09-18 10:27:59 · 1796 阅读 · 0 评论 -
阻塞队列BlockingQueue实战及其原理分析
LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,该阻塞队列的大小为Integer.MAX_VALUE,由于这个数值特别大,所以 LinkedBlockingQueue 也被称作无界队列,代表它几乎没有界限,队列可以随着元素的添加而动态增长,但是如果没有剩余内存,则队列将抛出OOM错误。和它不同的是,LinkedBlockingQueue 的内部是用链表实现的,所以这里就需要我们考虑到,ArrayBlockingQueue 没有链表所需要的“节点”,空间利用率更高。原创 2024-09-17 09:51:54 · 1461 阅读 · 0 评论 -
并发容器(Map、List、Set)实战及其原理分析
Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。所以,Java先提供了同步容器供用户使用。同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器。这样做的代价是削弱了并发性,当多个线程共同竞争容器级的锁时,吞吐量就会降低。因此为了解决同步容器的性能问题,所以才有了并发容器。原创 2024-09-16 10:56:33 · 1796 阅读 · 0 评论 -
CyclicBarrier的源码分析
CyclicBarrier基于 ReentrantLock + ConditionObject实现,CyclicBarrier的构造函数中必须指定parties,同时对象generation,内部持有布尔型属性表示当前CyclicBarrier执行过程中是否有超时、异常、中断的情况。parties是初始待执行线程数,在构造函数中会将parties赋给计数值count,每当一个线程执行await(),count就会减1。原创 2024-09-16 10:47:48 · 891 阅读 · 0 评论 -
Semaphore源码分析
公平锁,优先判断等待队列中是否有挂起的线程,如果有,则将当前线程添加到等待队列中,等待唤醒后抢夺信号量;非公平锁,不管等待队列中是否有挂起线程,优先尝试获取信号量,获取失败,将当前线程添加到等待队列。原创 2024-09-20 08:00:00 · 403 阅读 · 0 评论 -
并发锁机制之深入理解synchronized
思考: 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?原创 2024-09-14 15:22:41 · 1408 阅读 · 0 评论 -
深入理解CAS&Atomic原子操作类详解
当有多个线程对一个原子类进行操作的时候,某个线程在短时间内将原子类的值A修改为B,又马上将其修改为A,此时其他线程不感知,还是会修改成功。测试@Slf4j// 阻塞1s// Thread1通过CAS修改value值为3} else {");// Thread2通过CAS修改value值为2// Thread2通过CAS修改value值为1Thread1不清楚Thread2对value的操作,误以为value=1没有修改过。原创 2024-09-13 10:56:24 · 1586 阅读 · 0 评论 -
导致JVM内存泄露的ThreadLocal详解
Java官方文档中的描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。原创 2024-09-11 10:27:22 · 1052 阅读 · 0 评论 -
Future&CompletableFuture实战
直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Future和FutureTask就可以和Callable接口配合起来使用。Callable的call方法可以有返回值,可以声明抛出异常。原创 2024-09-10 11:10:52 · 1028 阅读 · 0 评论 -
从0开始深入理解并发、线程与等待通知机制
从上面两大互联网公司的招聘需求可以看到,大厂的Java岗的并发编程能力属于标配。而在非大厂的公司,并发编程能力也是面试的极大加分项,而工作时善用并发编程则可以极大提升程序员在公司的技术话语权。原创 2024-09-09 12:56:53 · 2264 阅读 · 0 评论 -
控制并发线程数的Semaphore
Semaphore(信号量):是用来控制同时访问特定资源的线程数量,它通过协调各个线程以保证合理的使用公共资源。通俗的讲,在学校1000人,食堂位置100个,食堂的座位是公共资源,但是有限,不能容纳所有学生同一时间吃饭,同一时间只能有100个学生坐在那里吃饭,信号量起到限流的作用。废话不多说,直接代码:package java中的并发工具类;import java.util.concur...原创 2020-04-30 20:47:49 · 227 阅读 · 0 评论 -
多线程中的CountDownLatch闭锁(倒计时锁)学习和用例
多线程中的CountDownLatch闭锁(倒计时锁)学习和用例1.CountDownLatch的构造方法接收一个int的参数作为计数器,如果你想等待N个点,这里传入N.2.当我们调用countDown()方法时,N就会减一,await()方法会阻塞线程,直到N变为0,所以N可以是N个线程,也可以是N个执行步骤,用在多个线程时,只需要把CountDownLatch的引用传递给线程即可。总结一...原创 2020-04-30 16:34:06 · 317 阅读 · 0 评论 -
Thread中的join用法和案例
Thread中的join用法和案例有两个线程A,声明为a,线程B声明为b.如果线程A执行了b.join()方法,其含义是当前线程A等待b线程终止之后才能从b.join()返回.当主线程在循环中i10的时候,调用了p1线程的join()方法,则当p1循环打印完100次,返回到主线程的循环中,当i20调用p2的join方法时,此时p2已经执行了循环打印154次了,则继续执行155知道打印完毕后...原创 2020-04-30 12:21:57 · 362 阅读 · 0 评论