在Java中,有以下幾種加鎖的方式:
synchronized關鍵字:使用synchronized關鍵字來修飾方法或代碼塊,實現對代碼塊的同步訪問。當某個線程進入synchronized修飾的方法或代碼塊時,會自動獲取鎖,其他線程需要等待該線程釋放鎖后才能進入。
ReentrantLock類:通過ReentrantLock類來手動獲取和釋放鎖。可以通過lock()方法獲取鎖,通過unlock()方法釋放鎖。與synchronized關鍵字相比,ReentrantLock提供了更多靈活的功能,例如可重入鎖、公平鎖等。
ReadWriteLock接口:通過ReadWriteLock接口來實現讀寫鎖。讀寫鎖可以分為讀鎖和寫鎖,多個線程可以同時獲取讀鎖,但只有一個線程可以獲取寫鎖。
Semaphore類:通過Semaphore類來實現信號量。信號量可以控制同時訪問某個資源的線程數,可以用來實現資源的有限訪問。
CountDownLatch類:通過CountDownLatch類來實現計數器功能。可以指定一個初始計數值,當計數值減到0時,所有等待的線程就會被喚醒。
CyclicBarrier類:通過CyclicBarrier類來實現循環屏障功能。可以指定一個等待的線程數,當等待的線程數達到指定值時,所有等待的線程就會被喚醒。
這些加鎖的方式在不同的場景下有不同的適用性,開發人員可以根據具體的需求選擇合適的方式。