Java鎖和開關在多線程編程中都起到了重要的作用,但它們在使用上還是有一定的差別。
Java鎖分為兩種:互斥鎖和讀寫鎖。互斥鎖是排他和獨占的,只能被一個線程同時持有。讀寫鎖則是提供了共享和排他兩種鎖狀態,多個線程可以同時持有讀鎖,但只有一個線程可以持有寫鎖。
// 使用互斥鎖 private Lock lock = new ReentrantLock(); public void method() { lock.lock(); try { // 線程安全的代碼塊 } finally { lock.unlock(); } } // 使用讀寫鎖 private ReadWriteLock rwLock = new ReentrantReadWriteLock(); public void read() { rwLock.readLock().lock(); try { // 線程安全的讀取操作 } finally { rwLock.readLock().unlock(); } } public void write() { rwLock.writeLock().lock(); try { // 線程安全的寫入操作 } finally { rwLock.writeLock().unlock(); } }
開關(Semaphore)則是一種同步輔助工具,可以控制并發訪問的線程數。它的值表示當前允許訪問的線程數,當一個線程訪問結束后會釋放開關,使得其他線程可以訪問;如果當前線程數已達到最大值,后續線程會進入等待狀態。
// 創建允許2個線程同時訪問的開關 private Semaphore semaphore = new Semaphore(2); public void method() { try { // 獲取開關,當前線程數+1,如果已達到最大值2,線程會進入等待狀態 semaphore.acquire(); // 線程安全的代碼塊 } catch (InterruptedException e) { e.printStackTrace(); } finally { // 釋放開關,當前線程數-1,喚醒等待中的線程 semaphore.release(); } }
在使用鎖和開關時需要注意,過多的使用會導致線程阻塞和性能下降,因此需要根據實際情況進行權衡和選擇。
上一篇java鏈表和二叉樹