并发编程体系架构
文章平均质量分 95
该内容概括JAVA 中的并发工具类的前应后果,以及各种设计模式。
qq_599571116
这个作者很懒,什么都没留下…
展开
-
【java并发工具类-分工】Fork/Join:单机版的MapReduce
分治1.站在任务分工的并发场景及解决方案2."分治"任务模型3.Fork/Join的使用3.Fork/Join实现斐波那契数列4.ForkJoinPool工作原理4.模拟 MapReduce 统计单词数量5.注意1.站在任务分工的并发场景及解决方案前面我们站在任务分工的角度来介绍java工具类,今天来介绍一下使用场景:对于简单的并行任务,我们可以使用简单的"线程池+Future"方案来解决...原创 2020-04-30 18:46:21 · 303 阅读 · 1 评论 -
【java并发工具-分工】CompletionService:批量执行异步任务
CompletionService前言1.CompletionService原理:2.如何创建CompletionService?3.使用CompletionService完成询价系统的优化。4.CompletionService接口介绍5.利用CompletionService实现dubbo中的Forking Cluster前言怎么个批量获取异步任务?看下面询价系统的实例代码:如果异步查...原创 2020-04-29 11:51:57 · 604 阅读 · 0 评论 -
【java并发工具-分工】CompletableFuture实现异步编程
CompletableFuture1.创建CompletableFuture对象2.CompletionStage接口2.1如何理解CompletionStage接口2.1.1 描述串行关系2.1.2 描述并行关系2.1.3 描述汇聚关系2.2 CompletionStage的异常处理1.创建CompletableFuture对象创建CompletableFuture对象主要靠下面4个静态方法...原创 2020-04-26 11:55:04 · 301 阅读 · 0 评论 -
【Java并发工具类-分工】Future如何用多线程实现最优的“烧水泡茶”程序?
线程协作1. 如何获取任务的执行结果?1.1 三个submit()方法1.2 submit()和execute()方法的区别?1.3 FutureTask工具类2. 实现最优的"烧水泡茶"程序上一篇中如何正确创建线程池,介绍了ThreadPoolExecutor的execute(Runnable task)提交任务的方法,下面来讲解获取执行任务的返回结果。1. 如何获取任务的执行结果?jav...原创 2020-04-15 11:53:12 · 304 阅读 · 0 评论 -
【java并发工具类-分工】如何正确创建线程池
线程池1. 线程池消耗2. 线程池其实是一种生产者消费者模式2.1手动实现线程池3. 如何使用Java的线程池?3.1 ThreadPoolExecutor构造方法1. 线程池消耗Java创建对象,在堆内存中分配一块内存空间即可。而创建线程,需要调用操作系统内核的API,然后操作系统要为线程分配一系列资源,成本很高!线程是一个重量级对象,应避免频繁地创建销毁。2. 线程池其实是一种生产者消...原创 2020-04-14 10:46:03 · 334 阅读 · 0 评论 -
【java并发工具类-互斥(无锁)】原子类
原子类1.无锁方案1.1-使用无锁方案-原子类保证原子性1.2-无锁方案相对互斥锁1.3-无锁方案原理2.原子类概览2.1-原子化的基本数据类型2.2-原子化的对象引用类型2.3-原子化数组2.4-原子化对象属性更新器2.5-原子化的累加器2.6-总结1.无锁方案1.1-使用无锁方案-原子类保证原子性前面解决原子性问题,比如count+=1问题,都是使用互斥中的互斥锁来解决的,其实对于简单的...原创 2020-03-30 09:41:01 · 178 阅读 · 0 评论 -
【java并发工具类-协作】并发容器
并发容器1.那么如何可以把ArrayList变成线程安全的容器呢?2. 同步容器3. 并发容器3.1 List3.2 Map3.3 Set3.4 Queuejava中容器主要分为四大类:List,Map,Set,和Queue,但并不是所有的容器都是线程安全的,比如ArrayList,就不是线程安全的,1.那么如何可以把ArrayList变成线程安全的容器呢?其实,思路很简单,只要把非线程...原创 2020-03-29 10:03:56 · 128 阅读 · 0 评论 -
【java并发工具类-协作】CountDownLatch和CyclicBarrier
如何让多线程步调一致业务介绍1.创建线程优化业务2. java的线程和操作系统的线程之间的关系:3.线程池方式实现业务4 CountDownLatch4.1 CountDownLatch适用场景4.2 用 CountDownLatch 实现线程等待5.进一步优化性能6.CyclicBarrier6.1 CyclicBarrier适用场景6.2 用 CyclicBarrier 实现线程同步(协作)...原创 2020-03-28 11:46:04 · 166 阅读 · 0 评论 -
【java并发工具类-互斥】 StampedLock(比读写锁性能更高的锁)
比读写锁更快的StampedLock2. StampedLock2.1 StampedLock支持的三种锁模式2.2 StampedLock乐观读原理2.3 StampedLock注意事项2.4 标准StampedLock 读写模板2. StampedLock2.1 StampedLock支持的三种锁模式这三种模式分别是:写锁,悲观读锁,乐观读。其中,它的写锁,悲观读锁和ReadWrit...原创 2020-03-27 10:21:11 · 513 阅读 · 0 评论 -
【java并发工具类-互斥】ReadWriteLock(读写锁)
读写锁1.ReadWriteLock(读写锁)1.2 什么是读写锁?1.3 使用读写锁快速实现一个缓存?1.4 读写锁的升级和降级1.4.1 ReadWriteLock 是不允许升级的!1.4.1 ReadWriteLock 允许降级2. StampedLock(比读写锁更快的锁)2.1 StampedLock支持的三种锁模式2.2 StampedLock注意事项2.3 标准Stamped...原创 2020-03-26 15:10:42 · 254 阅读 · 0 评论 -
【java并发工具类-协作】-Semaphore限流器
Semaphore(英文读:sem破)限流器1.信号量模型信号量模型简单地概括为:一个计数器,一个等待队列,三个原子操作方法,init(),up(),down()。这三个方法的语义具体如下:init():设置计数器的初始值。down():计数器的值 -1。如果-1后此时计数器的值<0,当前线程被阻塞,放入等待队列中,否则当前线程可以继续执行。up():计数器的值 +1。如果+1...原创 2020-03-25 15:55:32 · 342 阅读 · 0 评论 -
【java并发工具类-互斥】Lock和Condition
并发工具类一.Lock和Condition1.比较synchronized,Lock具有的特点?2.较于synchronized,Lock如何实现可见性?3.ReentrantLock,可重入锁4.公平锁和非公平锁5.如何正确使用锁6.Lock中常见的问题一.Lock和Condition1.比较synchronized,Lock具有的特点?Lock接口的三个方法:// 支持中断的APIv...原创 2020-03-24 15:44:51 · 206 阅读 · 0 评论 -
synchronized的实现原理
synchronizedsynchronized的三种用法:synchronized的实现java对象头CAS自旋偏向锁轻量级锁synchronized的三种用法:对于普通同步方法,锁是当前的实例对象对于static同步方法,锁是当前class对象对于同步代码块,锁是()中配置的对象当一个线程访问同步代码块时,它必须获得锁,在退出或者抛出异常时必须释放锁。synchronized的...原创 2020-03-20 20:45:52 · 278 阅读 · 0 评论 -
JAVA如何解决可见性和有序性--java内存模型(Happens-Before规则,volatile,synchronized,final)
大家都知道java并发的三大根源性问题:可见性,有序性,原子性。那么java是如何解决的呢?今天先来说JAVA如何解决其中的可见性和有序性问题,导致可见性的原因是缓存,导致有序性的原因是编译优化。那么我们只要按需禁用缓存和编译优化就可以了。JAVA推出了JAVA内存模型,JAVA内存模型规范了JVM提供按需禁用缓存和编译优化的方法。具体来说,就是volatile,synchronized,f...原创 2020-03-19 15:48:09 · 455 阅读 · 1 评论 -
【管程模型-互斥】:synchronized原理
管程-synchronized什么是管程?管程模型-MESA 模型管程模型的区别简易版 MESA 模型synchronized什么是管程?所谓管程,指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。用java来说,管理一个类的成员变量和成员方法,使之成为线程安全的类。synchronized关键字和wait(),notify()和notifyall()都是管程的组成部分。管程模型...原创 2020-03-19 11:25:37 · 820 阅读 · 0 评论 -
JAVA如何解决原子性问题-锁:资源
上篇文章我们讲解了可见性和有序性在JAVA中如何解决。那原子性问题如何解决呢?导致原子性的原因是线程切换,当一个线程对共享变量进行读写操作时,没有执行完,切换到另外一个线程对该共享变量进行读写。比如下面经典的count++问题。那么我们只要禁止线程切换不就解决这个问题了,而操作系统的线程切换依赖CPU中断的,所以禁止CPU发生中断就可以禁止线程切换。在单核CPU下禁止中断就可以禁止线程切...原创 2020-03-17 09:31:30 · 396 阅读 · 1 评论 -
java线程基础-生命周期,创建合适线程数,局部方法安全性
java线程线程生命周期通用的线程生命周期java线程的生命周期那么stop和interrupt的区别?创建多少线程才是合适的局部变量是线程安全的线程生命周期首先先来介绍线程通用生命周期通用的线程生命周期初始状态:线程被创建(仅仅是编程语言层面,操作系统还没有创建真正的线程),不允许CPU分配资源。可运行状态:线程可以分配CPU执行,(操作系统层面已经创建线程了)运行状态:操作系统...原创 2020-03-15 10:08:22 · 110 阅读 · 0 评论 -
为什么说HikariCP是性能最好的数据库连接池
相信如果你看到这篇文章数据库连接池你一定不陌生,访问数据库的过程你也一定了然于胸,下面就简单介绍一下。执行数据库的一系列步骤:通过数据源获取一个数据库连接;创建 Statement;执行 SQL;通过 ResultSet 获取 SQL 执行结果;释放 ResultSet;释放 Statement; 释放数据库连接。HiKariCP 的两个优化FastList (逆序查找数组...原创 2020-03-05 23:16:21 · 687 阅读 · 1 评论 -
高性能队列Disruptor
Java SDK 提供了 2 个有界队列:ArrayBlockingQueue 和 LinkedBlockingQueue,它们都是基于 ReentrantLock 实现的,在高并发场景下,锁的效率并不高。今天我们就介绍一种性能更高的有界队列:Disruptor。Disruptor 是一款高性能的有界内存队列,Disruptor 性能之高,取决于下面四点,下面我们分别来讲解。1.内存分配更...原创 2020-03-05 10:32:50 · 254 阅读 · 0 评论 -
令牌桶算法-高性能限流器Guava Rate
高性能限流器Guava RateLimiter我们来看看 Guava RateLimiter 是如何解决高并发场景下的限流问题的。限流怎么理解呢?(我们创建一个流速为2个请求/秒的限流器)直观地看,2个请求/秒就是每秒最多允许两个请求通过限流器。在Guava中,2个请求/秒==一个请求500毫秒首先我们看看RateLimiter的使用//限流器流速:2个请求/秒RateLimiter...原创 2020-03-05 09:52:59 · 691 阅读 · 0 评论 -
java使用STM原理实现转账
首先我们先来看看账户类class Account { // 余额 private TxnRef<Integer> balance; // 构造方法 public Account(int balance) { this.balance = new TxnRef<Integer>(balance); } // 转账操作,该操作我们要保证 1.txn这个事务是原...原创 2020-03-07 15:10:34 · 1078 阅读 · 0 评论 -
MVCC原理-软件事务内存STM(浅入)
首先我们先来解释一下题目的关系:MVCC(多版本并发控制):数据库事务的实现数据库中的事务机制非常简单使用,比java的锁,原子类强很多。因此,为了提高性能,模仿数据库的事务机制产生了软件事务内存STM。下面我们用三段代码展示STM:这个是我们用java来模拟实现转账的业务,可以发现这个是线程不安全的,需要我们加锁,同时要防止死锁等问题。class UnsafeAccount { ...原创 2020-03-07 15:16:00 · 571 阅读 · 0 评论 -
并发设计模式1-避免共享
并发问题产生条件:多个线程同时对共享变量进行读写操作。解决并发问题,我们平时都是加互斥锁,防止同时进行读写操作,其实换个角度想,避免共享,就可以了。接下来介绍三种避免共享的三种模式:Immutability 模式、Copy-on-Write 模式和线程本地存储模式。Immutability 模式(不变性模式)该模式解决并发问题的思路就是让共享变量只有读操作,没有写操作。即,不变性,**就...原创 2020-03-06 20:06:45 · 246 阅读 · 0 评论 -
并发编程下的三大问题根源(原子性,可见性,有序性)和各种并发问题
本篇不讲解决方式,只是提出并发编程的问题,下面看一下并发问题的结构问题根源:可见性,原子性,有序性。缓存导致的可见性问题结合上图来看一下可见性问题int count=0Thread th1 = new Thread(()->{ count+=1000; });Thread th1 = new Thread(()->{ count+=1000; });count=?直...原创 2020-03-08 14:15:09 · 512 阅读 · 0 评论