java Guava cache containsValue具体实现的疑问
public boolean containsValue(@Nullable Object value) {
        if (value == null) {
            return false;
        }
        long now = ticker.read();
        final Segment<K, V>[] segments = this.segments;
        long last = -1L;
        for (int i = 0; i < CONTAINS_VALUE_RETRIES; i++) {
            long sum = 0L;
            for (Segment<K, V> segment : segments) {
                // ensure visibility of most recent completed write
                int unused = segment.count; // read-volatile

                AtomicReferenceArray<ReferenceEntry<K, V>> table = segment.table;
                for (int j = 0; j < table.length(); j++) {
                    for (ReferenceEntry<K, V> e = table.get(j); e != null; e = e.getNext()) {
                        V v = segment.getLiveValue(e, now);
                        if (v != null && valueEquivalence.equivalent(value, v)) {
                            return true;
                        }
                    }
                }
                sum += segment.modCount;
            }
            if (sum == last) {
                break;
            }
            last = sum;
        }
        return false;
    } 

guava将containsValue设计成不加锁的操作。并且使用modCount检测在执行方法期间cache有没有变化。我的疑问是,modCount貌似只是对执行put操作做了检测,如果在该方法执行中在return true之前其他线程做了一个remove操作,是否该方法返回值就是错的。如果改为无论如何都检测modCount的次数如何?

0

1个回答

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
本地缓存之Guava cache
本地缓存之Guava cache 缓存在现在的各种系统中的作用事不言而喻的,cache一般指为提高系统性能而开辟的一块内存空间,利用缓存不仅可以提高系统响应时间,还可以节省处理数据的资源消耗。现在有很多优秀的cache框架提供非常强大的功能,但是对于数据不是很大,数据结构简单的我们可以考虑本地缓存,Guava Cache是一个基于全内存的本地缓存实现,应该可以说是目前为止java实现本地缓存的不...
四、常用工具之Guava Cache
详情参见Guava Cache内存缓存使用实践-定时异步刷新及简单抽象封装
本地缓存GuavaCache的介绍及使用
一、GuavaCache的介绍GuavaCache是一个本地缓存,有以下优点:1)很好的封装了get、put操作,能够集成数据源。一般我们在业务中操作缓存都会操作缓存和数据源两部分。例如:put数据时,先插入DB再删除原来的缓存,get数据时,先查缓存,命中则返回,没有命中时需要查询DB,再把查询结果放入缓存中。Guava封装了这么多步骤,只需要调用一次get/put方法即可。2)它是线程安全的缓...
guava初始化缓存
publisherCache = CacheBuilder.newBuilder() .concurrencyLevel(1) .maximumSize(500) .refreshAfterWrite(CACHE_DURATION,TimeUnit.SECONDS).build( new CacheLoader&amp;lt;...
JAVA日常优化---Guava缓存玩耍异步刷新
/** * v2支撑 * @author chenzhen * Created by chenzhen on 2018/11/20. */ public class TypeNumberCache { private static Logger logger = LoggerFactory.getLogger(TypeNumberCache.class); priv...
Guava Cache 数据变化实现回调的监听器RemovalListener
上一篇介绍了guava的使用,实现了项目第一个需求定期清理cache数据,第二个需求,我们需要在缓存被移除的时候,得到通知产生回调,并做一些额外处理工作。这个时候RemovalListener就派上用场了。 下面是获得所有数据改变的监听 [java] view plain copy public class Main {          // 创
Guava 源码分析(Cache 原理【二阶段】)
前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理。 文末提到了回收机制、移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析。 在开始之前先补习下 Java 自带的两个特性,Guava 中都有具体的应用。 Java 中的引用 首先是 Java 中的引用。 在之前分享过 JVM 是根据可达性分析算法找...
内存缓存之HashMap、EHCache、Guava Cache对比
缓存不应该被过度使用,在不同场景下,选用不同的方式缓存数据。   简单场景,存入一些占用内存不多的数据,而且这些数据不会主动发生变化,服务器启动后就永久存储,修改和删除都是全手动执行。而且服务器重启时不需要再自动恢复到之前的状态。这种数据直接用Map等放到内存中即可。   而一个标准Cache的主要特征有: 过期时间 容量规划(重要) 清除策略(重要) ...
基于Guava Cache内存缓存实现的token验证
最近做毕设,学习用到了Guava Cache和token机制,做个总结。 功能需求是这样的,在客户端用户登录时忘记密码,需要找回密码,通过正确输入找回密码答案来访问服务端的修改密码接口。为了防止恶意用户来直接访问修改密码接口,在调用验证答案接口后采用token机制来验证身份,并用Guava Cache做一个定时的token来保证安全性。 理解token机制 什么...
3. java缓存-进程内缓存guava cache
guava cache的缓存结构 常用的guava cache缓存 根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别就是LocalLoadingCache extends LocalManualCache implements LoadingCache&amp;amp;amp;amp;lt;K,V&amp;amp;amp;amp;gt;接口。 LocalManualCache...
使用guava cache实现List的删改查。
在进行了几天的查阅资料之后,决定使用guava 来实现List的操作。 直接上代码。 1、首先,我们实现了一个guava 的工具类,在后面使用时,直接调用即可。 package com.learning.www.utils; import java.util.ArrayList; import java.util.Collection; import java.util.List; im...
Guava Cache实现本地缓存
我们在处理业务时,有时候会频繁地使用从数据库查出来的同一条数据,这会影响程序的效率,一般地我们希望将这条数据缓存起来。即我们希望,同一条查询语句(查询条件也是一样的),仅在第一次执行时去数据库查询,而后每次直接从缓存中调用就是了。 1 首先新建一个缓存的策略接口 /** * 类说明:策略接口,每个策略都必须实现这个标准的策略接口 */ public interface ILocalC
Java电商项目面试--缓存(Guava Cache)
面试题:手写LRU(今日头条面试题) 面试题:手撕LFU,要求get和put都为O(1) 一、Guava Cache适用场景 1、你愿意消耗一部分内存来提升速度; 2、你已经预料某些值会被多次调用; 3、缓存数据不会超过内存总量; Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说Guava cache 是本地缓存的不二之选,简单易用,...
GuavaCache简介(一)
前言 在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式的cache如redis、memcached,还有进程内的cache如ehcache、GuavaCache。之前用spring cache的时候集成的是ehcache,但接触到guava cache之后,被它的简单、强大、及轻量级所吸引。它不需要配置文件,使用起来和Concurrent
Guava Cache过期回收策略
Guava Cache过期策略 Google的Guava Cache可以为每个缓存项设置统一的过期策略,在访问(access)或者写入(write)缓存项一定时间后该缓存项会自动过期,方法为:`expireAfterAccess(During, TimeUnit)`或者`expireAfterAccess(During, TimeUnit)`。 复制代码 Guava Cache过期回收策略 使用`...
基于Guava LoadingCache实现的本地缓存工具
通常来说,Guava Cache适用于: 愿意消耗一些内存空间来提升速度。 预料到某些键会被查询一次以上。 缓存中存放的数据总量不会超出内存容量。 Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。在重启服务器时缓存的数据会全部丢失。如果这不符合你的需求,请尝试Redis或Memcached这类工具。 缓存工具的具体实现如下: import c
Guava中Cache的使用
缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日常开发的很多场合,由于受限于硬盘IO的性能或者我们自身业务系统的数据处理和获取可能非常费时,当我们发现我们的系统这个数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的瓶颈出现。缓存的作用就是将这些来自不易的数据保存在内存中,当有其他线程或者客户端需要查询相同的数据资源时,直接从缓存的内存块中返回数
本地缓存GuavaCache
为什么使用本地缓存? 最近在项目中需要使用一个员工组件,通过一个员工接口做模糊查询,通过员工id得到员工姓名头型等信息,可是对于员工的编辑和展示用到的地方特别多,即项目中会频繁的调用一个接口。这个问题走了一些弯路,比如在表中增加展示字段,数据返回前调员工接口做转换,或者列表展示时由前端并发处理,最后证明这些办法都不是很好。最后想到了本地缓存。 在系统中,一些访问量大但是数据量小、与业务无关的缓
《深入分布式缓存 》第4章Ehcache 与guava cache
一 序    本文属于《深入分布式缓存 》读书笔记,第一章:缓存为王主要介绍缓存概念,以及引入缓存的背景:提升用户体验。还介绍了缓存的分类,第二章主要介绍分布式理论。个人觉得第二章可以去掉,毕竟是泛泛的介绍。还是专门去看有主题的书比较好,比如《&amp;lt;从PAXOS到ZOOKEEPER分布式一致性原理与实践》。第4章主要介绍EHcache。因为实际项目采用了guava +redis. 所以本文打算...
学习Guava Cache知识汇总
 (一)MapMaker 在软件开发中,Cache缓存技术一直是非常重要的主题,不管我们正在进行任何简单的编程工作,我们总能在编程过程中找到一些缓存机制,即使是你使用一个 Map获取静态的值,它也是缓存的一种形式,但我们大多数人并不清楚其中的缓存使用。Guava Cache为我们提供了相比于简单的HashMap更强大和灵活的缓存机制,并不像Ehcache和Memcache那样具有健壮性。在本系列...
Guava Cache特性:refreshAfterWrite只阻塞回源线程,其他线程返回旧值
真正加载数据的那个线程一定会阻塞,我们希望这个加载过程是异步的。这样就可以让所有线程立马返回旧值,在后台刷新缓存数据。refreshAfterWrite默认的刷新是同步的,会在调用者的线程中执行。我们可以改造成异步的,实现CacheLoader.reload()。
Guava Cache 分析总结
最近突然比较好奇本地内存cache该如何实现,guava提供的cache应该是其中的佼佼者,因此花一些时间记录一下所学习到的东西,看看大神们是如何实现这个问题。由于cache里涉及了很多功能,这篇文章只会记录其中我关心的功能。源码结构我下载的guava的版本为25.0-jre,包名为com.google.common.cache,这个包里的东西真不少,都是带cache结尾,一时半会有点迷,只是实现...
SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」
前言 好久没有写文章了,前段时间由于公司项目比较忙,因此耽搁了一些时间。本篇文章也是本头条号转正后发的第一篇文章,在此跟各位看官道歉,同时也感谢各位看官的不离不弃。希望各位看官可以关注本头条号以便持续获取最新资讯。 SpringBoot和GuavaCache 当各位看官打开这篇文章时,相信对SpringBoot的使用已经足够了解了,我就不做过多的赘述了,这篇文章主要是讲解如何在SpringB
数据库
事务 原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性:事务执行的结果必须是使数据库从一个一致性状态变成另一个一致性状态。因此当数据库指包含成功事务提供的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分一写入物理数据库,这时数据库就处于一种不正确的...
Guava Cache深入理解,缓存策略解析
Guava Cache一、Guava Cache 理解     开发中我们对一些访问非常频繁的数据,数据量可控,为了减少网络和硬盘io消耗,减少时间成本的消耗,我们通常会选择使用缓存来提高程序访问数据的性能,减少网络IO开销。     缓存大体分为2种:       (1)、集中式缓存。           (2)、分布式缓存。 而Guava就是集中式线程安全的本地缓存。Guava Cache简单...
本地缓存 caffeine, guava 和ehcache对比
Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代,基于LRU算法实现,支持多种缓存过期策略。...
Spring MVC 中<mvc:default-servlet-handler/> The matching wildcard is strict, but no declaration can b
解决方法如下: 更改头文件为下面的就好啦: beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/sc
Guava Cache内存缓存使用实践-定时异步刷新及简单抽象封装
缓存在应用中是必不可少的,经常用的如redis、memcache以及内存缓存等。Guava是Google出的一个工具包,它里面的cache即是对本地内存缓存的一种实现,支持多种缓存过期策略。 Guava cache的缓存加载方式有两种: CacheLoader Callable callback 具体两种方式的介绍看官方文档:http://ifeve.com/google-guava-caches
Guava Cache之返回值为null抛出异常解决方案
问题描述描述:对于方法“V get(key, loader) throws ExecutionException”loader的返回值不能为null,否则会抛出异常,文档描述如下: Warning: as with {@link CacheLoader#load}, {@code loader} must not return * {@code null}; it may eithe
缓存框架Guava Cache部分源码分析
在本地缓存中,最常用的就是OSCache和谷歌的Guava Cache。其中OSCache在07年就停止维护了,但它仍然被广泛的使用。谷歌的Guava Cache也是一个非常优秀的本地缓存,使用起来非常灵活,功能也十分强大,可以说是当前本地缓存中最优秀的缓存框架之一。之前我们分析了OSCache的部分源码,本篇就通过Guava Cache的部分源码,来分析一下Guava Cache的实现原理。
Guava Cache的缓存统计
guava cache很适合做进程内的缓存,本文先学习下它的缓存统计功能,需要使用recordStats()打开缓存统计功能。有一点需要注意下:可以通过修改底层map给缓存添加数据,也可以获取数据。通过map获取数据,不会影响缓存统计;通过map添加数据,会影响evictionCount。
Guava Cache特性:对于同一个key,只让一个请求回源load数据,其他线程阻塞等待结果
使用Guava确实可以做到:对于同一个key,无论有多少请求,都只会允许一个线程去加载数据。但是也有一个很致命的缺陷:上面8个线程中,有一个线程实际去加载数据,其余7个线程都被阻塞了。如果能做到,当一个线程去加载数据,其余线程发现这个数据正在加载中,那么直接读取老的数据,这样就不会阻塞了。既然是缓存,读取旧一点数据也没有多大问题,却可以提高系统吞度量。
Guava cacha 机制及源码分析
Guava 是Google开源出来的Java常用工具集库,包括集合,缓存,并发,字符串,I/O操作等在Java开发过程中经常需要去实现的工具类。 在平常开发过程中,很多情况需要使用缓存来避免频繁SQL查询或者其他耗时操作,会采取缓存这些操作结果给下一次请求使用。如果我们的操作结果是一直不改变的,其实我们可以使用 ConcurrentHashMap 来存储这些数据;但是如果这些结果在随后时间内
深入Guava Cache的refresh和expire刷新机制
Guava Cache是本地缓存的不二之选,用起来真不错呵,可是你真的知道怎么使用才能满足需求?今天我们深入探讨一下Expire和Refresh。(废话少说) 一、思考和猜想 首先看一下三种基于时间的清理或刷新缓存数据的方式: expireAfterAccess:当缓存项在指定的时间段内没有被读或写就会被回收。 expireAfterWrite:当缓存项在指定的时间段内没有更新就会...
Guava Cache 使用学习
Guava -Caache Guava缓存值CacheBuilder介绍-参考 Google -CachesExplained wiki 缓存框架Guava Cache部分源码分析 概述 缓存是日常开发中经常应用到的一种技术手段,合理的利用缓存可以极大的改善应用程序的性能。 Guava官方对Cache的描述连接 缓存在各种各样的用例中非常有用。例如,当计算或检索值很昂贵时,您应
Guava---最全缓存cache讲解
目录创建LoadingCache 创建LoadingCache LoadingCache&amp;amp;amp;amp;amp;lt;Object, Object&amp;amp;amp;amp;amp;gt; cache = CacheBuilder.newBuilder() .build(new CacheLoader&amp;amp;amp;amp;amp;lt;Object, Object&amp;amp;amp;amp;amp;gt;() { //若没有元素,则
Guava——简单工具类
/** * \* Created: liuhuichao * \* Date: 2018/3/30 * \* Time: 下午6:12 * \* Description:简单guava使用 * \ */ public class simpleGuavaTest { /** * Optional 类使用 * 可能为null的T类型引用 ...
使用Google Guava实现定时缓存功能
一:加入maven依赖 com.google.guava guava 19.0 二:使用缓存 方法一: package com.test.guava; import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; import com.google.common.cache.CacheB
如何利用Guava实现方法调用超时自动中断
在实际的开发中,我们会经常遇见一些这样的情景,  (1)对于突发高并发下环境下,服务器压力很大的情况下,调用某些方法超过100ms不响应,应自动拒绝服务,而不是一直阻塞下去,直至服务器崩溃,算是一种变相的服务降级  (2)对于不可预知可能出现死锁的代码,加上时间阈值限制,避免无限制资源竞争  (3)对于不可预知可能出现死循环的代码,加上时间阈值监控,避免死循环恶化  对于一些成熟的开源
利用 Google Guava 提供的便捷方法对 List 进行内存分页
说明有时候在某些特定场景下面我们经常需要对内存中的队列进行分页批量操作,但很多时候都是重复造轮子,很浪费时间;在此问题的前提下为了节约后续的时间与加大产出,发现了 Google Guava 的一系列工具包包括了此功能,所以在这里我记录下来后续方便查阅。