当前位置: 首页 > news >正文

找做网站签证seo wordpress 插件

找做网站签证,seo wordpress 插件,上海市工程质量建设协会网站,建立com网站目录 ConcurrentHashMap 一定是线程安全的吗 CAS 机制的注意事项 使用java 并行流 ,您要留意了 ConcurrentHashMap 在JDK1.8中ConcurrentHashMap 内部使用的是数组加链表加红黑树的结构,通过CASvolatile或synchronized的方式来保证线程安全的,这些原理…

目录

ConcurrentHashMap 一定是线程安全的吗

CAS 机制的注意事项

使用java 并行流 ,您要留意了


      ConcurrentHashMap 在JDK1.8中ConcurrentHashMap 内部使用的是数组加链表加红黑树的结构,通过CAS+volatile或synchronized的方式来保证线程安全的,这些原理已毋庸置疑,一言不合上代码.

     1.  模拟2个线程累计,通过ConcurrentHashMap 储存累计的结果。


/*** @description: ConcurrentHashMap 真的安全吗* @author: ppx* @date: 2023/8/17 14:11* @version: 1.0*/
public class TestMap {private static ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();private static String key = "hello";/*** @description: 测试2个线程 执行计算* @param:* @return: void* @author: ppx* @date: 2023/8/17 16:43*/private static void testRun() {ExecutorService executor = new ThreadPoolExecutor(2, 5,2L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());for (int i = 0; i < 2; i++) {executor.submit(() -> {for (int j = 0; j < 5; j++) {// 第一步读取int value = concurrentHashMap.getOrDefault(key, 0);// 第二步+1value++;// 第三补+ 回写mapconcurrentHashMap.put(key, value);}});}executor.shutdown();// 直到线程执行完成while(!executor.isTerminated()){}System.out.println("执行结果:" + concurrentHashMap.get(key));}public static void main(String[] args) {testRun();}
}

2.出乎意料执行多次输出不同的结果

 

 

3. 分析原理:ConcurrentHashMap 本身是线程安全的,但for 里面的获map取值、加加操作及回写map 这三步是非原子性。要保证操作的安全性,这三步实现原子性即可。

 优化后代码

 private static void testRun() {ExecutorService executor = new ThreadPoolExecutor(2, 5,2L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());for (int i = 0; i < 2; i++) {executor.submit(() -> {for (int j = 0; j < 5; j++) {synchronized (TestMap.class) {int value = concurrentHashMap.getOrDefault(key, 0);value ++;concurrentHashMap.put(key, value);}}});}executor.shutdown();while (!executor.isTerminated()) {}System.out.println("执行结果:" + concurrentHashMap.get(key));}

CAS 机制的注意事项

       某线程把数据A更新了B,随后又从B更新成A,恰好此时另一线程读取该数据,发现数据的值还是A没有变化,误认为还是原来的A,但此时A的一些属性或状态已经发生过变化。

      CAS操作中将判断“V的值是否仍然为A?”,如果是的话将执行更新操作,在某些CAS操作中,如果V的值首先由A变为B,再由B变为A,那么CAS仍然将会操作成功。

ABA问题

          线程A 的操作,cas中的值由1变成99,再由99变成1,此次线程B 发现AtomicInteger 的值还是1,于是更新到50,产生ABA的问题。

private static AtomicInteger atomicInteger = new AtomicInteger(1);public static void main(String[] args) {Thread threadA  =  new Thread(() -> {atomicInteger.compareAndSet(1, 99);atomicInteger.compareAndSet(99, 1);System.out.println("线程A进行CAS后的值:"+atomicInteger.get());try {Thread.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}}, "线程A");Thread threadB  =  new Thread(() -> {try{atomicInteger.compareAndSet(1, 50);System.out.println("线程B进行CAS后的值:"+atomicInteger.get());}catch (Exception e) {e.printStackTrace();}}, "线程B");threadA.start();try {threadA.join();} catch (InterruptedException e) {e.printStackTrace();}threadB.start();}

基于AtomicStampedReference类实现
AtomicStampedReference内部增加了版本号的概念,只有期待的值与版本号分别匹配后,才满足条件,更新最新的值。

案例

      线程 A  进行CAS 操作更新时,发布版本已发生变动,CAS更新 失败。线程B   进行CAS 操作更新时,匹配对应的版本,期待值,更新成功。

 public static void main(String[] args) {new Thread(() -> {// 让线程B 获取最新版本号,成功 执行更新try {Thread.sleep(11);} catch (InterruptedException e) {e.printStackTrace();}int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName() + ", 当前版本号为:" + stamp);boolean firstCasFlag = atomicStampedReference.compareAndSet(100, 99, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);System.out.println("当前版本号:"+atomicStampedReference.getStamp()+", 线程A进行CAS后的值:" + atomicInteger.get() + ",第1次操作是否修改成功: " + firstCasFlag);}, "线程A").start();new Thread(() -> {try {int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName() + ", 版本号为:" + atomicStampedReference.getStamp());boolean flag = atomicStampedReference.compareAndSet(100, 888, stamp, atomicStampedReference.getStamp() + 1);System.out.println("线程B进行CAS后的值:" + atomicStampedReference.getReference() + ", 此次操作是否修改成功: " + flag);} catch (Exception e) {e.printStackTrace();}}, "线程B").start();}

执行结果

线程B, 版本号为:1
线程B进行CAS后的值:888, 此次操作是否修改成功: true
线程A, 当前版本号为:2
当前版本号:2, 线程A进行CAS后的值:1,第1次操作是否修改成功: false
 

http://www.yayakq.cn/news/436057/

相关文章:

  • 网站建设的项目亮点怎么写网站报错解析
  • 怎么做考试资料网站个人微信公众号收费吗
  • 做百度竞价用什么网站网店托管公司
  • 建设网站设计在线制图免费版
  • 网站标题的关键字怎么写哪一些网站使用vue做的
  • 科技企业网站如何建设化妆品 网站模板
  • 郑州网站建设最好科技网站首页欣赏
  • 3个典型网站建设公司青田县建设局官方网站
  • 郑州专门做喷绘安装的网站制作外贸型网站
  • 龙岗网站建设开发设计公司云南免费网站建设
  • 中国做网站的公司wordpress分类添加轮播图
  • 华为网站建设建议做销售在哪个网站找客户
  • 邢台哪有学做网站的网页首页设计模板免费
  • 淘客手机版网站怎么做山东建设企业网站
  • 深圳网站建设大公司好大连金州区旅游景点
  • 天津网站优化软件jsp做网站遇到的问题
  • 在线文档网站源码小公司做网站
  • 学做网站好学吗电子印章在线制作生成器
  • 做服装有哪些好的网站以下五项中哪项是网络营销的特点
  • 淄博网站建设培训学校沈阳seo建站
  • 花都网站建设网页设计智能家庭app下载
  • 网站优化的电脑网页游戏大全
  • 中山网站建设是什么怎么在网上做推广
  • 重庆需要网站建设乐山做网站的公司
  • 长兴县住房建设局网站wordpress插件目录
  • 怎么查看网站的dns做一个自己的app要多少钱
  • 镇江网站关键字优化如何郑州官方最新通告
  • 台州建设网站公司网站建设的宽带指标要求
  • mvc5 网站开发美學 pdf建立网站的教学书籍
  • 网站权重优化方式手机网站 域名