“J.U.C”:Condition
来源:互联网 发布:中药大词典软件 编辑:程序博客网 时间:2024/06/18 00:23
在看Condition之前,我们先来看下面这个例子:
工厂类,用来存放、取出商品:
生产者,生产商品,往仓库里面添加商品:
消费者,消费商品,从仓库里面取出商品:
测试类:
运行结果:
程序的运行结果是没有错误的,先put10、然后get5、put20、put5、get35。程序运行结果非常正确,但是在现实生活中,这个实例存在两处错误:
第一:仓库的容量是有限的,我们不可能无限制的往仓库里面添加商品。
第二:仓库的容量是不可能为负数的,但是最后的结果为-5,与现实存在冲突。
针对于上面两处错误,怎么解决?这就轮到Condition大显神通了。
Condition
通过前面几篇博客我们知道Lock提供了比synchronized更加强大、灵活的锁机制,它从某种程度上来说替代了synchronized方式的使用。Condition从字面上面理解就是条件。对于线程而言它为线程提供了一个含义,以便在某种状态(条件Condition)可能为true的另一个线程通知它之前,一直挂起该线程。
对于Condition,JDK API中是这样解释的:
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
条件(也称为条件队列 或条件变量)为线程提供了一个含义,以便在某个状态条件现在可能为 true 的另一个线程通知它之前,一直挂起该线程(即让其“等待”)。因为访问此共享状态信息发生在不同的线程中,所以它必须受保护,因此要将某种形式的锁与该条件相关联。等待提供一个条件的主要属性是:以原子方式 释放相关的锁,并挂起当前线程,就像 Object.wait 做的那样。
Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,请使用其newCondition() 方法。下面我们通过Condition来解决上面的问题:这里只改仓库Depot的代码:
test:
运行结果:
在Condition中,用await()替换wait(),用signal()替换 notify(),用signalAll()替换notifyAll(),对于我们以前使用传统的Object方法,Condition都能够给予实现。
- “J.U.C”:Condition
- J.U.C之Condition
- “J.U.C”:Condition (r)
- J.U.C--locks--Condition
- 【Java并发编程实战】—–“J.U.C”:Condition
- 【Java并发编程实战】—–“J.U.C”:Condition
- 【Java并发编程实战】-----“J.U.C”:Condition
- 【死磕Java并发】-----J.U.C之Condition
- 【死磕Java并发】—–J.U.C之Condition
- J.U.C体系
- J.U.C
- “J.U.C”:ReentrantReadWriteLock
- J.U.C重入锁
- J.U.C包介绍
- J.U.C包介绍
- J.U.C之Future
- J.U.C之CopyOnWriteArrayList
- J.U.C之CountDownLatch
- 自带3D全景漫游神技能的H5是如何炼成的
- effective java —— 终结方法守卫者
- java中实现定时任务的方式详解
- java dump文件怎么生成和分析-JMAP用法
- 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)
- “J.U.C”:Condition
- MySQL 数据库开发的 36 条军规
- centos6.5环境下sysbench
- 数据库增删改查使用的函数封装
- 解决windows下的mysql匿名登陆无法使用mysql数据库的问题
- coordinator.py
- media响应式布局
- centos7重装防火墙【L】
- github学习