Java多线程进阶(十四)—— J.U.C之atomic框架:AtomicReference

2018-07-31
阅读 5 分钟
93.7k
本文首发于一世流云的专栏:[链接] 一、AtomicReference简介 AtomicReference,顾名思义,就是以原子方式更新对象引用。 可以看到,AtomicReference持有一个对象的引用——value,并通过Unsafe类来操作该引用: 为什么需要AtomicReference?难道多个线程同时对一个引用变量赋值也会出现并发问题?引用变量的赋值本身没有并...

Java多线程进阶(十三)—— J.U.C之atomic框架:AtomicInteger

2018-07-31
阅读 4 分钟
88k
AtomicInteger,应该是atomic框架中用得最多的原子类了。顾名思义,AtomicInteger是Integer类型的线程安全原子类,可以在应用程序中以原子的方式更新int值。

Java多线程进阶(十二)—— J.U.C之atomic框架:Unsafe类

2018-07-30
阅读 2 分钟
85.4k
Unsafe类,来源于sun.misc包。该类封装了许多类似指针操作,可以直接进行内存管理、操纵对象、阻塞/唤醒线程等操作。Java本身不直接支持指针的操作,所以这也是该类命名为Unsafe的原因之一。

Java多线程进阶(十一)—— J.U.C之locks框架:StampedLock

2018-07-29
阅读 20 分钟
105.9k
StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控制并发。

Java多线程进阶(十)—— J.U.C之locks框架:基于AQS的读写锁(5)

2018-07-29
阅读 5 分钟
86.1k
AQS系列的前四个章节,已经分析了AQS的原理,本章将会从ReentrantReadWriteLock出发,给出其内部利用AQS框架的实现原理。

Java多线程进阶(九)—— J.U.C之locks框架:AQS共享功能剖析(4)

2018-07-29
阅读 5 分钟
86.3k
AQS系列的前三个章节,我们通过ReentrantLock的示例,分析了AQS的独占功能。本章将以CountDownLatch为例,分析AQS的共享功能。CountDownLatch,是J.U.C中的一个同步器类,可作为倒数计数器使用,关于CountDownLatch的使用和说明,读者可以参考:Java多线程进阶(十八)—— J.U.C之synchronizer框架:CountDownLatch。

Java多线程进阶(八)—— J.U.C之locks框架:AQS的Conditon等待(3)

2018-07-29
阅读 3 分钟
86.7k
本章将继续以ReentrantLock的调用为例,说明AbstractQueuedSynchronizer提供的Conditon等待功能。关于Conditon接口的介绍,可以参见:Java多线程进阶(二)—— juc-locks锁框架:接口。

Java多线程进阶(七)—— J.U.C之locks框架:AQS独占功能剖析(2)

2018-07-29
阅读 8 分钟
93.2k
本文首发于一世流云的专栏:[链接] 一、本章概述 本章以ReentrantLock的调用为例,说明AbstractQueuedSynchronizer提供的独占功能。本章结构如下: 以ReentrantLock的公平策略为例,分析AbstractQueuedSynchronizer的独占功能 以ReentrantLock的非公平策略为例,分析AbstractQueuedSynchronizer的独占功能 分析AbstractQ...

Java多线程进阶(六)—— J.U.C之locks框架:AQS综述(1)

2018-07-08
阅读 6 分钟
91.3k
AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。

Java多线程进阶(五)—— J.U.C之locks框架:LockSupport

2018-07-07
阅读 3 分钟
94.7k
LockSupport类的核心方法其实就两个:park()和unpark(),其中park()方法用来阻塞当前调用线程,unpark()方法用于唤醒指定线程。这其实和Object类的wait()和signal()方法有些类似,但是LockSupport的这两种方法从语意上讲比Object类的方法更清晰,而且可以针对指定线程进行阻塞和唤醒。

Java多线程进阶(四)—— J.U.C之locks框架:ReentrantReadWriteLock

2018-07-07
阅读 3 分钟
88.1k
ReentrantReadWriteLock类,顾名思义,是一种读写锁,它是ReadWriteLock接口的直接实现,该类在内部实现了具体独占锁特点的写锁,以及具有共享锁特点的读锁,和ReentrantLock一样,ReentrantReadWriteLock类也是通过定义内部类实现AQS框架的API来实现独占/共享的功能。

Java多线程进阶(三)—— J.U.C之locks框架:ReentrantLock

2018-07-07
阅读 2 分钟
94.6k
ReentrantLock类,实现了Lock接口,是一种可重入的独占锁,它具有与使用 synchronized 相同的一些基本行为和语义,但功能更强大。ReentrantLock内部通过内部类实现了AQS框架(AbstractQueuedSynchronizer)的API来实现独占锁的功能。

Java多线程进阶(二)—— J.U.C之locks框架:接口

2018-07-07
阅读 3 分钟
172.7k
本系列文章中所说的juc-locks锁框架就是指java.util.concurrent.locks包,该包提供了一系列基础的锁工具,用以对synchronizd、wait、notify等进行补充、增强。juc-locks锁框架中一共就三个接口:Lock、Condition、ReadWriteLock,接下来对这些接口作介绍,更详细的信息可以参考Oracle官方的文档。

透彻理解Java并发编程系列

2018-07-07
阅读 5 分钟
227.2k
从本章开始,我们正式进入Java多线程进阶篇的学习。初学者通过基础篇的学习,应该已经对多线程的初步使用有了基本概念和掌握。多线程这块知识的学习,真正的难点不在于多线程程序的逻辑有多复杂,而在于理清J.U.C包中各个多线程工具类之间的关系、特点及其使用场景(从整体到局部、高屋建瓴,这对学习任何知识都至关重要...

Java多线程基础(十三)——Thread-Specific Storage(ThreadLocal)模式

2018-07-07
阅读 5 分钟
4.9k
Thread-Specific Storage就是“线程独有的存储库”,该模式会对每个线程提供独有的内存空间。java.lang.ThreadLocal类提供了该模式的实现,ThreadLocal的实例是一种集合(collection)架构,该实例管理了很多对象,可以想象成一个保管有大量保险箱的房间。

Java多线程基础(十二)——Two-phase Termination模式

2018-07-07
阅读 2 分钟
3.4k
我们将线程的正常处理状态称为“作业中”,当希望结束这个线程时,则送出“终止请求”。接着,这个线程并不会立刻结束,而是进入“终止处理中”状态,此时线程还是运行着的,可能处理一些释放资源等操作。直到终止处理完毕,才会真正结束。

Java多线程基础(十一)——Future模式

2018-07-07
阅读 3 分钟
11.8k
Future模式用来获取线程的执行结果。在Thread-Per-Message模式中,如果调用一个线程异步执行任务,没有办法获取到返回值,就像:host.request(10,'A');而Future模式送出请求后,马上就要获取返回值,就像:Data data=host.request(10,'A');但是上述的返回值并不是程序的执行结果,因为线程是异步的,主线程调用该该方法...

Java多线程基础(十)——Work Thread模式

2018-07-07
阅读 4 分钟
7.2k
Work Thread模式和Thread-Per-Message模式类似,Thread-Per-Message每次都创建一个新的线程处理请求,而Work Thread模式预先会创建一个线程池(Thread Pool),每次从线程池中取出线程处理请求。

Java多线程基础(九)——Thread-Per-Message模式

2018-07-07
阅读 2 分钟
5.5k
Thread-Per-Message模式是指每个message一个线程,message可以理解成“消息”、“命令”或者“请求”。每一个message都会分配一个线程,由这个线程执行工作,使用Thread-Per-Message Pattern时,“委托消息的一端”与“执行消息的一端”回会是不同的线程。

Java多线程基础(八)——Read-Write Lock模式

2018-07-07
阅读 4 分钟
6k
Read-Write Lock Pattern将读取与写入分开处理,在读取数据之前必须获取用来读取的锁定,而写入的时候必须获取用来写入的锁定。因为读取时实例的状态不会改变,所以多个线程可以同时读取;但是,写入会改变实例的状态,所以当有一个线程写入的时候,其它线程既不能读取与不能写入。

Java多线程基础(七)——Producer-Consumer模式

2018-07-07
阅读 3 分钟
9k
Producer-Consumer Pattern就是生产者-消费者模式。生产者和消费者在为不同的处理线程,生产者必须将数据安全地交给消费者,消费者进行消费时,如果生产者还没有建立数据,则消费者需要等待。一般来说,可能存在多个生产者和消费者,不过也有可能生产者和消费者都只有一个,当双方都只有一个时,我们也称之为Pipe Pattern。

Java多线程基础(六)——Balking模式

2018-07-07
阅读 3 分钟
6.9k
Balking是“退缩不前”的意思。Balking Pattern和Guarded Suspension Pattern 一样需要警戒条件。在Balking Pattern中,当警戒条件不成立时,会马上中断,而Guarded Suspension Pattern 则是等待到可以执行时再去执行。

Java多线程基础(五)——Guarded Suspension模式

2018-07-07
阅读 3 分钟
11.3k
guarded是“被保护着的”、“被防卫着的”意思,suspension则是“暂停”的意思。当现在并不适合马上执行某个操作时,就要求想要执行该操作的线程等待,这就是Guarded Suspension Pattern。Guarded Suspension Pattern 会要求线程等候,以保障实例的安全性,其它类似的称呼还有guarded wait、spin lock等。

Java多线程基础(四)——Immutable模式

2018-07-07
阅读 2 分钟
6.7k
Immutable是“永恒的”“不会改变”的意思。在Immutable Patttern中,有着能够保证实例状态绝不会改变的类(immutable 类)。因为访问这个实例时,可以省去使用共享互斥机制所会浪费的时间,提高系统性能。java.lang.String就是一个Immutable的类。

Java多线程基础(三)——Single Threaded Execution模式

2018-07-07
阅读 3 分钟
6.9k
一、定义 Single Threaded Execution 是指“以1个线程执行”的意思,有时也称为Critical Section(临界区)。 二、模式案例 案例:假设有三个人,频繁地通过一扇门,规定每次只能通过一个人,当通过一个人时,程序会将通过的总人次加1,同时记录该次通过人的姓名和出生地。 门的定义: {代码...} 人的定义: {代码...} pub...

Java多线程基础(二)——Java内存模型

2018-07-06
阅读 3 分钟
9.7k
工作存储器(working memory):每个线程各自独立所拥有的作业区,在working memory中,存有main memory中的部分拷贝,称之为工作拷贝(working copy)。

Java多线程基础(一)——线程与锁

2018-07-06
阅读 5 分钟
32.9k
由一个以上线程组成的程序称为多线程程序。常见的多线程程序如:GUI应用程序、I/O操作、网络容器等。Java中,一定是从主线程开始执行(main方法),然后在主线程的某个位置启动新的线程。