Java 是一種支持多線程的語言,線程的執(zhí)行可能會出現并發(fā)問題。為了避免并發(fā)問題的出現,Java 提供了同步的機制,使得多線程訪問同一資源時可以實現互斥訪問,從而保證程序的正確性。
在 Java 中,常用的同步方法有 synchronized 關鍵字和 ReentrantLock 類。當一個線程訪問 synchronized 方法或塊時,它會獲取這個方法或塊的鎖,其他線程必須等待鎖的釋放才能訪問。而 ReentrantLock 類則提供了更加靈活的鎖機制,可以通過設置參數來實現公平鎖或非公平鎖。
class BankAccount{ private int balance; public synchronized void deposit(int amount){ balance += amount; } }
不過,同步機制會帶來額外的開銷。每次訪問同步方法或塊時都需要獲得鎖,這會增加 CPU 的負擔,并降低程序的執(zhí)行效率。因此,在沒有必要時,應該盡量避免使用同步機制。
Java 中提供了一些非同步的數據結構和算法,如 ArrayList、 HashMap 等,這些數據結構和算法在單線程的情況下使用效率更高。不過在多線程并發(fā)訪問時,這些非同步的數據結構和算法就需要額外的同步機制來保證線程安全。
class ConcurrentHashSet{ private ConcurrentHashMap map = new ConcurrentHashMap<>(); private static final Object VALUE = new Object(); public boolean add(E e){ return map.putIfAbsent(e, VALUE) == null; } }
以上是一個簡單實現的并發(fā) HashSet,使用 ConcurrentHashMap 來保證線程安全。在 add 方法執(zhí)行時,如果 map 中沒有這個元素,則把這個元素添加到 map 中。由于 ConcurrentHashMap 的 putIfAbsent 方法是原子操作,因此在多線程并發(fā)訪問時也可以保證線程的安全。