
java并发编程
文章平均质量分 94
DivineH
这个作者很懒,什么都没留下…
展开
-
Java线程的interrupt()、interrupted()、isInterrupted()与InterruptedException
1、中断 中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。这就好比其它线程对该线程打了声招呼,其它线程通过调用该线程的interrupt()方法对其进行中断操作。 中断是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。interr...原创 2018-05-22 13:03:27 · 695 阅读 · 0 评论 -
Java并发编程之ArrayBlockingQueue阻塞队列详解
简介ArrayBlockingQueue是一个用数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。ArrayBlockingQueue默认情况下不保证线程公平地访问队列,即阻塞的线程,不一定按阻塞的先后顺序访问队列,非公平性也是为了提高吞吐率。ArrayBlockingQueue有三个构造方法:// capacity是该阻塞队列的容量大小,该构造方法会调用this(cap...原创 2018-06-05 13:19:57 · 3412 阅读 · 0 评论 -
Java并发编程之PriorityBlockingQueue阻塞队列详解
简介PriorityBlockingQueue是一个支持优先级的无界阻塞队列。默认情况下元素采用自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是不能保证同优先级元素的顺序。PriorityBlockingQueue有四个构造方法:// 默认的构造...原创 2018-06-06 10:30:49 · 3485 阅读 · 0 评论 -
Java并发编程之DelayQueue阻塞队列详解
简介DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。DelayQueue非常有用,可以运用在以下两个应用场景: 缓存系统的设计:使用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦...原创 2018-06-06 11:16:30 · 10400 阅读 · 0 评论 -
Java并发编程之LinkedBlockingDeque阻塞队列详解
简介LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列,即可以从队列的两端插入和移除元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。相比于其他阻塞队列,LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法,以first结尾的方法,表示插入、获取获移除双端队列的第一个元素。以l...原创 2018-06-06 13:41:01 · 29100 阅读 · 0 评论 -
Java并发编程之LinkedTransferQueue阻塞队列详解
简介LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。原创 2018-06-07 15:42:34 · 16077 阅读 · 0 评论 -
Java并发编程之自定义同步组件
队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,我们前面已经对该类进行了实现层面的分析,下面我们编写两个自定义同步组件来加深对AQS的理解。自定义独占锁同步组件设计一个同步工具:该工具在同一时刻,只允许一个线程访问,超过一个线程的访问将被阻塞,我们将这个同步器命名为Mutex。首先,确定访问模式,Mutex在同一时刻只支持一个线程的访问,这显...原创 2018-05-30 16:44:18 · 406 阅读 · 0 评论 -
Java并发编程之LockSupport、Unsafe详解
简介在Java多线程中,当需要阻塞或者唤醒一个线程是,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread)方法来唤醒一个被阻塞的线程,这些方法描述如...原创 2018-05-30 20:12:07 · 10232 阅读 · 0 评论 -
Java并发编程之ReentrantLock详解
---原创 2018-05-31 19:47:31 · 22083 阅读 · 2 评论 -
Java并发编程之SynchronousQueue阻塞队列详解
简介SynchronousQueue是一个不存储元素的队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。SynchronousQueue类只有两个构造方法:public SynchronousQueue() { this(false);}public SynchronousQueue(boo...原创 2018-06-07 11:13:24 · 4933 阅读 · 4 评论 -
Java并发编程之Fork/Join框架详解
简介Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join的运行流程如下图所示:工作窃取算法工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。那么为什么需要使用工作窃取算法呢?假如我们需要做一个比较大的任务,我们可以把这个任务分割为...原创 2018-06-07 17:11:26 · 1060 阅读 · 0 评论 -
Java并发编程之ReentrantReadWriteLock详解
简介ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,实际上独占锁是一种相对比较保守的锁策略, 在这种情况下任何"读/读", "读/写", "写/写"操作都不能同时发生,这在一定程度上面减低了吞吐量。然而读操作之间不存在数据竞争问题,如果"读/读"操作能够以共享锁的方式进行,那会进一步提升性能。因此引入了ReentrantReadWriteLock,顾名思义,Reent...原创 2018-06-02 16:12:26 · 4223 阅读 · 2 评论 -
Java并发编程之ConcurrentHashMap详解
简介我们知道,HashMap并不是线程安全的,要使用线程安全的HashMap,可以用HashTable或者通过Collections.synchronizedMap方法来获取一个线程安全的Map,但是这两种线程安全的Map都是使用synchronized来保证线程安全,因此,在多线程竞争激烈的情况下,它们的效率非常低。因为当一个线程访问synchronized同步方法时,其他线程访问Map,可能会...原创 2018-06-25 10:15:28 · 916 阅读 · 0 评论 -
Java并发编程之LinkedBlockingQueue阻塞队列详解
简介LinkedBlockingQueue是一个用链表实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。此队列的默认和最大长度是Integer.MAX_VALUE,LinkedBlockingQueue类有三个构造方法:// 默认构造方法,该方法会调用this(Integer.MAX_VALUE),即默认最大长度是Integer.MAX_VALUEpublic Linked...原创 2018-06-05 19:29:54 · 3035 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer详解(四)
AQS的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法会调用使用者重写的方法。AQS提供的模板方法基本上分为三类:独占式获取与释放同步状态、共享式获取与释放同步状态和查询同步队列中的等待线程情况,自定义同步组件将使用同步器提供的模板方法来实现自己的同步语义。下面我们主要分析共享式同步状态...原创 2018-05-29 16:41:54 · 802 阅读 · 0 评论 -
Java并发编程之ThreadLocal详解
ThreadLocal简介变量值的共享可以使用public static的形式,所有线程都使用同一个变量,如果想实现每一个线程都有自己的共享变量该如何实现呢?JDK中的ThreadLocal类正是为了解决这样的问题。ThreadLocal类并不是用来解决多线程环境下的共享变量问题,而是用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。在线程中,可以通过get...原创 2018-05-27 14:14:44 · 44651 阅读 · 13 评论 -
Java并发编程之synchronized详解
在Java多线程编程中,synchronized一直是元老级角色,很多人称呼它为重量级锁,但是随着Java SE1.6对其进行了各种优化之后,有些情况下它就不再那么重了,我们先看下利用synchronized实现同步的基础:Java中每一个对象都可以作为锁,具体表现为以下三种:1、对于普通同步方法,锁是当前实例对象;2、对于静态同步方法,锁是当前类的Class对象;3、对于同步方法块,锁是sync...原创 2018-05-22 20:51:31 · 1823 阅读 · 0 评论 -
Java并发编程之Condition详解
简介在Java程序中,任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object类上),主要包括wait()、wait(long)、notify()、notifyAll()方法,这些方法与synchronized关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特...原创 2018-06-03 14:26:22 · 8272 阅读 · 4 评论 -
Java并发编程之CountDownLatch详解
简介闭锁是一种同步工具类,可以延迟线程的进度,直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能够通过,当达到结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以确保某些活动直到其他活动都完成之后才继续执行。CountDownLatch是一种灵活的闭锁实现,它允许...原创 2018-06-03 17:07:49 · 2392 阅读 · 0 评论 -
Java并发编程之CyclicBarrier详解
简介栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏...原创 2018-06-03 21:12:35 · 64880 阅读 · 7 评论 -
Java并发编程之Semaphore详解
简介计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。计数信号量还可以用来实现某种资源池,或者对容器施加边界。Semaphore中管理着一组虚拟许可(permit),许可的初始数量可以通过构造函数来指定,在执行操作时可以首先获得许可(只要还有剩余的许可),并在使用之后释放许可。如果没有剩余许可,那么获取许可的acquire操作...原创 2018-06-04 10:33:12 · 588 阅读 · 0 评论 -
Java并发编程之Lock接口简介
背景锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在Java SE5之前,Java程序是靠synchronized关键字实现锁功能的,使用synchronized关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放,这种方式简化了同步的管理,可是扩展性没有显式地锁获取和释放来的好。例如,考虑下面这样一个情景:针对一个场景,使用sync...原创 2018-05-28 11:19:18 · 936 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer详解(一)
AbstractQueuedSynchronizer简介队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个内置的int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在抽象方法的实现过程中免不了要对同步状态进行...原创 2018-05-28 13:28:38 · 2382 阅读 · 0 评论 -
Java并发编程之Exchanger详解
简介Exchanger类允许在两个线程之间定义同步点,当两个线程都到达同步点时,它们交换数据。也就是第一个线程的数据进入到第二个线程中,第二线程的数据进入到第一个线程中。Exchanger只有一个构造函数:public Exchanger() { participant = new Participant();}这个类提供对外的接口非常简洁,两个重载的范型exchange方法:// 除非...原创 2018-06-05 11:10:25 · 915 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer详解(二)
同步器依赖于内部的FIFO双向等待队列来完成同步状态的管理,该等待队列是CLH队列的变种,CLH队列通常用于自旋锁,同步器中的等待队列可以简单的理解为“等待锁的线程队列”。当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。同步队列中的节点(Node)用...原创 2018-05-28 16:07:41 · 1977 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer详解(三)
AQS的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法会调用使用者重写的方法。AQS提供的模板方法基本上分为三类:独占式获取与释放同步状态、共享式获取与释放同步状态和查询同步队列中的等待线程情况,自定义同步组件将使用同步器提供的模板方法来实现自己的同步语义。我们主要分析同步状态的获取与释...原创 2018-05-29 11:34:57 · 1771 阅读 · 0 评论 -
Java并发编程之Object.wait()/notify()详解
等待/通知机制一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另外一个线程。前者是生产者,后者是消费者,这种模式隔离了“做什么”(What)和“怎么做”(How),在功能层面上实现了解耦,体系结构上具备良好的伸缩性,在Java语言中是如何实现类似的等待/通知机制的呢?最简单的方式就是让消费者不断地循环检查变量是否符合预期,如下面代码所...原创 2018-05-24 13:20:20 · 23635 阅读 · 4 评论 -
Java并发编程之ConcurrentLinkedQueue详解
简介在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,下面我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列ConcurrentLinked...原创 2018-06-26 10:00:26 · 81979 阅读 · 24 评论