MST

星途 面试题库

面试题:Java中Lock类别及应用场景 - 高级难度

假设你正在开发一个多线程的缓存系统,读操作远多于写操作,你会如何选择合适的Lock来提高系统性能?请详细说明使用的Lock类别及实现思路。
28.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 选择ReadWriteLock
    • 由于读操作远多于写操作,ReadWriteLock非常适合这种场景。ReadWriteLock维护一对锁,一个用于只读操作(读锁),一个用于写入操作(写锁)。
    • 读锁允许多个线程同时获取,因为读操作不会修改共享数据,所以不会产生数据不一致问题。而写锁则是独占的,当有一个线程获取写锁时,其他任何线程(包括读线程和写线程)都不能获取锁,以确保数据的一致性。
  2. 实现思路
    • Java实现
      • 在Java中,可以使用ReentrantReadWriteLock类。
      • 示例代码如下:
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类。
    • 示例代码如下:
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可以显著提高系统性能,减少线程等待时间。