Java并发 concurrent
concurrent包的实现
由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现
在有了下面4种方式。
1)A线程写volatile变量,随后B线程读这个volatile变量。
2)A线程写volatile变量,随后B线程用CAS更新这个volatile变量。
3)A线程用CAS更新个volatile变量,随后B线程用CAS更新这个volatile变量。
4)A线程用CAS更新个volatile变量,随后B线程读这个volatile变量。concurrent包的实现示意图:
阻塞队列 BlockingQueue :表示一个线程安放入和提取实例的队列
用法:BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景
一个线程往里边放,另外一个线程从里边取的一个 BlockingQueue
方法:
方法 | 抛异常 | 特定值 | 阻塞 | 超时 |
---|---|---|---|---|
插入 | add(o) | offer(o) | put(o) | offer(o, timeout, timeunit) |
移除 | remove(o) | poll(o) | take(o) | poll(timeout, timeunit) |
检查 | element(o) | peek(o) |
抛异常:如果试图的操作无法立即执行,抛一个异常。
特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。
阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。
超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不
ArrayBlockingQueue :是一个有界的阻塞队列,其内部实现是将对象放到一个数组里。
如: BlockingQueue queues = new ArrayBlockingQueue(1024);
DelayQueue( 延迟队列): 实现了 BlockingQueue 接口。DelayQueue 对元素进行持有直到一个特定的延迟到期