一、出现的契机
Lock提供了比synchronized方法和synchronized代码块更广泛的锁定操作,Lock使用方式更加灵活,它拥有synchronized方法和synchronized代码块所没有的其它功能,包括非块结构的tryLock()方法、试图获取可中断锁的lockInterruptibly()方法、还有获取超时失效的tryLock(long, TimeUnit)方法。
二、常用锁ReentrantLock(可重入锁)
使用该锁可以显式地加锁、释放锁。ReentrantLock代码格式通常如下:
class X{
//定义锁对象
private final ReentrantLock lock = new ReentrantLock();
//定义需要保证线程安全的方法
public void m(){
//加锁
lock.lock();
try{
//需要保证线程安全的代码
//... 方法体
}
//使用finnally块来保证释放锁
finally{
lock.unlock();
}
}
}
Lock与同步方法相似,使用Lock 时显式使用Lock 对象作为同步锁,而使用同步方法时系统隐式使用当前对象作为同步监视器。
三、死锁
两个线程相互等待对方释放同步监视器是就会发生死锁。Java 虚拟机没有检测,出现死锁不会采取措施来处理死锁,所以在多线程编程时应采取措施避免死锁出现。
class A
{
public synchronized void foo( B b )
{
System.out.println("当前线程名: " + Thread.currentThr