锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁是可以允许多个线程并发的访问共享资源的,比如读写锁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 加以保护,以确保在必要时释放锁。

results matching ""

    No results matching ""