面试题答案
一键面试- 选择
ReadWriteLock
:- 由于读操作远多于写操作,
ReadWriteLock
非常适合这种场景。ReadWriteLock
维护一对锁,一个用于只读操作(读锁),一个用于写入操作(写锁)。 - 读锁允许多个线程同时获取,因为读操作不会修改共享数据,所以不会产生数据不一致问题。而写锁则是独占的,当有一个线程获取写锁时,其他任何线程(包括读线程和写线程)都不能获取锁,以确保数据的一致性。
- 由于读操作远多于写操作,
- 实现思路:
- Java实现:
- 在Java中,可以使用
ReentrantReadWriteLock
类。 - 示例代码如下:
- 在Java中,可以使用
- Java实现:
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Cache {
private final Map<String, Object> cache = new HashMap<>();
private final ReadWriteLock lock = new ReentrantReadWriteLock();
public Object get(String key) {
lock.readLock().lock();
try {
return cache.get(key);
} finally {
lock.readLock().unlock();
}
}
public void put(String key, Object value) {
lock.writeLock().lock();
try {
cache.put(key, value);
} finally {
lock.writeLock().unlock();
}
}
}
- C#实现:
- 在C#中,可以使用
ReaderWriterLockSlim
类。 - 示例代码如下:
- 在C#中,可以使用
using System;
using System.Collections.Generic;
using System.Threading;
class Cache
{
private readonly Dictionary<string, object> cache = new Dictionary<string, object>();
private readonly ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();
public object Get(string key)
{
lockObj.EnterReadLock();
try
{
return cache[key];
}
catch (KeyNotFoundException)
{
return null;
}
finally
{
lockObj.ExitReadLock();
}
}
public void Put(string key, object value)
{
lockObj.EnterWriteLock();
try
{
cache[key] = value;
}
finally
{
lockObj.ExitWriteLock();
}
}
}
通过这种方式,在读多写少的缓存系统中,利用ReadWriteLock
可以显著提高系统性能,减少线程等待时间。