JAVA多線程ReentrantLock的lock(), tryLock(), tryLock(long timeout, TimeUnit unit) 及使用場景的簡單示例


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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM