多线程学习三(synchronized和Lock)
2016-01-07 10:43
134 查看
注意:JDK1.4之前版本用同步synchronized, JDK1.5之后版本用java.util.concurrent.locks中的Lock接口。
它比synchronized有更多的操作。
1.同步代码块或同步函数的锁操作是隐式的,为了体现面向对象的思想,JDK1.5(5.0)及之后有了Lock接口,将锁单独封装
成一个对象并且提供了对锁的显示操作。
简介ReentrantLock的使用
一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语
义,但功能更强大。
ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用
ock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。
举例:
实践,使用 try 块来调用 lock,在之前/之后的构造中,最典型的代码如下:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
除了实现 Lock 接口,此类还定义了 isLocked 和 getLockQueueLength 方法,以及一些相关的 protected 访问方法,
这些方法对检测和监视可能很有用。
2.旧版本将监视器方法(wait(),notify(),notifyAll())封装到了每一个对象中,而现在将监视器方法(await(),signal(),signalAll())封装到了Condition对象中,这样可以通过Lock接口的newCondition()方法完成。
举例
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();
}
}
它比synchronized有更多的操作。
1.同步代码块或同步函数的锁操作是隐式的,为了体现面向对象的思想,JDK1.5(5.0)及之后有了Lock接口,将锁单独封装
成一个对象并且提供了对锁的显示操作。
简介ReentrantLock的使用
一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语
义,但功能更强大。
ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用
ock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。
举例:
实践,使用 try 块来调用 lock,在之前/之后的构造中,最典型的代码如下:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
除了实现 Lock 接口,此类还定义了 isLocked 和 getLockQueueLength 方法,以及一些相关的 protected 访问方法,
这些方法对检测和监视可能很有用。
2.旧版本将监视器方法(wait(),notify(),notifyAll())封装到了每一个对象中,而现在将监视器方法(await(),signal(),signalAll())封装到了Condition对象中,这样可以通过Lock接口的newCondition()方法完成。
举例
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();
}
}
相关文章推荐
- Objective-C中的实例方法、类方法、Category、Protocol
- SSO单点登录学习总结(2)——基于Cookie+fliter单点登录实例
- 解决XCode7.1 上无法安装 Alcatraz PackageManager
- 标准库类型string
- 欢迎使用CSDN-markdown编辑器
- C++ typedef用法小结 (※不能不看※)
- redis学习(一)redis for mac安装,启动,关闭,卸载
- PHP中单引号和双引号的区别
- 常用对象API、附加:集合补充
- form表单提交校验
- 打开适配器并捕获数据包
- 模态model窗口跟地图样式冲突的一些问题!
- Hibernate框架详解(一)总结介绍
- AXIS2远程调用WebService示例(Eclipse+AXIS)
- YTU 1004: 1、2、3、4、5...
- QT生成可执行的EXE程序
- 命令行BASH的基本操作
- 关系学习的一些资料
- 张量简介
- UITableView实现上拉加载更多