同步2:ReentrantLock类的使用

274 篇文章 4 订阅
71 篇文章 0 订阅

使用重入锁实现线程同步 在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。

 ReentrantLock类是可重入、互斥、实现了Lock接口的锁,

 它与使用synchronized方法和快具有相同的基本行为和语义,

 并且扩展了其能力 ReenreantLock类的常用方法有:

 ReentrantLock() : 创建一个ReentrantLock实例 lock() : 获得锁 unlock() :

 释放锁

ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用

 

 例如: 在上面例子的基础上,改写后的代码为: 代码实例:

 复制代码//只给出要修改的代码,其余代码与上同 class Bank { private int account = 100;

 //需要声明这个锁 private Lock lock = new ReentrantLock(); public int getAccount() { return account; }

 //这里不再需要synchronized public void save(int money) { lock.lock(); try{ account += money; }finally{ lock.unlock(); } } }

 

1.关于Lock对象和synchronized关键字的选择:

 a.最好两个都不用,使用一种java.util.concurrent包提供的机制, 能够帮助用户处理所有与锁相关的代码。

 b.如果synchronized关键字能满足用户的需求,就用synchronized,因为它能简化代码

 c.如果需要更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally代码释放锁

 

  1. 代码示例

ReentrantLock lock = new ReentrantLock();

public boolean isLocked(){
    return lock.isLocked();
}

lock.lock();

finally {
   lock.unlock();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值