java併發編程之重入鎖

重入鎖可以完全替代synchronized關鍵字,在JDK 5.0早期版本中,重入鎖的性能遠遠好於synchronzied,但是在6.0之後在synchronzied上做了大量的優化,使兩者的差距並沒那麼大的差別。

重入鎖使用java.util.concurrent.locks.ReentrantLock類來實現,它只是一個類;

且看如下代碼:

package cn.yan.current;

import java.util.concurrent.locks.ReentrantLock;


public class ReenterLock implements Runnable {
    private static ReentrantLock lock = new ReentrantLock();
    public static int i = 0;

    @Override
    public void run() {
        for (int j = 0; j < 30000; j++) {
            lock.lock();
            try {
                i++;
            } finally {
                lock.unlock();
            }
        }
    }


    public static void main(String[] args) throws InterruptedException {
        ReenterLock reenterLock = new ReenterLock();
        Thread t1 = new Thread(reenterLock);
        Thread t2 = new Thread(reenterLock);
        Thread t3 = new Thread(reenterLock);

        t1.start();
        t2.start();
        t3.start();
        t1.join();
        t2.join();
        t3.join();
        System.out.println("i ====>>>> " + i);
    }
}

最終其結果會是什麼?顯而易見,爲90000.

上述代碼使用重入鎖保護臨界區資源i,確保多線程時對i的操作的安全性。從這段代碼可以看出,與synchronzied關鍵字相比,重入鎖需要程序員手動的獲取鎖和釋放鎖資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章