Java多線程---Lock類

       上一篇文件講了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的總結


發佈了26 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章