吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 726|回复: 1
收起左侧

[其他求助] CodeReview大赛开始了!!!

[复制链接]
李人 发表于 2021-5-18 15:55
25吾爱币
本帖最后由 李人 于 2021-5-18 15:57 编辑

最上面的注释是要求!!!
[Java] 纯文本查看 复制代码
/**
 * 一个简单的对象缓存Service,只允许并发读,不允许并发读写
 *
 */
@Service
public class CacheService {
    private final Map<String, Object> map = new HashMap<>();
    private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();

    /**
     * 获取一个 key 对应的 value
     *
     * @param key
     * @return
     */
    public final Object get(String key) {
        // 获取读锁
        rwLock.readLock().tryLock();
        try {
            return map.get(key);
        } finally {
            // 释放读锁
            rwLock.readLock().unlock();
        }
    }

    /**
     * 设置 key 对应的 value,并返回旧的 value
     *
     * @param key
     * @param value
     * @return
     */
    public final Object put(String key, Object value) {
        // 获取写锁
        rwLock.writeLock().tryLock();
        try {
            return map.put(key, value);
        } finally {
            // 释放写锁
            rwLock.writeLock().unlock();
        }
    }
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ljhtoljh 发表于 2021-5-19 00:58
1.map使用没问题。
2.rwLock使用错误,tryLock是尝试获取,返回true/false都是立即(而不阻塞),所以你这达不到写时读阻塞,读时写阻塞,并且写写都直接报错,读读没问题。直接改为lock()即可。如果是tryLock需要根据返回的false做判断,循环等待直到true,然后执行后续……该方法提供了当false出现时做其他操作的能力,同时有tryLock(time,unit)方法。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-16 14:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表