锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁是可以允许多个线程并发的访问共享资源的,比如读写锁ReadWriteLock)
在JDK1.5版本之前,Java程序是靠synchronize关键字来实现锁功能的,而JDK1.5之后,并发包java.util.concurrent下新增了Lock接口,它提供了与synchronize关键字类似的同步功能。
Lock与synchronize的对比
Lock需要显示的获取锁和释放锁,而synchrnized通过synchronize块或者方法所提供的隐式的获取和释放锁,
但Lock获取锁和释放所的可操作(lock()\unlock()
)、可中断的获取锁(lockInterruptibly()
)、可设置超时获取锁(tryLock()
和tryLock(long, TimeUnit)
)等特性是sync不具备的特性。
需要注意
随着灵活性的增加,也带来了更多的责任。不使用块结构锁就失去了使用 synchronized方法和语句时会出现的锁自动释放功能。在大多数情况下,应该使用以下语句
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}
锁定和取消锁定出现在不同作用范围中时,必须谨慎地确保保持锁定时所执行的所有代码用 try-finally 或 try-catch 加以保护,以确保在必要时释放锁。