java多线程并发编程
2018-06-21 14:15:53 280 举报
AI智能生成
java并发编程知识体系,知识点比较详细,注释里有每个知识点的详细说明
作者其他创作
大纲/内容
并发 基础 <br>
AQS
AbstractqueuedSynchronizer同步器
队列同步器<br>
以下3个方法来 修改同步 状态<br>
getState():获取当前同步状态
setState(int newState):设置当前同步状态<br>
<ul><li>compareAndSetState(int expext,int update):使用CAS设置当前状态,该方法能够保证状态设置的原子性</li></ul>
同步器可重写的方法基本 为3类<br>
独占式 获取与释放 同步状态<br>
共享式获取与释放不同状态
查询同步队列中的等待线程情况
独占锁
同一时刻只能有一个线程获取到锁,而其他获取锁的线程只能处于同步队列中等待,只有获取锁的线程释放了锁,后继的线程才能获取锁<br>
实现方式
同步队列
独占式同步状态获取与释放
共享式同步状态获取与释放
CAS
Compare And Swap<br>
缺陷<br>
ABA
ABA解决方案
循环时间长 开销大<br>
只能保证一个共享变量的原子操作
线程间通信
volatile和synchronized关键字<br>
等待/通知<br>
使用wait()、notify()和notifyAll()时需要先对调用对象加锁<br>
调用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列
notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifyAll的线程释放锁之后,等待的线程 才有机会从wait()返回。<br>
notify()方法将等待队列中的一个等待线程从等待队列 中移到同步队列中,而notifyAll()方法将等待队列中所有的线程全部移到同步队列,被移动的线程状态由WAITING变为BLOCKING .<br>
从wait()方法返回的前提 是获得了调用对象的锁<br>
Thread.join()
ThreadLocal
并发工具类
CyclicBarrier
应用场景<br>
CountDownLatch
一个线程调用countDown方法happen-before,另外一个线程调用await方法。
CyclicBarrier和CountDownLatch的区别
Semaphore
使用场景
锁<br>
ReentrantLock
实现重进入
公平锁<br>
非公平锁
ReentrantReadWriterlock
volatile
volatile实现机制
内存语义
volatile的特性<br>
volatile写-读的内存语义
volatile内存语义的实现
锁的内存语义
NonfairSync
NonfairSync
concurrent包的实现
Lock接口<br>
Condition
Condition的实现<br>
等待队列<br>
等待
通知<br>
LockSupport
其他<br>
ThreadLocal
set(T):s设置一个值<br>
Fork/Join
Fork/Join的设计
分割任务
执行任务合并结果<br>
Disruptor并发框架
线程通信
共享内存
线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信
消息传递
线程之间必须通过发送消息来显示进行通信
并发集合
ConcurrentHashMap
什么是HashMap
高并发下的HashMap<br>
什么是ConcurrentHashMap<br>
ConcurrentHashMap的结构
ConcurrentHashMap初始化
ConcurrentHashMap允许多个读并发进行?
ConcurrentHashMap的size操作<br>
ConcurrentHashMap get操作<br>
ConcurrentHashMap put操作<br>
ConcurrentLinkedQueue
如何实现一个线程安全的队列?<br>
1.使用阻塞算法
2.使用非阻塞算法
ConcurrentLinkedQueue
入队列<br>
出队列<br>
java中的阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
DelayQueue
使用场景<br>
缓存系统的设计<br>
定时任务调度
SynchronousQueue
LinkedTransferQueue
LinkedBlockingDeque
CopyOnWrite<br>
CopyOnWriteArrayList
CopyOnWriteArraySet
CopyOnWrite 容器介绍
使用场景<br>
黑白名单
读多写少<br>
优缺点
线程池<br>
Execuror
ThreadPoolExecutor
构造参数<br>
RejectedExecutionHandler
AbortPolicy
CallerRunsPolicy
DiscardOldestPolicy
DiscardPolicy
corePoolSize
maximumPoolSize
keepAliveTime
TimeUnit
runnableTaskQueue
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
PriorityBlockingQueue
ThreadFactory
种类<br>
FixedThreadPool
SingleThreadExecutor
CachedThreadPool
Callable和Future
ScheduledExecutorService
合理配置线程池
线程池的监控<br>
原子操作
基本类型<br>
AtomicBoolean
AtomicInteger
AtomicLong
数组<br>
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
引用类型 <br>
AtomicReference
AtomicReferenceArrayFieldUpdater
原子更新字段类<br>
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicStampedReference
java如何实现原子操作
使用循环CAS实现原子操作
锁
内存模型
重排序
数据依赖性
写一个变量之后,再读这个变量
写一个变量之后,再写 这个变量<br>
读一个变量之后,再写 这个变量<br>
重排序对多线程的影响
顺序一致性
数据竞争与顺序一致性<br>
顺序一致性内存模型
同步程序的顺序一致性效果<br>
未同步程序的执行特性
happens-beofre
定义
规则<br>
<span style="font-family:'Comic Sans MS';font-size:18px;"><span style="color:#ff0000;"> 1、程序次序规则:在一个单独的线程中,按照程序代码的执行流顺序,(时间上)先执行的操作happen—before(时间上)后执行的操作。</span></span>
<span style="font-family:'Comic Sans MS';font-size:18px;"><span style="color:#ff0000;">2、管理锁定规则:一个unlock操作happen—before后面(时间上的先后顺序,下同)对同一个锁的lock操作。</span></span>
<span style="font-family:'Comic Sans MS';font-size:18px;"><span style="color:#ff0000;"> 3、volatile变量规则:对一个volatile变量的写操作happen—before后面对该变量的读操作</span></span>
<span style="font-family:'Comic Sans MS';font-size:18px;"> 4、线程启动规则:Thread对象的start()方法happen—before此线程的每一个动作。</span>
<span style="font-family:'Comic Sans MS';font-size:18px;"> 5、线程终止规则:线程的所有操作都happen—before对此线程的终止检测,可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。</span>
<span style="font-family:'Comic Sans MS';font-size:18px;"> 6、线程中断规则:对线程interrupt()方法的调用happen—before发生于被中断线程的代码检测到中断时事件的发生。</span>
<span style="font-family:'Comic Sans MS';font-size:18px;"> 7、对象终结规则:一个对象的初始化完成(构造函数执行结束)happen—before它的finalize()方法的开始。</span>
<span style="font-family:'Comic Sans MS';font-size:18px;"> 8、传递性:如果操作A happen—before操作B,<span style="font-family:'Comic Sans MS';font-size:18px;">操作B happen—before操作C,那么可以得出<span style="font-family:'Comic Sans MS';font-size:18px;">A </span></span></span><span style="font-family:'Comic Sans MS';font-size:18px;">happen—before操作C。</span>
as-if-serial
JMM的内存可见性保证
synchronized
synchronized原理
0 条评论
下一页