1. ReentrantLock簡介
ReentrantLock(輕量級鎖)也可以叫對象鎖,可重入鎖,互斥鎖。synchronized重量級鎖,JDK前期的版本lock比synchronized更快,在JDK1.5之后synchronized引入了偏向鎖,輕量級鎖和重量級鎖。以致兩種鎖性能旗鼓相當,看個人喜歡,本文主要介紹一下怎么簡單使用lock。
2.ReentrantLock重入鎖lock()
每個線程都能獲取相應的lock鎖和釋放鎖unlock,這些鎖並不適用分布式環境。
package com.test; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Test{ public static Lock lock = new ReentrantLock(); public String test() throws Exception { lock.lock(); try { //TODO } catch (Exception e) { throw new Exception(e); } finally { lock.unlock(); } return null; } }
3.ReentrantLock嘗試獲取鎖有返回值tryLock()
tryLock()方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失敗(即鎖已被其他線程獲取),則返回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那等待。
public class Test{ public static Lock lock = new ReentrantLock(); public String test() throws Exception { if(lock.tryLock()){//嘗試獲取鎖 try { //TODO } catch (Exception e) { throw new Exception(e); } finally { lock.unlock(); } }else{ //不能獲取鎖 } return null; } }
tryLock(long time, TimeUnit unit)方法和tryLock()方法是類似的,只不過區別在於這個方法在拿不到鎖時會等待一定的時間,在時間期限之內如果還拿不到鎖,就返回false。如果如果一開始拿到鎖或者在等待期間內拿到了鎖,則返回true。