2022年3月9日
摘要: 并发(多线程)设计模式不同于传统设计模式,更关注的是并发编程中特定场景的解决方案。对于并发设计模式同学们务必理解。 终止线程的设计模式 思考:在一个线程 T1 中如何正确安全的终止线程 T2? 错误思路1:使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程,如果这时线程锁住了共 阅读全文
posted @ 2022-03-09 00:41 路仁甲 阅读(196) 评论(0) 推荐(1) 编辑
摘要: Callable&Future&FutureTask 直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Future和FutureTask就可以和Ca 阅读全文
posted @ 2022-03-09 00:38 路仁甲 阅读(62) 评论(0) 推荐(1) 编辑
摘要: Disruptor简介 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业 阅读全文
posted @ 2022-03-09 00:35 路仁甲 阅读(695) 评论(0) 推荐(1) 编辑
摘要: 任务类型 思考: 线程池的线程数设置多少合适? 我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。 CPU密集型任务 CPU密集型任务也叫计算密集型任务,比如加密、解密、压缩、计 阅读全文
posted @ 2022-03-09 00:33 路仁甲 阅读(70) 评论(0) 推荐(0) 编辑
摘要: 阻塞队列介绍 Queue接口 public interface Queue<E> extends Collection<E> { //添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常 boolean add(E e); //添加一个元素,添加成功返回true, 如果队列满了,返回fa 阅读全文
posted @ 2022-03-09 00:30 路仁甲 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 读写锁 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁(读多写少)。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源(读读可以并发);但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写操作了(读写,写读, 阅读全文
posted @ 2022-03-09 00:26 路仁甲 阅读(31) 评论(0) 推荐(0) 编辑
摘要: Semaphore Semaphore介绍 Semaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueuedSynchronizer实现的。 Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同时只能有一个线程获取信号量实现。大 阅读全文
posted @ 2022-03-09 00:23 路仁甲 阅读(59) 评论(0) 推荐(0) 编辑
摘要: AQS原理分析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现 阅读全文
posted @ 2022-03-09 00:21 路仁甲 阅读(83) 评论(0) 推荐(0) 编辑
摘要: Java共享内存模型带来的线程安全问题 思考: 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? @Slf4j public class SyncDemo { private static volatile int counter = 0; public 阅读全文
posted @ 2022-03-09 00:17 路仁甲 阅读(119) 评论(0) 推荐(0) 编辑
摘要: Atomic原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略 阅读全文
posted @ 2022-03-09 00:06 路仁甲 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 什么是 CAS CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。 CAS 的逻辑用伪代码描述如下: if (value == expectedValue) { value = new 阅读全文
posted @ 2022-03-09 00:04 路仁甲 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 线程基础知识 线程和进程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中 ​ 还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程 阅读全文
posted @ 2022-03-09 00:02 路仁甲 阅读(53) 评论(0) 推荐(0) 编辑