JAVA 多线程和锁
2022-05-26 16:24:16 0 举报
AI智能生成
多线程和锁知识架构图
作者其他创作
大纲/内容
使用链表,插入和删除速度快
LinkedList
foreach最快
使用数组,随机查询速度快
通过System.arraycopy进行扩容
新的容量=“(原始容量x3)/2 + 1”
默认容量大小是10
通过get(i)遍历最快
ArrayList
使用synchronized方法同步实现线程安全,速度慢
Stack
Vector
AbstractList
List
通过HashMap实现,value为null
HashSet
通过TreeMap实现
TreeSet
AbstractSet
Set
AbstracetCollection
Collection
默认扩容因子0.75,达到0.75就会进行扩容
默认容量大小是16
通过entryset遍历最快
HashMap
红黑树实现
TreeMap
WeakHashMap
AbstractMap
HashTable
Map
不安全(单个线程操作)
元素不多,少改,多查
遍历时使用snapshot,速度快
不支持可变Remove()
对数据组进行snapshot,然后在进行操作,最后进行复制合并
CopyOnWriteArrayList
通过CopyOnWriteArrayList实现
CopyOnWriteArraySet
通过ConcurrentSkipListMap实现
ConcurrentSkipListSet
内部结构是维护一个HashEntry的数组,put时,对key进行hash,获取hash在entry数组上的index,然后对当前index的entry进行操作,entry是一个单向链表,可以存储多个映射并形成单向链表。Entry数组的访问和元素之间的操作可以是并发的,每个元素都是一个hash段的entry,并持有一个可重入的锁,防止对当前元素进行并发操作。
通过“锁分段”来实现
ConcurrentHashMap
对key进行分层排序,通过在最高层向下按区间最快查找到元素,如一排10个木桩,高矮不一,有序
通过“跳表”来实现
ConcurrentSkipListMap
ArrayBlockingQueue
LinkedBlockingQueue / Deque
BlockQueue
ConcurrentLinkedQueue / Deque
LinkedTransferQueue
Queue
安全(可多个线程同时操作)
Arrays
Collections
System.arraycopy
工具类
集合
用户提交的需要执行的线程缓存队列
BlockingQueue<Runnable> workQueue
第个Worker是一个线程,通过Worker线程获取workQueue里面的用户线程进行执行
HashSet<Worker> workers = new HashSet<Worker>();
控制Worker的创建和销毁
corePoolSize / maximumPoolSize / keepAliveTime
RejectedExecutionException
AbortPolicy(默认)
CallerRunsPolicy
使用线程池正在运行的线程执行当前任务
DiscardOldestPolicy
DiscardPolicy
handler
互斥锁,控制对workers的访问
mainLock
terminated
afterExecute
beforeExecute
钩子函数
ThreadPoolExecutor
线程池
Thread / Callable / Runnable
对象创建
新建(new)
调用start()方法后随时准备cpu执行
不能重复调用start
就绪(start)
获取CPU进行执行,只能坐吃山空就绪到执行
run被线程执行,也可手动执行run在当前线程中执行了一个方法 调用,不会新建线程执行
执行(running)
wait() / synchronized / sleep() /join() 等操作导致的阻塞,阻塞时有的释放锁,有的继续持有锁
阻塞(block)
run()结束或异常终止
停止(dead)
线程状态
守护线程(Daemon)
用户线程(用户新建/main()/pool)
分类
多个线程同时操作是否能获取预期的结果
线程安全
interrupt()
isInterrupt()
常用方法
线程
wait
notify
Object
对象方法
代码块
静态方法
synchronized
同步锁
ReentrantLock
Lock
ReadLock
WriteLock
ReentrantReadWriteLock
StampedLock
ReadWriteLock
park/unpark 解决Thead 死锁
LockSupport
Condition
Sync
AbstractQueuedSynchronizer
AQS抽象
CLH队列是AQS中“等待锁”的线程队列
CLH
CAS函数,是比较并交换函数,它是原子操作函数,直接操作内存,操作不中断
CAS函数
JUC锁
公平锁
非公平锁
定义:锁在一个时间点只能被一个线程锁占有
ReentrantReadWriteLock里的WriteLock
独占锁
ReentrantReadWriteLock里的ReadLock
能被多个线程同时拥有,能被共享的锁
循环栅栏,初始时设定参与线程数,当线程到达栅栏后,会等待其它线程的到达,当到达栅栏的总数满足指定数后,所有等待的线程继续执行
CyclicBarrier
倒数计数器,初始时设定计数器值,线程可以在计数器上等待,当计数器值归0后,所有等待的线程继续执行
CountDownLatch
访问共享资源的许可证
Semaphore
两个线程之间的数据交换
Exchanger
多阶段栅栏,可以在初始时设定参与线程数,也可以中途注册/注销参与者,当到达的参与者数量满足栅栏设定的数量后,会进行阶段升级(advance)
Phaser
共享
常用
在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。通过Unsafe的CAS函数和volatile 特性直接操作系统内存实现对基本类型的累加/引用类型的变更/对象属性的变更/数组元素的修改
LongAdder
AtomicLong-Integer-Boolean
基本类型
AtomicLong-Integer-Reference-Array
数据类型
AtomicReference/AtomicStampedRerence/AtomicMarkableReference
引用类型
Atomic-Long-Integer-Reference-FieldUpdater
对象属性修改
CAS原子类
锁
多线程
0 条评论
下一页