Java并发锁是Java多线程编程中常用的同步机制之一,主要用于避免多个线程竞争共享资源的情况下产生数据不一致的问题。在Java中,常用的并发锁有ReentrantLock、ReadWriteLock、synchronized等。
下面分别介绍以上三种锁的使用方法及代码示例。
ReentrantLock
ReentrantLock是可重入的互斥锁,相比synchronized,它的灵活性更强,在使用上也更加复杂。通常情况下,ReentrantLock在多个线程需要访问同一共享资源时,只允许一个线程访问,其他线程被阻塞,直到该线程释放锁。
示例代码:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Counter { private int count = 0; private final Lock lock = new ReentrantLock(); public void add() { lock.lock(); try { count++; } finally { lock.unlock(); } } public int getCount() { return count; } }
ReadWriteLock
ReadWriteLock也是一种并发锁,它采用读写分离的策略,比ReentrantLock更加灵活,在对共享资源进行读写操作时,允许多个线程进行读操作,但在进行写操作时,只能有一个线程持有锁。
示例代码:
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Cache { private Object data; private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); public Object readCache() { rwLock.readLock().lock(); try { return data; } finally { rwLock.readLock().unlock(); } } public void writeCache(Object newData) { rwLock.writeLock().lock(); try { data = newData; } finally { rwLock.writeLock().unlock(); } } }
synchronized
synchronized是Java中最基本的并发锁,它是一种互斥锁,在多个线程需要访问同一共享资源时,只允许一个线程访问,其他线程被阻塞,直到该线程释放锁。
示例代码:
public class Counter { private int count = 0; public synchronized void add() { count++; } public synchronized int getCount() { return count; } }
注意:以上示例代码只是为了说明并发锁的基本使用方法,实际应用中需要根据具体需求进行更详细的设计和实现。