使用重入锁实现线程同步 在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代码释放锁
- 代码示例
ReentrantLock lock = new ReentrantLock();
public boolean isLocked(){
return lock.isLocked();
}
lock.lock();
finally {
lock.unlock();
}