📅  最后修改于: 2023-12-03 15:02:03.362000             🧑  作者: Mango
在Java中,读写锁接口与synchronized关键字一样用于控制线程对共享资源的访问,但是读写锁可以提供更高的并发性。读写锁允许多个线程同时读取共享资源,但是只允许一个线程写入共享资源。这样,在读多写少的情况下,读写锁可以更好地发挥作用。
Java中提供了ReentrantReadWriteLock类实现读写锁接口,下面就来介绍一下这个类的使用方法。
读写锁包含以下概念:
ReentrantReadWriteLock类提供了读写锁的实现,使用方法如下所示:
public class ReentrantReadWriteLockDemo {
private Object data;
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void readData() {
lock.readLock().lock();
try {
// 读取共享数据
System.out.println(Thread.currentThread().getName() + " read data: " + data);
} finally {
lock.readLock().unlock();
}
}
public void writeData(Object newData) {
lock.writeLock().lock();
try {
// 写入共享数据
data = newData;
System.out.println(Thread.currentThread().getName() + " write data: " + data);
} finally {
lock.writeLock().unlock();
}
}
}
在上面的代码中,我们定义了一个数据类ReentrantReadWriteLockDemo,其中包含一个Object类型的data变量以及ReentrantReadWriteLock类型的lock变量,并且提供了读取和写入共享数据的方法。在读取和写入数据的方法中,我们分别调用了ReentrantReadWriteLock类的readLock()和writeLock()方法来获取读锁和写锁,然后在逻辑处理完成后使用readLock().unlock()和writeLock().unlock()来释放锁。
读写锁适用于读多写少的场景,例如缓存场景。多个线程可以并发地读取缓存数据,但是只允许一个线程写入缓存数据。
下面代码展示了读写锁在缓存场景中的一个简单应用:
public class CacheDemo {
private Map<String, Object> cacheData = new HashMap<>();
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public Object get(String key) {
lock.readLock().lock();
try {
return cacheData.get(key);
} finally {
lock.readLock().unlock();
}
}
public void put(String key, Object value) {
lock.writeLock().lock();
try {
cacheData.put(key, value);
} finally {
lock.writeLock().unlock();
}
}
}
在上述代码中,我们使用了一个Map类型的cacheData变量存储缓存数据,在get和put方法中,我们使用读锁和写锁来控制对缓存数据的读取和写入,确保数据的正确性和一致性。
读写锁比synchronized关键字性能更好,能够在读多写少的场景下发挥更好的作用。Java中提供了ReentrantReadWriteLock类实现读写锁接口,通过调用其readLock()和writeLock()方法即可获取读锁和写锁,控制对共享资源的访问。读写锁的应用场景包括缓存、日志、数据统计等。