一.阻塞队列 和并发队列
1.什么是队列
一种支持先进先出(FIFO)的线性数据结构
2.如果让你设计一个线程安全的队列 你会怎么做?
可以用锁,消费者 生产者模式,状态变更 condition
注意去判断的时候要用while (因为等待线程有很多个,你倍唤醒之后不一定是执行成功,可能再次等待)
等待之后 唤醒所有线程去抢
(1)arrayBockingQueue 一把锁要么能取 要么放
a.数组
b.从哪里取的指针
c.从哪里放指针
d. 现有数量
c.锁
d. 队列状态 是否空(condition) 空了等待
e.队列状态 是否满(condition ) 满了等待
(2)linkedBockingQueue 取或者放不影响
a.队列
b.要设计的队列长度 (参数)
c. 现有数量atomicInteger
d.put锁
e.get 锁
f. 队列状态 是否空(condition) 空了等待
g.队列状态 是否满(condition ) 满了等待
fale share (伪共享)
就是两个数据是相邻,放在同一个缓存行,如果其中一个数据被修改,会重新同步到缓存中.
解决方法: 填充(Padding) 两个之间在不同缓存行里(64字节)手动设置或者@Contended -java1.8自带的(加128字节)