并发编程
文章平均质量分 61
记录并发编程相关学习
祁_z
这个作者很懒,什么都没留下…
展开
-
【JUC并发编程】Synchronized深度分析
在Java5.0提供了java.util.concurrent包,简称JUC包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于县城的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的Collection实现等。原创 2022-10-19 13:45:33 · 556 阅读 · 0 评论 -
【多线程入门】&线程的三种创建方式&线程的生命周期&并行和并发的区别
当我们启动了一个微信的时候,微信就是一个进程;同理当我们打开百度网盘的时候,就相当于开启了一个百度网盘进程。Windows系统可以打开“任务管理器”来查看开启的“进程”。原创 2022-09-30 11:22:42 · 473 阅读 · 0 评论 -
【手写线程池实现】
改为:Runnable poll = workQueue.take();// take()若队列为空,则阻塞线程,直到获取到元素*将:Runnable poll = workQueue.poll();这段代码非常损耗性能,不管队列有没有任务都会一直循环运行。原创 2022-09-30 11:07:40 · 463 阅读 · 0 评论 -
深入理解CAS无锁机制与ABA的问题
CAS无锁机制CAS简单的说,CAS需要你额外给出一个期望值(主内存中的现有值),也就是你认为这个变量现在应该是什么样子的;如果变量不是你想象的那样,那说明它已经被别人修改过了;你就要重新读取,再次尝试修改就好了。(1)与锁相比,使用比较交换(下文简称CAS)会使程序看起来更加复杂一些。但由于其非阻塞性,它对死锁问题天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小。更为重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销,因此,它要比基于锁的方式拥有更优越的原创 2021-10-03 12:34:56 · 348 阅读 · 0 评论 -
多线程实现生产者消费者模型
整体思路:1. 定义一个容量大小为10的Queue堵塞队列,用于存储消息;2. 生产者通过while死循环将消息投递到Queue中,如果Queue长度等于Queue最大容量则通过wait()进行等待;3. 消费者通过while死循环消费Queue数据,并notify()释放(生产者即可继续投递消息);注意:wait()和notify()只能用在同步代码块中;并且生产者、消费者中的同步代码块都要锁同一个Goods.queue对象.首先定义一个实体类/** * 实体类 */pub原创 2021-08-09 11:44:22 · 439 阅读 · 0 评论 -
Lock锁
Lock 是一个接口,而synchronized是在JVM层面实现的。 Lock 底层采用CAS实现。 Lock 锁的释放,必须在finally中释放锁,不然容易造成线程死锁。 Lock 显式获取锁和释放锁,提供超时获取锁、可中断地获取锁。 Lock 接口的所有实现类中,最主要的就是ReentrantLock。lock的接口中,主要的方法如下: public interface Lock { // 加锁, 未获取到锁时通过CAS自旋重新获取锁 void loc...原创 2021-07-29 11:40:27 · 177 阅读 · 0 评论 -
Curator实现分布式锁
参考:https://blog.csdn.net/weixin_41507324/article/details/110286606Curator实现分布式锁Curator概念:Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Cu转载 2021-01-01 16:40:09 · 524 阅读 · 1 评论 -
合理配置线程池
CPU密集CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就那些。IO密集IO密集型,即该任务需要大量的IO,即大量的阻塞。在单线程上运行IO密集型的任务会导致浪费大量的CPU运算能力浪费在等待。所以在IO密集型任务中使用多线程可以大大的加速程序运行,即时在单核CPU上,这种加速主要就是利用了被浪费掉的阻塞时间。原创 2020-11-01 19:32:23 · 151 阅读 · 1 评论 -
concurrent并发包-计数器、屏障、信号量
并发包(计数器)CountDownLatchCountDownLatch 类位于java.util.concurrent并发包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行原创 2020-11-01 18:38:26 · 254 阅读 · 0 评论 -
springboot使用@Async,和@Async整合线程池
@Async使用,最好把线程放到单独的一个类中。代码实现用户登录异步写入登录日志。1. 登录伪代码 /** 异步执行类 */ @Autowired private AsyncLoginLogManage asyncLoginLogManage; @Override public BaseResponse<JSONObject> login(UserLoginDto userLoginDto) { // 异步写入用户登录日原创 2020-07-05 18:01:47 · 795 阅读 · 0 评论 -
mysql悲观锁和乐观锁
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想。悲观锁https://www.hollischuang.com/archives/934当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观锁。在数据库中,悲观锁的流程如下:在对任意记录进行修改前,先尝试为原创 2020-06-14 15:28:04 · 215 阅读 · 0 评论 -
自定义线程池
手写线程池/** * 流程: * 1. 成员变量: * 初始化线程数量; * 链表堵塞队列; * 结束线程池标识; * 2. 创建有参构造方法初始化线程数量,并调用“线程任.原创 2020-06-11 11:36:23 · 281 阅读 · 0 评论 -
并发编程之 - Volatile线程可见性:保证了线程间共享变量的及时可见性、防止指令重排
什么是VolatileVolatile 保证了线程间共享变量的及时可见性,但不能保证原子性。可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰...原创 2020-05-20 22:18:58 · 552 阅读 · 0 评论 -
并发编程之 - Threadlocal:为每个线程提供自己独立的变量,解决线程安全
目录ThreadLoca实现原理什么是Threadlocal案例:ThreadLoca实现原理 ThreadLoca通过map集合 Map.put(“当前线程”,值);什么是ThreadlocalThreadLocal提高一个线程的局部变量,访问某个线程拥有自己局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线...原创 2020-05-20 22:19:22 · 957 阅读 · 0 评论 -
多线程的五个状态 - 新建、就绪、执行/堵塞、死亡
1.新建 -new Thrend()2.就绪 - 调用start()方法,等待cpu可分配执行任务3.运行状态 - 执行run()方法4. 堵塞状态sleep()、wait()5. 死亡状态 run方法代码执行完毕。...原创 2020-05-20 22:18:24 · 253 阅读 · 0 评论