Java中的Lock和Synchronized都是多線程編程中的同步機制,用于保證多個線程在操作共享資源時的順序性和正確性。下面分別介紹它們的用法和區別。
Lock
Lock lock = new ReentrantLock(); lock.lock(); try { // 具體實現代碼 } finally { lock.unlock(); }
Lock需要手動加鎖和解鎖,使用ReentrantLock時,線程首先要獲取鎖,當其他線程也需要訪問同一代碼塊的時候,它們就被阻塞,并一直等待鎖被釋放。當鎖被釋放時,等待訪問的線程中只有一個(先到先得)會獲取到鎖,開始執行代碼,直到執行完畢后再釋放鎖讓其他線程獲取。這種機制是“悲觀鎖”,因為在訪問代碼塊期間,任何線程都無法獲取到鎖,導致性能有所下降。
Synchronized
synchronized (object) { // 具體實現代碼 }
Synchronized關鍵字則不需要手動加鎖和解鎖,它會自動進行加解鎖操作。當一個線程進入Synchronized代碼塊時,會自動獲取該代碼段的鎖,其他線程需要訪問該代碼段時,則需要等待前一個線程執行完畢釋放鎖,然后才能獲取并執行代碼塊。這種機制是“樂觀鎖”,因為每個線程在嘗試獲取鎖時,都存在一定的概率能夠成功,所以性能相對較好。
總結來說,Lock相對于Synchronized有更多的靈活性和可控性,但需要更多的手動操作,代碼實現上也相對較為復雜;而Synchronized則相對簡單易用,但是靈活性和可控性也相對較弱。