java并发
2020-04-02 14:02:27 0 举报
AI智能生成
Java并发脑图
作者其他创作
大纲/内容
并发
并发基础
并发编程优缺点
优点
缺点
易混淆概念
线程状态和基本操作
新建线程方法
线程状态及切换
线程的基本操作
守护线程
Java内存布局
Java对象头
并发关键字
synchronized
基本用法
普通方法:锁住this对象
静态方法:锁住类对象
代码块:锁住指定的对象
优化
偏向锁
无线程竞争发生,偏向第一个加锁线程。
MarkWord记录偏向的线程ID
竞争发生时,撤销偏向锁,撤销阈值>20,批量重偏向
撤销阈值>40,批量撤销,且该类新建对象无法偏向
轻量级锁
两个线程分段使用锁时,升级轻量级锁
CAS替换Mark Word为Lock Record
锁膨胀
CAS替换失败时,可能为锁重入或进入竞争
进入竞争后,锁膨胀为重量级锁,当前线程进入Monitor的EntryList阻塞住
重量级锁时,MarkWord存储的是Monitor对象地址
重量级锁竞争时,有自适应自旋优化,可减少进入阻塞的几率
Wait&Notify
首先必须获取对象的锁,因此必须在synchronized中使用
可能产生InterruptedException
wait和sleep区别
1.wait是Object类方法,sleep是Thread类方法
2.wait会释放对象锁,sleep不会释放
3.sleep无需和synchronized配合使用,而wait需要
wait(timeout)和sleep(timeout)均使线程进入TIMED_WAITING状态
保护性暂停模式
join的底层实现原理
park&unpark
和wait notify区别
无需和Object Monitor配合使用
可先unpark,再park
可准确唤醒指定线程
底层原理
每个线程都有一个parker对象
park时,设置counter为0,进入cond队列等待
unpark时,设置counter为1,同时唤醒cond队列等待的线程
CAS
1.乐观锁的实现之一
原理:底层调用了 CPU指令级别的原子操作:比较并交换
volatile
作用
1.内存可见性
2.禁止指令重排
3.不保证原子性
原理
内存屏障
读屏障
读共享变量之后的代码不能重排序到读屏障之前
写屏障
写共享变量之前的代码不会重排序到写屏障之后
Final
1.Final类,不能被子类继承
2.Final域,不能被改变,底层有写屏障
3.Final方法
并发工具
线程池
J.U.C
AQS
J.U.C工具的基础
提供FIFO的等待队列,类似于Monitror的EntryList
使用CAS来设置资源状态state,支持独占模式和共享模式
ReentrantLock
特点
可重入
可打断
可设置超时
可设置公平锁
可设置多个条件变量
读写锁
ReentrantReadWriteLock
读锁不支持条件变量
写锁支持条件变量
重入时不支持锁升级,支持锁降级
StampedLock
读写时配合戳一起使用
乐观读,tryOptimisticRead
1.获取戳
2.验戳
成功,无锁读
失效,锁升级
semaphore
信号量,限制同时访问共享资源的线程数
CountdownLatch
倒计时锁
其他线程调用countDown,将count - 1
另外一些线程await,等待count = 0时开始执行
CyclicBarrier
循环栅栏
多个等待线程到达某个需要等待同步的位置调用await方法等待
当等待的线程数满足预先设置的数时,所有等待的线程都开始执行
并发集合
ConcurrentHashMap
JDK 1.7
JDK 1.8
BlockingQueue
ConcurrentLinkedQueue
CopyOnWriteArrayList
收藏
0 条评论
下一页