自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 Java并发编程札记-(五)JUC容器-05ArrayBlockingQueue与LinkedBlockingQueue

ArrayBlockingQueue是一个基于数组的有界阻塞队列。“有界”表示数组容量是固定的。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性(fairness)设置为true而构造的队列允许按照FIFO顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性

2017-12-29 16:26:23 608 2

原创 Java并发编程札记-(五)JUC容器-04ConcurrentSkipListMap

ConcurrentSkipListMap是线程安全的有序的哈希表。与同是有序的哈希表TreeMap相比,ConcurrentSkipListMap是线程安全的,TreeMap则不是,且ConcurrentSkipListMap是通过跳表(skip list)实现的,而TreeMap是通过红黑树实现的。至于为什么ConcurrentSkipListMap不像TreeMap一样使用红黑树结构,在Con

2017-12-27 21:45:13 478

原创 Java并发编程札记-(五)JUC容器-03ConcurrentHashMap

今天来学习ConcurrentHashMap在JDK1.8中的实现。相比JDK1.7,JDK1.8中ConcurrentHashMap的实现有很大的不同。结构先来看下JDK1.7与JDK1.8中ConcurrentHashMap结构的不同。 JDK1.7结构 在JDK1.7中,ConcurrentHashMap通过“锁分段”来实现线程安全。ConcurrentHashMap将哈希表

2017-12-25 21:44:18 1800

原创 Java并发编程札记-(五)JUC容器-02CopyOnWrite

今天学习CopyOnWriteArrayList。CopyOnWriteArrayList可以看做是线程安全的ArrayList,所有的写操作都是通过对底层数组进行一次新的复制实现的,这种思想称为“写时复制”,CopyOnWriteArrayList的名字也是由此而来。写时复制 CopyOnWrite,简称COW。所谓写时复制,即进行读操作时不加锁以保证性能不受影响,进行写操作时加锁,复制资

2017-12-22 21:56:00 833

原创 Java并发编程札记-(五)JUC容器-01概述

今天开始学习JUC容器。JUC提供了用于多线程上下文中的Collection实现与高效的、可伸缩的、线程安全的非阻塞FIFO队列。参考JDK1.8,画出下图。List JUC容器中List的实现只有CopyOnWriteArrayList。CopyOnWriteArrayList相当于线程安全的ArrayList。Set JUC容器中Set的实现有CopyOnWriteArrayS

2017-12-21 08:04:02 728

原创 Java并发编程札记-(四)JUC锁-10Semaphore简介

一般的锁在任意时刻只允许一个线程访问一项资源,而计数信号量允许n个任务同时访问一项资源。我们可以将信号量看做一个许可集,可以向线程分发使用资源的许可证。获得资源前,线程调用acquire()从许可集中获取许可。该线程结束后,通过release()将许可还给许可集。

2017-12-17 23:31:37 663

原创 Java并发编程札记-(四)JUC锁-09CyclicBarrier

CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点。如果你希望一组并行的任务在下个步骤之前相互等待,直到所有的任务都完成了下个步骤前的所有操作,才继续向前执行,那么CyclicBarrier很合适。看过CyclicBarrier的方法列表后,有没有发现CyclicBarrier与CountDownLatch比较像。它们之间最大的区别在于CyclicBarrier的计数器可以重置,相当于可以循环使用

2017-12-17 23:30:44 762

原创 Java并发编程札记-(四)JUC锁-08CountDownLatch

CountDownLatch是一个通用同步器,用于同步一个或多个任务。在完成一组正在其他线程中执行的任务之前,它允许一个或多个线程一直等待。可以用一个初始计数值来初始化CountDownLatch对象,任何在这个对象上调用wait()的方法都将阻塞,直至计数值到达0。每完成一个任务,都可以在这个对象上调用countDown()减少计数值。当计数值减为0,所有等待的线程都会被释放。CountDownL

2017-12-17 20:18:24 1024 7

原创 Java并发编程札记-(四)JUC锁-07读写锁的升级—StampedLock

StampedLock是JDK1.8新增的一个锁,是对读写锁ReentrantReadWriteLock的改进。前面已经学习了ReentrantReadWriteLock,我们了解到,在共享数据很大,且读操作远多于写操作的情况下,ReentrantReadWriteLock值得一试。但要注意的是,只有当前没有线程持有读锁或者写锁时才能获取到写锁,这可能会导致写线程发生饥饿现象,即读线程太多导致写线

2017-12-17 19:01:01 1186

原创 Java并发编程札记-(四)JUC锁-06LockSupport

LockSupport是JUC锁中比较基础的类,用来创建锁和其他同步类的基本线程阻塞原语。比如,在AQS中就使用LockSupport作为基本线程阻塞原语。它的park()和unpark()方法分别用于阻塞线程和解除阻塞线程。与Thread.suspend()相比,它没有由于resume()在前发生,导致线程无法继续执行的问题。和Object.wait()对比,它不需要先获得某个对象的锁,能够响应中

2017-12-17 12:38:47 598

原创 Java并发编程札记-(四)JUC锁-05ReentrantReadWriteLock简介

前面在Java并发编程札记-(四)JUC锁-02Lock与ReentrantLock一文中已经学习了ReentrantLock,其中提到了ReentrantLock是互斥锁。与互斥锁相对应的是共享锁。ReadWriteLock就是一种共享锁。ReentrantReadWriteLock是支持与ReentrantLock 类似语义的ReadWriteLock实现。ReadWriteLock维护了

2017-12-16 22:09:21 622

原创 Java并发编程札记-(四)JUC锁-04Condition简介

我们已经学习了如何通过使用锁来同步两个任务,但为了解决某个问题,任务之间只有互斥是不够的,还需要相互通信,相互协作。今天就来学习如何实现任务之间的协作。初识Condition在任务协作中,关键问题是任务之间的通信。握手可以通过Object的监视器方法(wait()和notify()/notifyAll())和synchronized方法和语句来安全地实现。Java SE5的JUC提供了具有

2017-12-16 20:37:48 819

原创 Java并发编程札记-(四)JUC锁-03AQS

AQS,AbstractQueuedSynchronizer的缩写,是JUC中非常重要的一个类。javadoc中对其的介绍是: 为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。此类的设计目标是成为依靠单个原子 int 值来表示状态的大多数同步器的一个有用基础。AbstractQueuedSynchronizer是CountDownL

2017-12-11 21:21:06 2932 1

原创 Java并发编程札记-(四)JUC锁-02Lock与ReentrantLock

今天学习Lock与ReentrantLock。Java中的锁有两种,synchronized与Lock。因为使用synchronized并不需要显示地加锁与解锁,所以往往称synchronized为隐式锁,而使用Lock时则相反,所以一般称Lock为显示锁。想了解synchronized更多请移步Java并发编程札记-(一)基础-06synchronized详解。synchronized修

2017-12-09 23:50:29 1049

原创 Java并发编程札记-(四)JUC锁-01概述

今天来学习JUC锁。JUC锁位于java.util.concurrent.locks包下,为锁和等待条件提供一个框架,它不同于内置同步和监视器。参考JDK1.8的java.util.concurrent.locks包,画出如下图: CountDownLatch,CyclicBarrier和Semaphore不在包中,但也是通过AQS来实现的。因此,我也将它们归纳到JUC锁中进行介绍。

2017-12-08 22:17:27 1007

原创 Java并发编程札记-(三)JUC原子类-07CAS

CAS,即compare and swap,比较并交换。CAS操作包含三个操作数:内存值(V),预期值(A)、新值(B)。如果内存值与预期值相同,就将内存值修改为新值,否则不做任何操作。java.util.concurrent.atomic是建立在CAS之上的。下面以AtomicLong为例看下是如何使用CAS的。 下面看下AtomicLong的compareAndSet方法。//

2017-12-07 23:29:54 1073

原创 Java并发编程札记-(三)JUC原子类-06JDK1.8新增:LongAdder、DoubleAdder、LongAccumulator、DoubleAccumulator

DoubleAccumulator、LongAccumulator、DoubleAdder、LongAdder是JDK1.8新增的部分,是对AtomicLong等类的改进。比如LongAccumulator与LongAdder在高并发环境下比AtomicLong更高效。本文以LongAdder为例,学习这些类。API中是这么介绍的:LongAdder中会维护一组(一个或多个)变量,这些变量加起

2017-12-07 22:53:54 4829

原创 Java并发编程札记-(三)JUC原子类-05原子方式更新类的指定volatile字段

AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater和AtomicLongFieldUpdater是基于反射的实用工具,可以提供对关联字段类型的访问。例如AtomicLongFieldUpdater可以对指定类的指定volatile long字段进行原子更新。本文以AtomicLongFieldUpdater为例来学习。API/

2017-12-07 20:29:08 861

转载 Java并发编程札记-(三)JUC原子类-04原子方式更新引用

提供了引用变量的读写原子性操作。

2017-12-06 20:37:19 779 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除