在Java編程中,鎖是一個很基本的概念,用來在多線程環境下對共享資源進行同步訪問。對于鎖的使用場景,一般可以分為兩類:樂觀鎖和悲觀鎖。
樂觀鎖是一種相對比較輕量級的鎖策略,其核心思想就是假設多個線程訪問共享資源時不會發生沖突,因此,在讀取數據時不加鎖,在寫入數據時采用CAS(比較交換)算法進行版本控制,以保證并發修改時的數據正確性。
public class OptimisticLockDemo { private int count = 0; private AtomicInteger atomicCount = new AtomicInteger(0); public void increase() { int newValue = atomicCount.incrementAndGet(); if (newValue >10) { throw new RuntimeException("超過最大值"); } count++; System.out.println(Thread.currentThread().getName() + " count:" + count + " newValue:" + newValue); } }
上述代碼中,使用AtomicInteger進行計數,版本控制在incrementAndGet()方法中完成。
相較于樂觀鎖,悲觀鎖則是一種更加保守、更加安全的鎖策略。其核心思想就是認為在多線程環境下一定會發生沖突,因此,在讀取和寫入數據時都需要加鎖,以防止并發修改時的數據錯誤。
public class PessimisticLockDemo { private static int count = 0; public static synchronized void increase() { count++; System.out.println(Thread.currentThread().getName() + " count:" + count); } }
上述代碼中,使用synchronized關鍵字保證線程同步。
需要注意的是,悲觀鎖會比樂觀鎖占用更多的資源,因此在性能敏感的場景中應盡量采用樂觀鎖,而在一些復雜的數據結構操作中,悲觀鎖可能是唯一的選擇。
上一篇jquery3.3的輪播
下一篇css 公告欄模板