java 并发
文章平均质量分 93
微笑看你哭
这个作者很懒,什么都没留下…
展开
-
Disruptor
Disruptor Quick Start我们先写一个hello world 程序。要实现Disruptor需要四步:建立一个工厂Event类,用于创建Event类实例对象。需要有一个监听事件类,用于处理数据(Event类)。实例化Disruptor实例,配置一系列参数,编写Disruptor核心组件。编写生产者组件,向Disruptor容器中去投递数据。首先我们创建Event类。public class OrderEvent { private long value;原创 2020-11-25 16:31:26 · 411 阅读 · 0 评论 -
java并发(十一)——Condition
在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE5后,Java提供了Lock接口,相对于Synchronized而言,Lock提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活。下图是Condition与Object的监视器方法的对比。Condition提供了一系列的...转载 2018-12-24 19:11:16 · 126 阅读 · 0 评论 -
java并发(十二)——并发工具类:CountDownLatch
CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待“。在API中是这样描述的:用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果...转载 2018-12-24 20:11:14 · 144 阅读 · 0 评论 -
java并发(十三)——并发工具类:CyclicBarrier
CyclicBarrier,一个同步辅助类,在API中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。通俗点讲就是:让一组线程到达一个屏障时被阻塞,...转载 2018-12-25 16:06:00 · 117 阅读 · 0 评论 -
java并发(十九)——阻塞队列:BlockingQueue
ArrayBlockingQueueArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用FIFO的原则对元素进行排序添加的。ArrayBlockingQueue为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue支持对等待的生产者线程和使用者线程进行排序的可选公平策略,但是在默认情况下不保证线程公平的访问,在构造时可...转载 2019-01-04 18:03:59 · 272 阅读 · 0 评论 -
java并发(二十)——ConcurrentLinkedQueue
要实现一个线程安全的队列有两种方式:阻塞和非阻塞。阻塞队列无非就是锁的应用,而非阻塞则是CAS算法的应用。下面我们就开始一个非阻塞算法的研究:CoucurrentLinkedQueue。ConcurrentLinkedQueue是一个基于链接节点的无边界的线程安全队列,它采用FIFO原则对元素进行排序。采用“wait-free”算法(即CAS算法)来实现的。ConcurrentLinkedQu...转载 2019-01-04 19:03:42 · 217 阅读 · 0 评论 -
java并发(十四)——并发工具类:Semaphore
信号量Semaphore是一个控制访问多个共享资源的计数器,和CountDownLatch一样,其本质上是一个“共享锁”。Semaphore,在API是这么介绍的:一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Se...转载 2018-12-25 16:47:58 · 124 阅读 · 0 评论 -
java并发(十五)——并发工具类:Exchanger
前面三篇博客分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchange。Exchange是最简单的也是最复杂的,简单在于API非常简单,就一个构造方法和两个exchange()方法,最复杂在于它的实现是最复杂的(反正我是看晕了的)。在API是这么介绍的:可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个...转载 2018-12-25 17:22:35 · 186 阅读 · 0 评论 -
java并发(十八)——HashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap
HashMap下面来看下HashMap的主要两种存储方式是示意图:这就是java8的HashMap的数据结构,跟之前版本不一样的是当table达到一定的阀值时,bucket就会由链表转换为红黑树的方式进行存储,下面会做具体的源码分析。Node自JDK1.8.0开始HashMap使用静态内部类Node来存储键值对结构, 不再使用Map.Entry:static class Node<...转载 2019-01-02 17:03:50 · 644 阅读 · 0 评论 -
java并发(二十一)——CopyOnWriteArrayList和CopyOnWriteArraySet
CopyOnWriteArrayListCopyOnWriteArrayList容器是Collections.synchronizedList(List list)的替代方案,CopyOnWriteArrayList在某些情况下具有更好的性能,考虑读远大于写的场景,如果把所有的读操作进行加锁,因为只有一个读线程能够获得锁,所以其他的读线程都必须等待,大大影响性能。CopyOnWriteArray...转载 2019-01-07 11:57:43 · 371 阅读 · 0 评论 -
java并发(二十二)——线程池
Executor我们先看线程池的基础架构图:Executor,任务的执行者,线程池框架中几乎所有类都直接或者间接实现Executor接口,它是线程池框架的基础。Executor提供了一种将“任务提交”与“任务执行”分离开来的机制,它仅提供了一个Execute()方法用来执行已经提交的Runnable任务。public interface Executor { void execut...转载 2019-01-08 21:03:24 · 146 阅读 · 0 评论 -
java并发(二十三)——Fork/Join
Fork/Join是在Java7中提供的一个并发执行任务的框架。他的基本运行流程就是:把一个大任务分解成子任务,如果子任务还不是足够小,就继续分解成子子任务,一直分解到足够小。具体要分解到有多小,你可以自己定义这个阈值。然后把这些子任务分摊给多个线程去执行,每个线程对应一个双端队列负责保存这些原子任务。这里叫“原子”任务,之所以叫原子任务,就是为了说明他们已经足够小。是经过多次的递归后的结果。...原创 2019-01-09 18:39:32 · 250 阅读 · 0 评论 -
java并发(十)——读写锁:ReentrantReadWriteLock
读写锁重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多个读线程同时访...转载 2018-12-24 17:26:45 · 183 阅读 · 0 评论 -
java并发(八)——LockSupport
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。是实现 AbstractQueuedSynchronizer 和 ReentrantLock 的基础。LockSupport的成员变量LockSupport提供的都是静态方法,且无法被实例化。在LockSupport中有两个私有的成员变量:private static final Unsafe unsafe = Un...转载 2018-12-21 18:03:49 · 185 阅读 · 0 评论 -
java并发(一)——synchronized的实现原理
导读记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 诚然,随着Ja...原创 2018-08-29 11:22:23 · 176 阅读 · 0 评论 -
java并发(二)——volatile原理解析
synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。内存和缓存计算机在运行程序时,每条指令都是在CPU中执行的,在执行过程中势必会涉及到数据的读写。我们知道程序运行的数据是存储在主...转载 2018-08-29 17:42:56 · 128 阅读 · 0 评论 -
java并发(七)——AbstractQueuedSynchronizer
AQS介绍AQS,即AbstractQueuedSynchronizer, 队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架。来看下同步组件对AQS的使用: AQS是一个抽象类,主是是以继承的方式使用。AQS本身是没有实现任何同步接口的,它仅仅只是定义了同步状态的获取和释放的方法来供自定义的同步组件的使用。从图中可以看出,在java的同步组件中,AQS的子类(Sync等)一...转载 2018-12-21 16:20:50 · 163 阅读 · 0 评论 -
java并发(三)——wait()、notify()、notifyAll()、join()
锁池和等待池 wait() ,notifyAll(),notify() 三个方法都是Object类中的方法。学习他们之前先要了解俩个概念。java中,每个对象都有两个池,锁(monitor)池和等待池。锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的syn...原创 2018-09-17 16:58:22 · 348 阅读 · 0 评论 -
java并发(九)——重入锁ReentrantLock
ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。公平锁和非公平锁ReentrantLock还提供了公平锁也非公平锁的选择,构造方法接受一个可选的公平参数(默认非公平锁),当设置为true时,表示公平锁,否则为非公平锁。公...转载 2018-12-24 11:44:11 · 165 阅读 · 0 评论 -
java并发(四)——ThreadLocal
ThreadLoacal是什么?API是这样介绍它的:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。 ThreadLocal实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。...转载 2018-12-20 16:43:38 · 150 阅读 · 0 评论 -
java并发(十六)——atomic包
atomic包中的类都是通过unsafe的CAS操作实现的线程安全的工具类。CAS指的是compareAndSet(),它是又CPU指令实现的原子操作。AtomicBooleanAtomicBoolean是一个读和写都是原子性的boolean类型的变量。下面是使用compareAndSet()的例子:AtomicBoolean atomicBoolean = new AtomicBoo...转载 2018-12-26 16:01:55 · 145 阅读 · 0 评论 -
java并发(五)——Unsafe
Unsafe类介绍Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等。使用Unsafe可用来直接访问系统内存资源并进行自主管理,Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。Unsafe可认为是Java中留下的后...转载 2018-12-20 21:50:26 · 570 阅读 · 0 评论 -
java并发(六)——CAS
什么是CAS?CAS(Compare and Swap),即比较并替换。在java语言之前,并发就已经广泛存在并在服务器领域得到了大量的应用。所以硬件厂商老早就在芯片中加入了大量直至并发操作的原语,从而在硬件层面提升效率。在intel的CPU中,使用cmpxchg指令。在Java发展初期,java语言是不能够利用硬件提供的这些便利来提升系统的性能的。而随着java不断的发展,Java本地方法(...转载 2018-12-20 23:01:30 · 113 阅读 · 0 评论 -
java并发(十七)——FutureTask
RunnableRunnable接口是我们最熟悉的,它只有一个run函数。然后使用某个线程去执行该runnable即可实现多线程,Thread类在调用start()函数后就是执行的是Runnable的run()函数。Runnable最大的缺点在于run函数没有返回值。public interface Runnable { public abstract void run();}C...转载 2018-12-27 11:57:47 · 162 阅读 · 0 评论