JUC并发编程
2020-05-07 19:25:15 0 举报
AI智能生成
juc一张图
作者其他创作
大纲/内容
并发容器
ConcurrentHashMap
1.7 segment锁(高位)
get() volatile 无锁
单segment扩容
put() 操作加锁
1.7 HashEntry(低位)
size() count两次
ConcurrentLinkedQueue CAS支持并发
head不一定是头结点
tail不一定是尾节点
BlockingQueue
ArrayBlockingQueue
有界数组
LinkedBlockingQueue
长度为 MAX_VALUE的链表
PriorityBlockingQueue
优先级无界队列
DelayQueue
延迟获取队列
SynchronousQueue
只有一个元素
LinkedTransferQueue
transfer() 消费了才返回
tryTransfer() 最多等待一定时间
LinkedBlockingDeque
双端队列
用condition实现,一个判断是否空,一个判断是否满
Fork and Join
fork()执行
join()等待执行完毕
ForkJoinPool 线程池
ForkJoinTask 任务
并发工具
CountDownLatch
构造函数带 int n参数
每一次countDown() n--
主线程await() 直到n=0
基于aqs实现
CyclicBarrier
构造函数带 int n参数
每一个await()方法 n--
n=0时候所有线程恢复执行
基于reentrantLock实现
上述两者区别
CDL只能用一次,CB可以用reset()重置
CB功能更多
getNumberWaiting()
isBroken()
线程
优先级1-10
thread.join 等待执行返回
threadlocal
线程状态
new
runnable
blocked
waiting
time_waiting
terminated
线程通信,每个对象都有的方法
wait()
wait(long)
wait(long,int)
nofity()
nofityAll()
线程池
流程
corePoolSize()是否满,有全局锁
runnableTaskQueue()是否满
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
PriorityBlockingQueue
maximumPoolSize()是否满,有全局锁
RejectedExecutionHandler接口
AbortPolicy
CallerRunsPolicy
DiscardOldestPolicy
DiscardPolicy
keepAliveTime 无任务后多长时间销毁县城
提交任务
返回future
future.get()
关闭线程池
shutdown
shutdownNow
线程数原则
cpu密集型 cpu支持线程数+1
io密集型 cpu支持线程数*2
api
taskCount
completedTaskCount
largestPoolSize
getPoolSize
getActiveCount
Executor 接口
ThreadPoolExecutor
FixedThreadPool 线程n
SingleThreadExecutor 线程1
CachedThreadPool 线程 MAX_VALUE
ScheduledThreadPoolExecutor周期性执行
time
sequenceNumber
period
DelayQueue
Future接口
FutureTask 基于aqs
get()
run()
cancel()
runnable
无返回结果
callable
有返回结果
关键字
volatile
写指令会直接写到内存
写指令会让其他线程对应字段的缓存无效
对于valatile++是无效的
synchronized
锁的位置
普通方法锁实例
静态方法锁类
同步块代码锁括号里对象
锁的类型
无锁
偏向锁
轻量级锁
重量级锁
隐式支持可重入
原子变量
原子基本类型
AtomicBoolean
addAndGet(int delta)
AtomicInteger
compareAndSet(int expect,int update)
AtomicLong
getAndIncrement()
lazySet()
getAndSet(int newValue)
Unsafe.compareAndSwapInt()
原子数组
AtomicIntegerArray
addAndGet(int i,int delta)
AtomicLongArray
compareAndSet(int i,int expect,int update)
AtomicReferenceArray
原子引用
AtomicReference
AtomicReferenceFieldUpdater
AtomicMarkableReference
原子字段
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicStampedReference
锁
1.5 lock接口
相比synchronized不同点
超时获取锁
获取锁被中断
非阻塞获取锁
api
lock()
lockInterruptibly()
tyrLock()
tryLock(long time,TimeUnit unit)
unlock()
newCondition()
AbstractQueuedSynchronizer 抽象类
三个方法
getState()
setState()
compareAndSetState()
api
tryAcquire(int i)
tryRelease(int i)
acquireShared(int i)
releaseShared(int i)
getQueuedThreads()
FIFO 双向队列
独占式获取锁用cas,失败也是cas放入队列尾
独占式头结点获得锁,释放锁简单,删除头结点就好
独占式释放锁后唤醒下一个节点
共享式释放锁要用cas,防止并发问题
ReentrantLock
可重入,重复获取锁不会被自己锁住
公平锁即FIFO
公平锁保证每个线程都能获取到锁
默认是非公平锁,线程切换更少,吞吐量更高
ReadWriteLock接口
ReentrantReadWriteLock
getReadLockCount()
getReadHoldCount()
isWriteLocked()
getWriteHoldCount()
可以公平,也可以非公平
锁降级,反之不行
有写锁了,获取读锁,再释放写锁
有读写两个锁
有读,可以继续读
有写,不能读也不能写
Condition
一个锁可以有多个condition
api
await()
awaitUninterruptibly()
awaitNanos(long nanos)
awaitUntil(Date date)
signal()
signalAll()
使用场景
生产者和消费者
也是aqs,fifo队列
因为要先获取锁,所以不存在并发问题,入队列和出队列不需要cas
信号量Semaphore
够造函数带 int n参数
api
acquire() n--
release() n++
availablePermits()
getQueueLength()
hasQueuedThreads()
reducePermits(int i)
getQueuedThreads()
基于aqs实现
0 条评论
下一页