知识体系系统性梳理Java并发之基础
A.Java进阶-Java并发之基础:首先全局的了解并发的知识体系,同时了解并发理论基础和线程基础,并发关键字等,这些是你理解Java并发框架的基础。
pdai
Java并发-知识体系
Java并发-理论基础
多线程的出现是要解决什么问题的?
线程不安全是指什么?举例说明
并发出现线程不安全的本质什么?可见性,原子性和有序性。
Java是怎么解决并发问题的?3个关键字,JMM和8个Happens-Before
线程安全是不是非真即假?不是
线程安全有哪些实现思路?
如何理解并发和并行的区别?
Java并发-线程基础
线程有哪几种状态?分别说明从一种状态到另一种状态转变有哪些方式?
通常线程有哪几种使用方式?
基础线程机制有哪些?
线程的中断方式有哪些?
线程的互斥同步方式有哪些?如何比较和选择?
线程之间有哪些协作方式?
并发关键字:volatile,final,synchronized
关键字:synchronized详解
Synchronized可以作用在哪里?分别通过对象锁和类锁进行举例。
Synchronized本质上是通过什么保证线程安全的?分三个方面回答:加锁和释放锁的原理,可重入原理,保证可见性原理。
Synchronized由什么样的缺陷?JavaLock是怎么弥补这些缺陷的。
Synchronized和Lock的对比,和选择?
Synchronized在使用时有何注意事项?
Synchronized修饰的方法在抛出异常时,会释放锁吗?
多个线程等待同一个snchronized锁的时候,JVM如何选择下一个获取锁的线程?
Synchronized使得同时只有一个线程可以执行,性能比较差,有什么提升的方法?
我想更加灵活地控制锁的释放和获取(现在释放锁和获取锁的时机都被规定死了),怎么办?
什么是锁的升级和降级?什么是JVM里的偏斜锁、轻量级锁、重量级锁?
不同的JDK中对Synchronized有何优化?
关键字:volatile详解
volatile关键字的作用是什么?
volatile能保证原子性吗?
之前32位机器上共享的long和double变量的为什么要用volatile?现在64位机器上是否也要设置呢?
i++为什么不能保证原子性?
volatile是如何实现可见性的?内存屏障。
volatile是如何实现有序性的?happens-before等
说下volatile的应用场景?
关键字inal详解
所有的final修饰的字段都是编译期常量吗?
如何理解private所修饰的方法是隐式的final?
说说final类型的类如何拓展?比如String是final类型,我们想写个MyString复用所有String中方法,同时增加一个新的toMyString()的方法,应该如何做?
final方法可以被重载吗?可以
父类的final方法能不能够被子类重写?不可以
说说final域重排序规则?
说说final的原理?
使用final的限制条件和局限性?
看本文最后的一个思考题
J.U.C框架Lock框架和Tools类类结构总览接口:Condition
Condition为接口类型,它将Object监视器方法(wait、notify和notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待set(wait-set)。其中,Lock替代了synchronized方法和语句的使用,Condition替代了Object监视器方法的使用。可以通过await(),signal()来休眠/唤醒线程。
在JUC锁:AbstractQueuedSynchonizer详解中类的内部类-conditionobject类有具体分析。
接口
ock
Lock为接口类型,Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的Condition对象。
接口:ReadWriteLock
ReadWriteLock为接口类型,维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有writer,读取锁可以由多个reader线程同时保持。写入锁是独占的。
抽象类:AbstractOwnableSynchonizer
AbstractOwnableSynchonizer为抽象类,可以由线程以独占方式拥有的同步器。此类为创建锁和相关同步器(伴随着所有权的概念)提供了基础。AbstractOwnableSynchronizer类本身不管理或使用此信息。但是,子类和工具可以使用适当维护的值帮助控制和监视访问以及提供诊断。
抽象类(long):AbstractQueuedLongSynchronizer
AbstractQueuedLongSynchronizer为抽象类,以long形式维护同步状态的一个AbstractQueuedSynchronizer版本。此类具有的结构、属性和方法与AbstractQueuedSynchronizer完全相同,但所有与状态相关的参数和结果都定义为long而不是int。当创建需要64位状态的多级别锁和屏障等同步器时,此类很有用。
核心抽象类(int):AbstractQueuedSynchonizer
AbstractQueuedSynchonizer为抽象类,其为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。此类的设计目标是成为依靠单个原子int值来表示状态的大多数同步器的一个有用基础。
详细分析请看:JUC锁:AbstractQueuedSynchonizer详解
锁常用类
ockSupport
LockSupport为常用类,用来创建锁和其他同步类的基本线程阻塞原语。LockSupport的功能和"Thread中的Thread.suspend()和Thread.resume()有点类似",LockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程。但是park()和unpark()不会遇到“Thread.suspend和Thread.resume所可能引发的死锁”问题。
详细分析请看:JUC锁ockSupport详解
锁常用类:ReentrantLock
ReentrantLock为常用类,它是一个可重入的互斥锁Lock,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。
详细分析请看:JUC锁:ReentrantLock详解
锁常用类:ReentrantReadWriteLock
ReentrantReadWriteLock是读写锁接口ReadWriteLock的实现类,它包括Lock子类ReadLock和WriteLock。ReadLock是共享锁,WriteLock是独占锁。
详细分析请看:JUC工具类:ReentrantReadWriteLock详解
锁常用类:StampedLock
它是java8在java.util.concurrent.locks新增的一个API。StampedLock控制锁有三种模式(写,读,乐观读),一个StampedLock状态是由版本和模式两个部分组成,锁获取方法返回一个数字作为票据stamp,它用相应的锁状态表示并控制访问,数字0表示没有写锁被授权访问。在读锁上分为悲观锁和乐观锁。
详细分析请看:Java8-StampedLock详解
工具常用类:CountDownLatch
CountDownLatch为常用类,它是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
详细分析请看:JUC工具类:CountDownLatch详解
工具常用类:CyclicBarrier
CyclicBarrier为常用类,其是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(