博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA基础知识(13)-----Lock接口
阅读量:4677 次
发布时间:2019-06-09

本文共 1387 字,大约阅读时间需要 4 分钟。

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();
}
}
}

转载于:https://www.cnblogs.com/ipetergo/p/6623346.html

你可能感兴趣的文章
dubbo 使用 filter 报错解决
查看>>
NOIP2018:The First Step
查看>>
asp.net mvc网站的发布与IIS配置
查看>>
JS创建Ajax的XMLHttpRequest对象的通用方法
查看>>
postgresql全文检索语法
查看>>
语音转写平台-非实时语音分割
查看>>
collections 模块常用方法学习
查看>>
HDU 5832 A water problem 大数取余
查看>>
微软官方中文新书《Windows Phone 7应用开发指南 》出版
查看>>
Python实现无向图最短路径
查看>>
《结网》—— 读后总结
查看>>
windows 的文件夹映射实现
查看>>
初始函数与函数的参数
查看>>
Java PDF转换成图片并输出给前台展示
查看>>
C++取止运算符重载
查看>>
此生对我影响最大的三位老师
查看>>
基于C#的Lync Server管理
查看>>
python+selenium如何定位页面的元素,有几种定位元素的方法?
查看>>
Exception occurred during processing request: id to load is required for loading
查看>>
go语言,chanel and goroutine(golang)(三)
查看>>