赞
踩
1.7
1.8
扩容机制
LoadFactory 默认0.75
创建一个空数组重新Hash
线程不安全
2的幂次
重写equals必须重写HashCode
安全失败
1.7
数组+链表
segment分段锁
get高效 volatile修饰 不需要加锁
volatile修饰节点指针
HashEntry
1.8
数组+链表+红黑树
CAS+synchronized
cas失败自旋保证成功
node
场景
如何保证可靠
select
poll
epoll
对象
对象头(Header)
Mark Word(存储对象的HashCode,分代年龄和锁标志位信息。)
Klass Point(对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。)
Monitor
实例数据
对其填充
方法
代码块
monitorenter
monitorexit
程序计数器 count
锁膨胀
无锁
偏向锁
轻量级
自旋
重量级
特性保证
有序性
可见性
原子性
可重入性
重锁
sync 和 Lock的区别
synchronized是关键字,是JVM层面的底层啥都帮我们做了,而Lock是一个接口,是JDK层面的有丰富的API。synchronized会自动释放锁,而Lock必须手动释放锁。synchronized是不可中断的,Lock可以中断也可以不中断。通过Lock可以知道线程有没有拿到锁,而synchronized不能。synchronized能锁住方法和代码块,而Lock只能锁住代码块。Lock可以使用读锁提高多线程读效率。synchronized是非公平锁,ReentrantLock可以控制是否是公平锁。
劣势
ReentrantReadWriteLock
ReentrantLock
NonfairSync
FairSync
AbstractQueuedSynchronizer
入队 出队
头结点设计
共享和独享的实现
CAS
实际应用
存在的问题
cpu开销
只能保证一个共享变量原子操作
ABA
StampedLock
MESI
当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取
锁bus
volitale会一直嗅探 cas 不断循环无效交互 导致带宽达到峰值
Java内存模型JMM
可见性
嗅探机制 强制失效
有序性
禁止指令重排序
lock 前缀指令 内存屏障
happens-before
as-if-serial
AtomicInteger
跳出死循环
newFixedThreadPool
newCacheThreadPool
newSIngleTheadExecutor
newScheduledThewadPool
newWorkStealingPool
ThreadPoolExecutor
参数意义
核心线程数
最大线程数
空闲时间&单位
缓冲队列
LinkedBlockingQueue
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。