多线程源码分析
文章平均质量分 76
HryReal
while(!dead) { study(); }
展开
-
多线程基础-基本概念(一)
1.线程和进程的区别进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位,简而言之就是一个程序至少有一个程序,一个进程至少有一个线程。2.线程的状态线程状态转换:1.对Running的线程使用join或者sleep方法,线程会进入blocked状态,而sleep时间结束,join中断,或者io完成都会回到Runnable状态。原创 2018-01-12 20:24:11 · 166 阅读 · 0 评论 -
JUC锁-LockSupport(四)
LockSupport的介绍LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。LockSupport的函数列表// 返回提供给最近一次原创 2018-01-13 14:34:50 · 238 阅读 · 0 评论 -
JUC锁-CountDownLatch(六)
CountDownLatch介绍CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。uml类图CountDownLatch的数据结构很简单,它是通过”共享锁”实现的。它包含了sync对象,sync是Sync类型。Sync是实例类,它继承于AQS。CountDownLatch源码分析1. CountDow原创 2018-01-13 14:36:17 · 223 阅读 · 0 评论 -
JUC锁-CyclicBarrier(七)
CyclicBarrier介绍CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。注意比较CountDownLatch和CyclicBarrier:(01) CountDownLatch的作用是允许1或N个线程等待其他原创 2018-01-13 14:37:59 · 211 阅读 · 0 评论 -
JUC锁-Semaphore(八)
Semaphore简介Semaphore是一个信号计数量,它的本质其实是一个”共享锁”。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。它的uml图如下:是不是感觉有点熟悉呢?没错,它跟“Reetra原创 2018-01-13 20:48:02 · 196 阅读 · 0 评论 -
JUC队列-ArrayBlockingQueue(一)
ArrayBlockingQueue介绍ArrayBlockingAQueue是用数组实现的线程安全的有界的阻塞队列。线程安全是指通过“互斥锁”保护竞争资源,实现了对线程对竞争资源的互斥访问,有界是指ArrayB咯KingQueue对应的数组是有界限的,阻塞队列是指当多个线程访问竞争资源时,当竞争资源已经被某个线程获取时,其他要获取该线程的线程需要等待。注意:ArrayBlocking原创 2018-01-14 20:15:41 · 292 阅读 · 0 评论 -
JUC队列-LinkedBlockingQueue(二)
LinkedBlockingQueue介绍LinkedBlockingQueue是一个以单向链表实现的阻塞队列,链表队列的吞吐量通常高于基于数组的队列,但是在大多数场景中,其可预见的性能要低。要注意的是,LinkedBlockingQueue可选容量,防止膨胀,默认大小为Integer.MAX_VALUE。LinkedBlockingQueue的UML图:LinkedBloc原创 2018-01-14 20:16:42 · 271 阅读 · 0 评论 -
JUC队列-ConcurrentLinkedQueue(四)
ConcurrentLinkedQueue介绍ConcurrentLinkedQueue是线程安全的队列,它适用于“高并发”的场景。它是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)。 ConcurrentLinkedQueue的UML图:说明:ConcurrentLinkedQ原创 2018-01-14 20:25:22 · 230 阅读 · 0 评论 -
JUC队列-LinkedBlockingDeque(三)
LinkedBlockingDeque介绍LinkedBlockingDeque是双向链表实现的阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);此外,LinkedBlockingDeque还是可选容量的,防止过度膨胀,默认等于Integer.MAX_VALUE。LinkedBlockingDeque的uml图说明:L原创 2018-01-14 20:24:01 · 254 阅读 · 0 评论 -
JUC锁-Condition(三)
Condition介绍Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。不同的是,Object中的wait(),notify(),notif原创 2018-01-13 14:33:37 · 246 阅读 · 0 评论 -
JUC锁-互斥锁ReentrantLock(二)
ReentrantLock介绍ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取。 ReentrantLock分为“公平锁”和“非公平锁”。它们的区别体现在获取锁的机制上是否公平。ReentrantLock在同一个时间点只能被一原创 2018-01-13 14:32:02 · 535 阅读 · 0 评论 -
多线程基础-实现多线程的两种方式(二)
实现多线程的两种方式:1.实现Runnablepublic interface Runnable { public abstract void run();}// RunnableTest.java 源码class MyThread implements Runnable{ private int ticket=10; public void run(){原创 2018-01-12 20:27:19 · 238 阅读 · 0 评论 -
多线程基础-常用线程方法(三)
1.notify和wait方法为什么notify,wait方法在Object中?Monitor内置于每一个Object对象中,是一个同步工具,相当于操作系统中的互斥量,即值为1 的信号量。也可以称作是对象的同步锁。notify(), wait()依赖于“同步锁”,并且每个对象有且仅有一个!这就是为什么notify(), wait()等函数定义在Object类,而不是Thread类中的原因。Objec原创 2018-01-12 20:27:51 · 344 阅读 · 0 评论 -
JUC原子类-框架(一)
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类。基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;引用类型: AtomicReference, AtomicStampedRerence, Atomic原创 2018-01-12 20:30:22 · 274 阅读 · 0 评论 -
JUC原子类-基本类型(二)
AtomicLong介绍:AtomicLong是作用是对长整形进行原子操作。 在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。AtomicLong函数列表// 构造函数AtomicLong()// 创建值为initialValue的Atomi原创 2018-01-12 20:30:57 · 218 阅读 · 0 评论 -
JUC原子类-数组类型(三)
AtomicLongArray介绍:AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似。本章以AtomicLongArray对数组类型的原子类进行介绍。内容包括:AtomicLong函数列表// 创建给定长度的新 AtomicLongArray。AtomicLongArray原创 2018-01-12 20:31:30 · 224 阅读 · 0 评论 -
JUC原子类-引用类型(四)
AtomicReference介绍:AtomicReference是作用是对”对象”进行原子操作。AtomicLong函数列表// 使用 null 初始值创建新的 AtomicReference。AtomicReference()// 使用给定的初始值创建新的 AtomicReference。AtomicReference(V initialValue)// 如果当前原创 2018-01-12 20:31:59 · 245 阅读 · 0 评论 -
JUC原子类-类成员(五)
AtomicLongFieldUpdater介绍:AtomicLongFieldUpdater可以对指定”类的 ‘volatile long’类型的成员”进行原子更新。它是基于反射原理实现的。AtomicLongFieldUpdater函数列表// 受保护的无操作构造方法,供子类使用。protected AtomicLongFieldUpdater()// 以原子方式将给原创 2018-01-12 20:32:29 · 238 阅读 · 0 评论 -
JUC锁-框架与基本概念(一)
框架与基本概念在了解后面的内容之前,必须要先了解基本概念:AQS – 指AbstractQueuedSynchronizer类。 AQS是java中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现。AQS是独占锁(例如,ReentrantLock)和共享锁(例如,Semaphore)的公共父类。AQS锁的类别 – 分为“独占锁”和“共享锁”两种。 (01) 独占锁 – 锁原创 2018-01-13 14:30:35 · 771 阅读 · 0 评论 -
JUC线程池
线程池ThreadpoolExecutor介绍1.线程的状态及表示在了解线程池的原理之前,必须先了解一下知识。线程的状态在ThreadpoolExecutor的表示: private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int原创 2018-01-15 21:15:22 · 252 阅读 · 0 评论