posts - 146,  comments - 25,  views - 18万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  多线程和并发

15-并发设计模式
摘要:并发(多线程)设计模式不同于传统设计模式,更关注的是并发编程中特定场景的解决方案。对于并发设计模式同学们务必理解。 终止线程的设计模式 思考:在一个线程 T1 中如何正确安全的终止线程 T2? 错误思路1:使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程,如果这时线程锁住了共 阅读全文
posted @ 2022-03-09 00:41 路仁甲 阅读(204) 评论(0) 推荐(1) 编辑
14-Future&CompletableFuture
摘要:Callable&Future&FutureTask 直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Future和FutureTask就可以和Ca 阅读全文
posted @ 2022-03-09 00:38 路仁甲 阅读(68) 评论(0) 推荐(1) 编辑
13-高性能内存队列Disruptor
摘要:Disruptor简介 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业 阅读全文
posted @ 2022-03-09 00:35 路仁甲 阅读(740) 评论(0) 推荐(1) 编辑
12-ForkJoin
摘要:任务类型 思考: 线程池的线程数设置多少合适? 我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。 CPU密集型任务 CPU密集型任务也叫计算密集型任务,比如加密、解密、压缩、计 阅读全文
posted @ 2022-03-09 00:33 路仁甲 阅读(75) 评论(0) 推荐(0) 编辑
11-阻塞队列BlockingQueue
摘要:阻塞队列介绍 Queue接口 public interface Queue<E> extends Collection<E> { //添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常 boolean add(E e); //添加一个元素,添加成功返回true, 如果队列满了,返回fa 阅读全文
posted @ 2022-03-09 00:30 路仁甲 阅读(171) 评论(0) 推荐(0) 编辑
10-AQS之ReentrantReadWriteLock
摘要:读写锁 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁(读多写少)。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源(读读可以并发);但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写操作了(读写,写读, 阅读全文
posted @ 2022-03-09 00:26 路仁甲 阅读(33) 评论(0) 推荐(0) 编辑
09-Semaphorer&CountDownLatch&CyclicBarrie
摘要:Semaphore Semaphore介绍 Semaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueuedSynchronizer实现的。 Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同时只能有一个线程获取信号量实现。大 阅读全文
posted @ 2022-03-09 00:23 路仁甲 阅读(61) 评论(0) 推荐(0) 编辑
08-AQS之ReentrantLock
摘要:AQS原理分析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现 阅读全文
posted @ 2022-03-09 00:21 路仁甲 阅读(87) 评论(0) 推荐(0) 编辑
07-深入理解synchronized
摘要:Java共享内存模型带来的线程安全问题 思考: 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? @Slf4j public class SyncDemo { private static volatile int counter = 0; public 阅读全文
posted @ 2022-03-09 00:17 路仁甲 阅读(123) 评论(0) 推荐(0) 编辑
06-Atomic原子操作类详解
摘要:Atomic原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略 阅读全文
posted @ 2022-03-09 00:06 路仁甲 阅读(219) 评论(0) 推荐(0) 编辑
05-深入理解CAS
摘要:什么是 CAS CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。 CAS 的逻辑用伪代码描述如下: if (value == expectedValue) { value = new 阅读全文
posted @ 2022-03-09 00:04 路仁甲 阅读(168) 评论(0) 推荐(0) 编辑
04-深入理解Java线程
摘要:线程基础知识 线程和进程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中 ​ 还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程 阅读全文
posted @ 2022-03-09 00:02 路仁甲 阅读(57) 评论(0) 推荐(0) 编辑
03-Java并发线程池
摘要:线程池与线程对比: 线程方式 import java.util.ArrayList; import java.util.List; import java.util.Random; /*** * 使用线程的方式去执行程序 */ public class ThreadTest { public sta 阅读全文
posted @ 2022-03-08 23:54 路仁甲 阅读(57) 评论(0) 推荐(0) 编辑
02-并发的三大特性和volatile
摘要:并发和并行 目标都是最大化CPU的使用率 并行(parallel): 指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。 ​ 并发(concurrency): 指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时 阅读全文
posted @ 2022-03-08 23:51 路仁甲 阅读(153) 评论(0) 推荐(0) 编辑
01-CPU缓存架构&缓存一致性协议
摘要:CPU高速缓存(Cache Memory) CPU高速缓存 CPU缓存即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据 阅读全文
posted @ 2022-03-08 23:47 路仁甲 阅读(451) 评论(0) 推荐(0) 编辑
Java并发编程:线程池
摘要:在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务 阅读全文
posted @ 2020-05-08 23:28 路仁甲 阅读(241) 评论(0) 推荐(0) 编辑
并发编程之 CAS 的原理
摘要:什么是CAS CAS (compareAndSwap),中文叫比较交换,一种无锁原子算法。 过程是这样:它包含 3 个参数 CAS(V,E,N),V表示要更新变量的值,E表示预期值,N表示新值。 仅当 V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做两个更新,则当前线程 阅读全文
posted @ 2020-05-08 21:58 路仁甲 阅读(382) 评论(0) 推荐(0) 编辑
Java内存模型
摘要:线程与JVM 1基本概念: 程序:代码,完成某一件任务,代码序列(静态的概念) 进程:程序在某些数据上的一次运行(动态的概念) 线程:一个进程可能包含一个或多个线程(占有资源的独立单元) 2 JVM与线程 JVM什么时候启动?类被调用 JVM线程 》其他的线程(main) 线程在JVM中 3 JVM 阅读全文
posted @ 2020-04-27 23:22 路仁甲 阅读(193) 评论(0) 推荐(0) 编辑
java-锁膨胀的过程
摘要:先来看个奇怪的demo public class A { int i=0; // boolean flag =false; public synchronized void parse(){ i++; JOLExample6.countDownLatch.countDown(); } } 睡眠5秒, 阅读全文
posted @ 2020-04-23 23:59 路仁甲 阅读(619) 评论(0) 推荐(0) 编辑
java对象头信息和三种锁的性能对比
摘要:java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 | | | Object Header (128 bits) | | | | Mark Word (64 bits) | Klass Word (64 bits) | 阅读全文
posted @ 2020-04-22 00:22 路仁甲 阅读(2233) 评论(2) 推荐(2) 编辑

点击右上角即可分享
微信分享提示