当前位置: 首页 > news >正文

河北省建设工程招标投标协会网站/重庆百度seo代理

河北省建设工程招标投标协会网站,重庆百度seo代理,wordpress 替换google,北京全包圆装修公司好不好2019独角兽企业重金招聘Python工程师标准>>> Lock && Condition_实现有界缓存 ‍Lock是一种广义的内置锁,Condition也是一种广义的内置条件队列。‍ 内置条件队列存在一些缺陷。每个内置锁都只能有一个相关的条件队列,因而多个线程可…

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Lock && Condition_实现有界缓存

Lock是一种广义的内置锁,Condition也是一种广义的内置条件队列

内置条件队列存在一些缺陷。每个内置锁都只能有一个相关的条件队列,因而多个线程可能在同一个条件队列上等待不同的条件谓词,并且在最常见的加锁模式下公开条件队列对象。

这些因素都使得无法满足在使用notifyAll时所有等待线程为同一类型的需求。如果想编写一个带有多个条件谓词的并发对象,或者想获得除了条件队列可见性的更多控制权,就可以使用显示的Lock和Condition而不是内置锁和内置条件队列,这是一种更灵活的选择。

Lock比内置锁提供了更为丰富的功能,Condition同样比内置条件队列提供了更丰富的功能:在每个锁上可能存在多个等待、条件等待可以是可中断的、基于时限的等待,以及公平的或非公平的队列操作。

与内置条件队列不同的是,对于每个Lock,可以有任意数量的Condition对象。Condition对象继承了相关的Lock对象的公平性,对于公平的锁,线程会依照FIFO顺序从Condition.await中释放。

下面这段程序给出了有界缓存的另一种实现,即‍使用两个Condition,分别为notFull和notEmpty‍,用于表示”非满“和”非空“两个条件谓词。当缓存为空时,take将阻塞并等待notEmpty,此时put向notEmpty发送信号,可以解除任何在take中阻塞的线程。

 

使用显示条件变量的有界缓存

package sync;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** Created with IntelliJ IDEA.* User: ASUS* Date: 14-9-1* Time: 下午9:20* To change this template use File | Settings | File Templates.*/
public class ConditionBoundedBuffer<T> {protected final Lock lock = new ReentrantLock();//条件谓词:notFullprivate final Condition notFull = lock.newCondition();//条件谓词:notEmptyprivate final Condition notEmpty = lock.newCondition();private final T[] items;private int tail, head, count;protected ConditionBoundedBuffer(int size) {items = (T[]) new Object[size];}/*** 阻塞并直到notFull** @param x* @throws InterruptedException*/public void put(T x) throws InterruptedException {lock.lock();try {while (count == items.length) {// 阻塞,等待非满条件System.out.println("not full await");notFull.await();}items[tail] = x;if (++tail == items.length) {tail = 0;}++count;notEmpty.signal();} finally {lock.unlock();}}/*** 阻塞并直到notEmpty** @return* @throws InterruptedException*/public T take() throws InterruptedException {lock.lock();try {while (count == 0) {// 阻塞,等待非空条件System.out.println("not empty await");notEmpty.await(); //现在有界缓存为空,要等到非空状态才能取出元素}T x = items[head];items[head] = null;if (++head == items.length) {head = 0;}--count;notFull.signal(); //元素已被取出,通知非满状态return x;} finally {lock.unlock();}}public static void main(String args[]) {final ConditionBoundedBuffer buffer = new ConditionBoundedBuffer(10);//线程t2打印缓存中的消息Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {System.out.println(buffer.take());} catch (InterruptedException e) {e.printStackTrace();}}}});//线程t1放入缓存消息Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 100; i++) {try {buffer.put(new String("sadsasd"));} catch (InterruptedException e) {e.printStackTrace();}}}});t2.start();t1.start();}
}

============END============

转载于:https://my.oschina.net/xinxingegeya/blog/309323

http://www.lbrq.cn/news/1425817.html

相关文章:

  • 网站建设案例咨询/网络推广app是违法的吗
  • 人人做免费网站/佛山做网站建设
  • 构建html5博客网站/传媒网站
  • 石家庄广告公司前十名/网站优化 福州
  • 注册百度网站怎么弄/武汉seo招聘网
  • 百度搜搜网站自动显示图片/信息流推广主要具有哪两大优势
  • 网站建设推广是什么意思/日本shopify独立站
  • 网站关键字推广/百度一下你就知道官网网址
  • 衡水哪儿做网站便宜/刷排名的软件是什么
  • b2b和b2c平台/沧州seo公司
  • 30天网站建设实录下载/百度搜索关键词优化方法
  • 江门市外事侨务局网站党建设/上海网站快速排名优化
  • 北京做网站哪家便宜/企业网站建设流程
  • 如何申请企业邮箱免费/seo排名的影响因素有哪些
  • 江门公司网站建设/网上怎么推销自己的产品
  • 北京顺义网站建设/seo数据是什么意思
  • wordpress模板 微信/企业seo网站推广
  • 布吉做网站/seo公司服务
  • 网站标签怎么做跳转页面/做公司网页
  • 网站开发工程师符号代码/web网页制作成品免费
  • 泉州做网站公司/网络推广运营优化
  • 网站如何做排名靠前/关键词优化有哪些作用
  • 动态网站 教程/手机百度
  • 定制营销型网站公司/深圳百度推广联系方式
  • b2b2c网站系统建设/seo矩阵培训
  • wordpress视频教程 电驴/南昌百度seo
  • 小满crm/山东seo百度推广
  • 怎么免费建设金融网站/制定营销推广方案
  • 哪里可以做网站/哪家公司做推广优化好
  • 网站什么认证对做电商好/搜索引擎优化的方法包括
  • OBOO鸥柏丨75寸/86平板企业办公会议触控一体机核心国产化品牌招投标参数
  • linux服务器查看某个服务启动,运行的时间
  • MySQL 主键详解:作用与使用方法
  • 数据结构初阶:排序算法(二)交换排序
  • XXL-TOOL v2.0.0 发布 | Java工具类库
  • Java-JVM是什么JVM的类加载机制