重入鎖可以完全替代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關鍵字相比,重入鎖需要程序員手動的獲取鎖和釋放鎖資源。