上一篇文件講了java多線程的基礎知識,同步處理使用synchronized關鍵字。從Java5開始,引入了Lock類,改類在包java.util.concurrents.locks下面。使用該包下的類也可以進行併發編程。其中Lock和ReadWriteLock是兩個最基本的接口,我們經常使用的是ReentrantLock類和ReentrantReadWriteLock類,它們分別是基類的實現類。
一.Lock類使用:
它的使用其實就是將自己作爲鎖對象,使用之前會用lock()方法加鎖,使用完用unlock()方法解鎖。它們中間的代碼是線程安全的。Lock類還有tryLock()方法判斷調用的對象是否被鎖住,它有返回值。它還支持鎖的中斷,阻塞線程可以跳出對已鎖對象的調用。
例子:
import java.util.concurrent.locks.ReentrantLock;
public class ZLock implements Runnable
{
private final ReentrantLock lock=new ReentrantLock();
public void run()
{
lock.lock(); //加鎖
try
{
for(int i=0;i<10;i++)
System.out.println(Thread.currentThread().getName()+": "+i);
}
finally
{
lock.unlock(); //釋放鎖,一般放在finally塊中
}
}
public static void main(String[] args)
{
ZLock rl=new ZLock();
new Thread(rl,"子線程1").start();
new Thread(rl,"子線程2").start();
}
}
結果:
二.Lock類特性
1.可重入性:
synchronized和Lock都具有可重入性。可重入性,舉個例子,一個類中,有兩個被synchronized修飾的方法,其中一個方法調用另外一個方法,這是可以調用成功的。一個線程已經獲得了該對象的鎖,該對象調用自己的或者父類的方法(無論有無同步),都會成功。這就是可重入性(reentrant :可重入),一個線程可以對已經加鎖的對象再次加鎖。其他線程當然不能調用,因爲其他線程根本就沒有獲得同步監視器(Lock鎖)的鎖定。
例子:
public class ReentrantLock
{
public synchronized void method1()
{
System.out.println(Thread.currentThread().getName()+"method---1");
method2(); //調用method2()方法,該方法加鎖了,可重入性表明還是可以調用成功
//線程內部有計數器,記錄加鎖的個數
}
public synchronized void method2()
{
System.out.println(Thread.currentThread().getName()+"method---2");
}
public static void main(String[] args)
{
ReentrantLock rl=new ReentrantLock();
rl.method1(); //調用method1()方法
}
}
結果:2.支持公平鎖
公平鎖使線程按照請求鎖的順序依次獲得鎖;而不公平鎖則允許討價還價,在這種情況下,線程有時可以比先請求鎖的其他線程先得到鎖。synchronized和默認的Lock都是不公平鎖。Lock類的構造器可以設置爲公平鎖。
3.可重入讀寫鎖(ReentrantReadWriteLock)
這個類適合用在多讀少寫的情況,讀鎖是內存同步的但不互斥,多個線程可以共享一個對象;而寫鎖就是一般的鎖,互斥同步。
三.選擇synchronized還是Lock類
synchronized是Java關鍵字,是原生屬性,在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在代碼執行時出現異常,JVM會自動釋放鎖定,而Lock是一個類,它釋放鎖必須通過代碼來實現unlock()。synchronized在Java6中性能有很大提升,可以這麼說,性能與Lock不相上下。在一些特殊情況下必須要用Lock的特性來解決纔會用Lock,或者線程競爭激烈的情況也會用Lock,這時的性能要高於synchronized。其他情況還是選擇synchronized。
參考:
《瘋狂Java講義》
《大型網站系統與中間件實踐》
http://blog.csdn.net/haydenwang8287/article/details/5837734
http://blog.csdn.net/ns_code/article/details/17487337
http://www.cnblogs.com/dolphin0520/p/3923167.html
http://www.importnew.com/21866.html synchronized的總結