并发学习笔记
文章平均质量分 88
Lqq'srogue
不求甚解 观其大略
展开
-
并发笔记(八)JUC原子类以及线程池(Executors)
一.原子类JUC中提供了针对一个变量的修改的简单原子操作,提供了原子类,相对于我们自己采用锁的方式实现来说,原子类的性能更好。1.1原子类的底层实现原理理论:volatile+(循环的CAS)CAS大致流程:每次修改的时候都会拿着之前读到的内容当做期望值,和当前值进行比较,如果说两者相等,那么可以将修改后的值进行赋值。分析:首先通过volatile保证可见性,也就是每次修改之后对于其他线程是可见的。但是我又想到之前学的内容,volatile虽然可以保证可见性,但是存在竞态条件,那么肯定这个Com原创 2021-03-13 09:01:18 · 129 阅读 · 0 评论 -
并发笔记(七)线程安全容器
一.线程安全容器1.List(CopyOnWriteArrayList)CopyOnWriteArrayList内部维护一个数组,成员变量arr指向这个数组,读操作也就是迭代Iterator遍历的就是这个数组,如果在读的时候,同时存在写操作的时候,会将arr复制一份,然后在复制的数组上进行进行元素的添加,执行操作完成操作之后将arr指向新的数组。适用与:读多写很少的场景优点:读无锁,读的效率很高缺点:浪费内存,读写的短暂不一致注意:CopyOnWriteArrayList的迭代器不支持增删改,原创 2021-03-10 17:39:49 · 306 阅读 · 0 评论 -
并发笔记(六)多线程步调一致,CountDownLatch、CyclicBarrier、Phaser、Exchanger
一.CountDownLatch案例:对账系统的对账功能,用户下单之后生成订单记录,物流会生成派送订单,防止少发或者是多发,定时调度任务,查询未对账的订单和派送订单进行对账,对于存在差异的生成插入差异库中。初始思路:while(存在未对账订单){ // 查询未对账订单 pos = getPOrders(); // 查询派送单 dos = getDOrders(); // 执行对账操作 diff = check(pos, dos); // 差异写入差异库 save(di原创 2021-03-08 16:56:39 · 199 阅读 · 0 评论 -
并发笔记(五)ReadWriteLock和StampedLock
JUC包中提供丰富的并发工具,不同的锁适用的场景不同,理解彼此之间的区别,适用的场景,这样在实际的场景中才能做出好的选择,写出好的并发程序。一.ReadWriteLock读写锁:1.允许多个线程同时读共享变量;2.只允许一个线程写共享变量;3.如果一个写线程正在执行写操作,此时禁止读线程读共享变量。ReadWriteLock,不支持锁升级操作,支持锁降级,读锁中不没有条件变量,写锁中有条件变量。显而易见与前面的互斥锁(synchronized和ReentrantLock),重要的区别就是读锁允原创 2021-03-02 14:33:13 · 371 阅读 · 0 评论 -
并发笔记(四)Lock、Condition以及Semaphore
实现管程除了synchronized之外,java SDK 并发包中提供的ReentrantLock通过实现Lock以及Condition接口实现管程模型。其中Lock实现互斥,Condition实现同步。一.Lock实现互斥,原子性可见性原创 2021-03-01 16:25:22 · 198 阅读 · 0 评论 -
并发笔记(三)线程的生命周期、合理设置线程数量、局部变量的安全性
一.线程的生命周期1.1 java线程6中状态1.NEW (初始化状态)编译语言中的创建线程,此时操作系统中的线程没有对应创建2.RUNNABLE(可运行/运行状态)对应操作系统中的线程被创建,具有CPU使用权3.BLOCK(阻塞状态)4.WAITING(无时限等待状态)5.TIMED_WAITING(有时限等待状态)这三种状态可以统一看成线程休眠状态,就是导致线程休眠状态的原因不同。当线程处于休眠状态,会释放 CPU 使用权,休眠状态的线程永远没有机会获得 CPU 使用权。6.TER原创 2021-02-28 11:31:47 · 167 阅读 · 0 评论 -
并发笔记(二)MESA管程模型、预防死锁的三个方法、生产者和消费者的阻塞队列实现
如何使用锁在现实生活中,锁和被保护的资源是有这对应的关系的,在管程的模型中,以及我们开发过程中也要注重这个关系,因为在临界区内的资源有可能会很多,可以将锁和资源进行对应划分,使用细粒度锁,这样的好处就是提升性能,但是坏处就是有可能出现死锁?那么如果方案有可能出现死锁,该如何优化…1.临界区域内资源无相互关系例如:账户对象中的两个成员变量,余额和密码,对于这两个资源可以分别申请对应的锁对象进行保护,也可以使用...原创 2021-02-25 11:18:04 · 678 阅读 · 0 评论 -
并发笔记(一)三大问题源头以及解决方法
1.并发产生的原因 cpu、内存、io,三者速度的差异,为了更好的利用资源,平衡三者的差异。 i)CPU增加**缓存**,平衡与内存的差异 ii)操作系统添**加进程和线程**,进程和线程的切换,均衡与IO的差异 iii)编译程序**优化执行顺序**,更高效的使用缓存2.并发的源头问题a)缓存导致的可见性问题 单核的cpu,不同的线程切换,由于是同一缓存, 所以线程a对共享变量的修改对于线程b来说是可见的。 多核的CPU,使用不同的缓存,所以会存在不可见的问题。 eg:coun原创 2021-02-23 14:35:35 · 479 阅读 · 2 评论