当前位置: 首页 > 编程日记 > 正文

java中如何应对读改写场景

前言

volatile可以确保数据及时刷新到主存,但是对于读改写场景还是无能为力

举个例子

public class ConcurrentHashMapExample {public static void main(String[] args) throws InterruptedException {Map<String, Long> ordersMap = new ConcurrentHashMap<>();ordersMap.put("Delhi", 0l);ordersMap.put("London", 0l);ordersMap.put("New York", 0l);ordersMap.put("Sydney", 0l);ExecutorService service = Executors.newFixedThreadPool(2);service.submit(() -> processOrders(ordersMap));service.submit(() -> processOrders(ordersMap));service.awaitTermination(3, TimeUnit.SECONDS);service.shutdown();System.out.println(ordersMap);}private static void processOrders(Map<String, Long> ordersMap) {for (String city : ordersMap.keySet()) {for (int i = 0; i < 50; i++) {Long oldOrder = ordersMap.get(city);ordersMap.put(city, oldOrder + 1);}}}
}
复制代码

正确输出应该是

{Delhi=100, New York=100, London=100, Sydney=100}
复制代码

但是试着多运行几遍,会就发现如下的情况

{Delhi=51, New York=73, London=71, Sydney=100}
复制代码

在ConcurrentHashMap中value是用volatile修饰的,为什么还会出现这个情况呢?

 static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;volatile V val;volatile Node<K,V> next;
}
复制代码

探究原因

对于读改写操作,volatile并不能保证正确,需要使用原子类解决 以volatile的自增为例

volatile确保了读取到的是最新的值,符合语义,那么该如何解决上面的问题呢使用原子类

public class ConcurrentHashMapExample {public static void main(String[] args) throws InterruptedException {Map<String, AtomicLong> ordersMap = new ConcurrentHashMap<>();ordersMap.put("Delhi", new AtomicLong(0L));ordersMap.put("London", new AtomicLong(0L));ordersMap.put("New York", new AtomicLong(0L));ordersMap.put("Sydney", new AtomicLong(0L));ExecutorService service = Executors.newFixedThreadPool(2);service.submit(() -> processOrders(ordersMap));service.submit(() -> processOrders(ordersMap));service.awaitTermination(1, TimeUnit.SECONDS);service.shutdown();System.out.println(ordersMap);}private static void processOrders(Map<String, AtomicLong> ordersMap) {for (String city : ordersMap.keySet()) {for (int i = 0; i < 50; i++) {ordersMap.get(city).incrementAndGet();}}}
}
复制代码

主要参考这篇文章

相关文章:

Apache Hudi的写时复制和读时合并

Apache Hudi http://hudi.apache.org/ http://hudi.apache.org/docs/quick-start-guide.html Hudi是什么 Hudi将流处理带到大数据&#xff0c;提供新数据&#xff0c;同时比传统批处理效率高一个数量级。 Hudi可以帮助你构建高效的数据湖&#xff0c;解决一些最复杂的底层…

顶尖程序员不同于常人的 5 个区别

2019独角兽企业重金招聘Python工程师标准>>> 《The Effective Engineer》的作者在写书的过程中&#xff0c;为了了解那些顶级程序员和普通程序员的区别&#xff0c;采访了很多硅谷顶级科技公司的顶尖软件工程师。他发现这些给世界带来巨大影响的的工程师们至少有以下…

【MATLAB】符号数学计算(七):符号微积分、符号微分方程求解、符号代数方程求解

一、符号表达式的极限 limit(F,x,a)&#xff1a;求当时&#xff0c;符号表达式F的极限。limit(F,a)&#xff1a;符号表达式F采用默认自变量&#xff08;可由函数findsym求得&#xff09;&#xff0c;该函数求F的自变量趋于a时的极限值。limit(F)&#xff1a;符号表达式采用默认…

Qt运行时中文乱码的解决办法

QT5的解决办法&#xff0c;在类之前添加&#xff1a;   #pragma execution_character_set("utf-8")QT4解决办法&#xff1a; QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());转载于:https://www.cnblogs.com/bjxingch/articles/9992998.html

更换yum的源为阿里云或者网易

1.备份原本的yum源&#xff1a; #mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载阿里云的yum源&#xff1a; CentOS6,CentOS7,CentOS8下对应的即可 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Ce…

socket编程:多路复用I/O服务端客户端之poll

一. 关于poll对于IO复用模型&#xff0c;其优点无疑是免去了对一个个IO事件就绪的等待&#xff0c;转而代之的是同时对多个IO数据的检测&#xff0c;当检测等待的事件中至少有一个就绪的时候&#xff0c;就会返回告诉用户进程“已经有数据准备好了&#xff0c;快看看是哪个赶紧…

【MATLAB】符号数学计算(八):符号分析可视化

一、funtool分析界面 在命令行窗口中输入&#xff1a; funtool 这里就说一下第四排&#xff1a; Insert&#xff1a;把当前激活窗的函数写入列表Cycle&#xff1a;依次循环显示fxlist中的函数Delete&#xff1a;从fxlist列表中删除激活窗的函数Reset&#xff1a;使计算器恢复…

java 根据实体对象生成 增删改的SQL语句 ModelToSQL

2019独角兽企业重金招聘Python工程师标准>>> java 根据实体对象生成 增删改的SQL语句 ModelToSQL 转载于:https://my.oschina.net/miaojiangmin/blog/2907010

深入浅出SpringBoot源码分析

Spring源码非常多,不要迷失在源码的汪洋大海里,抓住主要脉络,有需要再研究即可。 Bean的初始化 1.发现所有的bean ComponentScanAnnotationParser.parse()调用doScan()扫包 这里只是扫用户定义的bean,系统的自然不用扫 ClassPathBeanDefinitionScanner.doScan protected…

HBase基本知识

为什么80%的码农都做不了架构师&#xff1f;>>> 概述 HBase 特性&#xff1a; 强一致性读写: HBase 不是 "最终一致性(eventually consistent)" 数据存储. 这让它很适合高速计数聚合类任务。自动分片(Automatic sharding): HBase 表通过region分布在集群…

【编程题】猜年龄

题目标题: 猜年龄 美国数学家维纳(N.Wiener) 智力早熟&#xff0c;11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次&#xff0c;他参加某个重要会议&#xff0c;年轻的脸孔引人注目。于是有人询问他的年龄&#xff0c;他回答说&#xff1a; “我年龄的立方是个…

XenServer和VMware vSphere技术比较

此次将Citrix XenServer7.1和VMware ESXi 6.5从技术角度进行比较&#xff0c;并从企业角度对企业关心的项进行比较。主要包含市场地位、服务器虚拟化底层稳定性、管理架构、兼容性上进行分析。 市场地位 VMware在虚拟化的地位类似于大型存储中的EMC、小型机中IBM、网络中的思科…

阿里巴巴开源的缓存框架JetCache创建缓存

官网:https://github.com/alibaba/jetcache/wiki/CacheAPI_CN ======================= 多层嵌套缓存无效的问题: https://github.com/alibaba/jetcache/issues/424 某个service的方法加缓存注解,然后引用同一个类的另一个加缓存注解service的方法,这样必须在类里面注入…

【Python】百度翻译的爬虫实现(前篇)

该程序只能实现中文到英文的翻译 import requestsimport jsonurl "http://fanyi.baidu.com/basetrans"query_str input("请输入要翻译成英文的内容&#xff1a;")data{ "query": query_str,"from": "zh","to"…

github每次推送都要输入用户名和密码

/****************************************************************************** github每次推送都要输入用户名和密码* 说明&#xff1a;* 今天开始使用github管理一些东西&#xff0c;但是每次提交都出现要输入用户名和密码&#xff0c;* 这简直让人…

ELASTIC SEARCH 性能调优

ELASTICSEARCH 性能调优建议 创建索引调优 1.在创建索引的使用使用批量的方式导入到ES。 2.使用多线程的方式导入数据库。 3.增加默认刷新时间。 默认的刷新时间是1秒钟&#xff0c;这样会产生太多小的SEGMENT&#xff0c;导致未来的合并压力&#xff0c;如果调整这个大小&…

Android开源中国客户端学习 (自定义View)左右滑动控件ScrollLayout

左右滑动的控件我们使用的也是非常多了,但是基本上都是使用的viewpager 等 android基础的控件,那么我们有么有考虑过查看他的源码进行定制呢?当然,如果你自我感觉非常好的话可以自己定制一个,osc的ScrollLayout就是自己定义的View 和Viewpager的区别还是不小的 代码不是很多不…

【Python】有道翻译的爬虫实现(前篇)

import requestsimport jsonurl "http://fanyi.youdao.com/translate_o?smartresultdict&smartresultrule"data {"i": "我喜欢学习", "from": "AUTO", "to": "AUTO", "smartresult":&q…

自动生成纯文本表格的工具

https://tableconvert.com/?outputtext 有时候需要写文档的时候生成这种纯文本表格&#xff0c;这个工具真的很方便&#xff0c;贴上数据就可以了。

《Java编程思想》笔记13.字符串

点击进入我的博客 字符串操作是计算机程序设计中最常见的行为 13.1 不可变String String底层是由char[]实现的&#xff0c;是不可变的。看起来会改变String的方法&#xff0c;实际上都是创建了一个新的String对象&#xff0c;任何指向它的引用都不可能改变它本身的值。 13.2 重…

【Python】有道翻译的爬虫实现(后篇)

前面说到&#xff0c;有道翻译和百度翻译不同 &#xff08;百度翻译是模拟iPhone手机&#xff0c;可能百度翻译用Pc端也会有类似的问题&#xff0c;有道翻译的User—Agent是Pc端&#xff09; 每一次的salt和sign都不一样&#xff0c;这是什么原因产生的呢&#xff1f; 一、每…

Redis客户端JetCache的单机版和集群版的配置

jetcache基础应用参考这个:阿里巴巴开源的缓存框架JetCache创建缓存 1.JetCache的jedis配置 https://github.com/alibaba/jetcache/wiki/Config_CN jedis配置:apollo版 jetcache.remote.default.type = redis jetcache.remote.default.keyConvertor = fastjson jetcache.r…

5 分钟一次理解 Spring IOC !

今天我们分析一下 spring 的 IOC&#xff0c;梳理一下 IOC 和 DI 的概念与原理。在网上看到开涛有篇文章写的不错&#xff0c;提取其中一部分精华内容并做一些解读。 1.1.IOC是什么&#xff1f; Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&…

工作两年的编程感想

2019独角兽企业重金招聘Python工程师标准>>> 工作已有两年了&#xff0c;两年不长也不短了&#xff0c;程序员的辛酸苦乐也都体验了一些&#xff0c;故写此博客既为留念&#xff0c;也为接下来的两年留下一个参考点。 首先需要声明的是&#xff0c;本人的工作是Java…

微服务重构心得

现在都在做微服务,看起来就是做服务拆分比较简单,但是实际上真正重构起来又遇到许许多多的问题。 微服务重构常见问题 1.领域驱动模型的困扰 比如听到很多理论比如领域驱动,那么到底需要不需要学习或者使用领域驱动呢? 2.系统的复杂性 重构的时候发现系统之间调用非常…

【Python】百度翻译的爬虫实现(后篇)

这个程序可以实现中英文的自动识别然后进行翻译 看着程序就很好理解。 import requestsimport jsonclass Translation():翻译def __init__(self,content):self.content contentself.url "http://fanyi.baidu.com/basetrans"self.headers {"User-Agent"…

美团即时物流的分布式系统架构设计

背景 美团外卖已经发展了五年&#xff0c;即时物流探索也经历了3年多的时间&#xff0c;业务从零孵化到初具规模&#xff0c;在整个过程中积累了一些分布式高并发系统的建设经验。最主要的收获包括两点&#xff1a; 即时物流业务对故障和高延迟的容忍度极低&#xff0c;在业务复…

Intellij IDEA单元测试提示Test events were not received

Intellij IDEA单元测试时提示Test events were not received 也就是可以运行test方法&#xff0c;也提示成功&#xff0c;但是看不到具体的执行结果。 Intellij IDEA从2019.2.1版本开始&#xff0c;会将Gradle管理的项目的测试代码&#xff0c;默认使用Gradle来运行&#xff0…

Linux下task_struct详解

背景&#xff1a;为了管理进程&#xff0c;操作系统必须对每个进程所做的事情进行清楚地描述&#xff0c;为此&#xff0c;操作系统使用数据结构来代表处理不同的实体&#xff0c;这个数据结构就是通常所说的进程描述符或进程控制块。在linux系统中&#xff0c;这就是task_stru…

【Python】数据提取xpath和lxml模块(豆瓣电影排行榜的爬虫)

xpath xpath&#xff1a;一门从html中提取数据的语言 xpath语法 1、选择节点(标签) /html/head/meta &#xff1a;能够选中html下的head下的所有的meta标签 2、// &#xff1a;能够从任意节点开始选择 //li&#xff1a;当前页面上所有的li标签 //html/head/link &a…