java 高并发知识图谱
2021-01-24 17:13:08 0 举报
AI智能生成
jvm 多线程, 高并发知识图谱
作者其他创作
大纲/内容
concurrent
ReentranLock
Condition
子主题
AbstractQueuedSynchronizer
Node
每个等待的线程都是一个node
每个等待的线程都是一个node
waitStatus:
状态: 阻塞,wait, 取消执行 ......
状态: 阻塞,wait, 取消执行 ......
thread: node关联的线程
nextWaiter
state: 可用的资源数量,
semphore/CountDownLatch: 可以设置为多个
ReentrantLock: 设置为1
semphore/CountDownLatch: 可以设置为多个
ReentrantLock: 设置为1
CyclicBarrier
CyclicBarrier设置一个总值, 多个线程调用await方法后开始阻塞
当总值为0 ,所有线程才能执行
当总值为0 ,所有线程才能执行
CountDownLatch
设置一个总值, 每次使用减1 , A线程调用await方法,
A线程阻塞到 CountDownLatch值为0
A线程阻塞到 CountDownLatch值为0
Semaphore信号量
设置总值, 每次使用减1, 用完加1
Phaser
Exchanger
两个线程交换值
ReentrantReadWriteLock
子主题
LockSupport
可以在任何地方暂停一个线程指定时间, 类似wait, 但是不需要在synchronized内执行
CompletableFuture
Future.get方法还是会阻塞, CompletableFeture 可以以回调的方式进行
本质也是交给线程池去执行
还有串行, 并行等线程间的协调功能
ForkJoinPool
任务拆分后汇总, 类似于MapReduce
ConCurrentHashMap
CopyOnWriteArrayList
线程安全的list
缺点: 占用内存较多
只能保证数据的最终一致性
缺点: 占用内存较多
只能保证数据的最终一致性
dituptor
一个高性能队列
可以理解为一个消息队列或者是观察者模式
可以用来在不同线程间传递数据的
Thread
join
interrupt
ThreadPoolExecutor
ThreadLocal
结论: 可能会造成内存泄漏
引用链: Thread -> ThreadLocalMap -> Entry(ThreadLocal , Value)
Entry中的threadLocal是弱引用, 所以Entry可能变成无法使用的数据 Entry(null, value)
Entry中的threadLocal是弱引用, 所以Entry可能变成无法使用的数据 Entry(null, value)
如果不使用线程池那么线程销毁之后 引用连也就断裂了, 所有对象都会被回收
如果使用的是线程池, 那么所有对象都无法回收, Entry的key为null导致无法引用, 成了脏数据
ThreadLocal 也有优化, 会去清理key为null的值, 但并不是总能起效
最佳实践: 每次使用完都清空
CAS
变更失败时自旋,
比如: AtomicInteger 的 getAndIncrease 第一次失败之后,
会重新获取内存的值,然后再相加, 再设置
比如: AtomicInteger 的 getAndIncrease 第一次失败之后,
会重新获取内存的值,然后再相加, 再设置
cas是一组原子命令, 但是不保证可见性,所以需要加volatile
比如AtomicInteger的value就加了volatile
比如AtomicInteger的value就加了volatile
Synchronized
java对象结构
对象头
markworld
锁的状态不同,结构也会不同
锁的状态不同,结构也会不同
无锁状态
偏向锁: 线程已经获得了锁, 再次进入时无需再次获取
轻量锁
自旋锁: 等待的锁先循环一会, 减少上下文的切换
重量级锁
Class Metadata Address
实例数据
补充对齐
monitor对象
wait_set
存储wait的线程
entry_list
存储阻塞的线程
owner
持有锁的线程
Copy-on-writer
在往容器写入的时候, 复制一个原来的容器,往新的容器内写入数据.
写入完成之后再将旧的容器的引用指向新的容器
写入完成之后再将旧的容器的引用指向新的容器
优点: 可以不用加锁
缺点: 只能保证数据的最终一致性,
占用内存较多
缺点: 只能保证数据的最终一致性,
占用内存较多
CopyOnWriteArrayList
CopyOnWriteSet
0 条评论
下一页