Lock接口:多线程在JDK1.5版本升级时,推出一个接口Lock接口。
解决线程安全问题使用同步的形式,(同步代码块,要么同步函数)其实最终使用的都是锁机制。

到了后期版本,直接将锁封装成了对象。线程进入同步就是具备了锁,执行完,离开同步,就是释放了锁。
在后期对锁的分析过程中,发现,获取锁,或者释放锁的动作应该是锁这个事物更清楚。所以将这些动作定义在了锁当中,并把锁定义成对象。

所以同步是隐示的锁操作,而Lock对象是显示的锁操作,它的出现就替代了同步。

在之前的版本中使用Object类中wait、notify、notifyAll的方式来完成的。那是因为同步中的锁是任意对象,所以操作锁的等待唤醒的方法都定义在Object类中。

而现在锁是指定对象Lock。所以查找等待唤醒机制方式需要通过Lock接口来完成。而Lock接口中并没有直接操作等待唤醒的方法,而是将这些方式又单独封装到了一个对象中。这个对象就是Condition,将Object中的三个方法进行单独的封装。并提供了功能一致的方法 await()、signal()、signalAll()体现新版本对象的好处。
< java.util.concurrent.locks > Condition接口:await()、signal()、signalAll();
--------------------------------------------------------
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
}
finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
}
finally {
lock.unlock();
}
}
}

最新文章

  1. R语言学习-基础篇
  2. 工作单元模式(UnitOfWork)学习总结
  3. 文本框只读属性,disabled不能提交
  4. 2.Java对象创建
  5. 解决MySQL中【Cannot load from mysql.proc. The table is probably corrupted
  6. CSS投影实现方式
  7. hdu_5806_NanoApe Loves Sequence Ⅱ(双指针)
  8. Python中super的用法
  9. layer弹窗插件实战用法小结1—— layer.alert()
  10. Python-String字符串的相关方法
  11. Ironic中pxe driver和agent driver的区别
  12. iframe 背景透明设置--兼容IE
  13. (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
  14. 不懂RPC实现原理怎能实现架构梦
  15. opengl 几何着色器
  16. 自动控制中常用的Matlab命令
  17. PAT B1050 螺旋矩阵 (25 分)
  18. java跨域解决
  19. Refactoring #001 Extract Method
  20. 9款HTML5实现的超酷特效

热门文章

  1. Centos6.5下ElasticSearch1.4.4的安装
  2. Centos7 搭建DNS服务器与原理配置详解
  3. java基础(8)-集合类
  4. poj 2478 Farey Sequence 欧拉函数前缀和
  5. DelphiXE
  6. Jedis源代码探索
  7. XSS 跨站攻击
  8. 常用的CDN 链接 http://cdn.code.baidu.com/ http://www.bootcdn.cn/
  9. GIT 应用gitreview方式提交代码过程
  10. SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)