2018-11-26 blockingqueue 源码分析
线程安全的阻塞队列
1.ArrayList 设置maxLength
2.put 放入元素
synchronized(lock){}
获得锁
判断list.size()==maxlength lock.wait() 如果没有空间了 线程等待 释放锁
有位置:
list.add();
lock.notifyAll(); 多线程的取和拿的时候 每次变动 要唤醒下等待的队列
notifyAll是无序的 但是线程执行是有序列号的 所以被唤醒的线程也会按顺序存进list的
Thread 的优先级 cpu的调度 priority
3.take
synchronized(lock){}
获得锁
判断list.size()== 0 lock.wait() 如果没有数据了 线程等待 释放锁
否则
list.get(0);
list.remove(0);
notifyAll是无序的 但是线程执行是有序列号的 所以被唤醒的线程也会按顺序存进list的
总结 jdk1.5之前 用synchronized关键字 保证线程安全
之后 源码用 ReentrantLock 锁的机制来控制线程安全
lock.unlock() 释放锁
synchronized 生产者和消费者模型
Lock.Condition Producer and Consumer 模型