Java中的使用Lock和synchronized關鍵字都是用來實現線程安全的機制。它們的主要區別在于使用方式和效率方面有所不同。
使用synchronized關鍵字可以很方便地實現同步方法或同步塊。當一個線程持有了某個對象的鎖,其他線程就無法訪問這個對象的同步方法或同步塊,直到持有鎖的線程訪問完成之后,鎖才會被釋放,其他線程才可以訪問。
public synchronized void doSomething(){ //同步方法代碼塊 }
Lock則需要顯式地創建鎖和釋放鎖。當一個線程獲得了鎖,其他線程就無法進入代碼塊,直到鎖被釋放。Lock還可以實現更復雜的同步需求,例如可以在獲取鎖的時候設置超時時間、限定等待鎖的線程數量等等操作。
Lock lock = new ReentrantLock(); lock.lock(); try{ //同步代碼塊 }finally{ lock.unlock(); }