AQS
juc很多操作都是基于AQS(AbstractQueuedSynchronizer)
不同于自旋锁,juc使用的是volatile机制的状态变量;
内部也有一个阻塞线程的等待队列
每个线程都被封装在一个Node结点中
static final class Node { // 当前线程被取消 static final int CANCELLED = 1; // 结点被移除队列时唤醒后继节点 static final int SIGNAL = -1; // 结点在条件队列里面 static final int CONDITION = -2; /** * waitStatus value to indicate the next acquireShared should * unconditionally propagate */ static final int PROPAGATE = -3; /** Marker to indicate a node is waiting in shared mode */ static final Node SHARED = new Node(); /** Marker to indicate a node is waiting in exclusive mode */ static final Node EXCLUSIVE = null; volatile int waitStatus; volatile Node prev; volatile Node next; /** * The thread that enqueued this node. Initialized on * construction and nulled out after use. */ volatile Thread thread; Node nextWaiter; /** * Returns true if node is waiting in shared mode */ final boolean isShared() { return nextWaiter == SHARED; } final Node predecessor() throws NullPointerException { Node p = prev; if (p == null) throw new NullPointerException(); else return p; } Node() { // Used to establish initial head or SHARED marker } Node(Thread thread, Node mode) { // Used by addWaiter this.nextWaiter = mode; this.thread = thread; } Node(Thread thread, int waitStatus) { // Used by Condition this.waitStatus = waitStatus; this.thread = thread; } }
等待锁时线程封装进入队列尾部或者成为唯一节点,锁释放时,队列头部节点出对;
Lock
可重入锁的设计
内部继承AQS的Sync类来实现锁相关操作,线程可以重复获得锁,内部计数器在每次获得锁时计数器加1,计数器变为0时,锁释放;
锁获取实现:acquire()方法先尝试一次tryAcquire操作,如果失败,则调用acquireQueue()方法把当前线程加入到同步队列中去,这个时候可能会反复的阻塞与唤醒这个线程,直到后续的tryAcquire操作成功。
锁释放实现:将state值减1,然后判断锁是否被完全释放,如果被完全释放,则唤醒继任节点。
Condition
条件变量的实现,类似于OS中的信号量的实现,是实现BlockingQueue的基础,变量value>=0时表示有多少资源可以分配,当value<0时,表示欠缺多少资源,线程必须在等待队列中排队。
主要操作是await(),signal()
Signal()操作在资源可用时唤醒相应线程
Await()操作在资源不可用时线程必须等待
二者必须配对存在。
ReadWriteLock
读写锁的实现,读写锁分为读锁和写锁,读取数据必须获取读锁,可以存在多个读锁,但写锁必须只能存在一个,读锁写锁之间互斥。
Java读写锁在设计上采用volatile状态变量、CAS数据更新机制和条件变量结合的策略,获取读锁是,如果写锁被线程拥有,那么读者进入等待队列,否则可以获取锁,获取写锁时,如果读者仍持有锁,那么写者等待。
相关推荐
Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...
Java并发编程实践--电子书.rarJava并发编程实践--电子书.rar
Java并发编程实践-电子书-08章实用.pdf
JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS.docx
Java并发编程实践-电子书-06章.pdf
Java并发编程实践-电子书-07章.pdf
Java并发编程实践-电子书-09章.pdf
Java并发编程实践-电子书-05章.pdf
Java并发编程实践-电子书-04章.pdf
Java并发编程实践-电子书-08章.pdf
当然在release()方法中不仅仅只是将state- 1这么简单,- 1之后还需要进行一番处理,如果-1之后的新state = 0,则表示当前锁已经被线程释放
erlang-xmerl-22.2.3-1.el7.x86_64.rpm 免费下载0积分镜像下载。...Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。文件(erlang-23.1.1-1.el7.x86_64.rpm)是Erlang语言是安装包,...
课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...
erlang-xmerl-22.2.2-1.el7.x86_64.rpm 免费下载0积分镜像下载。...Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
Java并发编程系列- volatile;Java并发编程系列- volatile;Java并发编程系列- volatile;Java并发编程系列- volatile;Java并发编程系列- volatile;
java Junit单元测试, 高并发测试groboutils-core-5.jar 包,自测jar 包没有问题,分享给需要的同学,用最少的积分获取最优质的资源,你值得拥有!
JAVA并发编程实践-中文-高清-带书签-完整版(Doug+Lea)JAVA并发编程实践-中文-高清-带书签-完整版(Doug+Lea)