java多线程原子操作_Java 多线程 - 原子操作CAS

什么是原子操作?如何实现原子操作?

假定有两个操作 A 和 B,如果从执行 A 的线程来看,当另一个线程执行 B 时, 要么将 B 全部执行完,要么完全不执行 B,那么 A 和 B 对彼此来说是原子的。

实现原子操作可以使用锁,锁机制,满足基本的需求是没有问题的了,但是 有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制, synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候, 访问同一资源的其它线程需要等待,直到该线程释放锁,这里会有些问题:首先,如果被阻塞的线程优先级很高很重要怎么办?其次, 如果获得锁的线程一直不释放锁怎么办?(这种情况是非常糟糕的)。还有一种 情况,如果有大量的线程来竞争资源,那 CPU 将会花费大量的时间和资源来处 理这些竞争,同时,还有可能出现一些例如死锁之类的情况,最后,其实锁机制 是一种比较粗糙,粒度比较大的机制,相对于像计数器这样的需求有点儿过于笨 重。

实现原子操作还可以使用当前的处理器基本都支持 CAS()的指令,只不过每 个厂家所实现的算法并不一样,每一个 CAS 操作过程都包含三个运算符:一个内 存地址 V,一个期望的值 A 和一个新值 B,操作的时候如果这个地址上存放的值 等于这个期望的值 A,则将地址上的值赋为新值 B,否则不做任何操作。

CAS 的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新 值,否则不做任何事儿,但是要返回原值是多少。循环 CAS 就是在一个循环里不 断的做 cas 操作,直到成功为止。

CAS 是怎么实现线程的安全呢?语言层面不做处理,我们将其交给硬件— CPU 和内存,利用 CPU 的多处理能力,实现硬件层面的阻塞,再加上 volatile 变 量的特性即可实现基于原子操作的线程安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dotNET:怎样处理程序中的异常(实战篇)?

在上篇 《dotNET:怎样处理程序中的异常(理论篇)》 中讲了一些程序中出现异常怎样处理的理论知识,本文将以代码的方式来进行实践。环境dotNET Core:3.1工具:Rider 2019.3.2系统:macOS 10.15.4创建…

JAVA 手撕底层arrayList代码(arrayList的简单实现)

一:引言: 这些方法根本不用写,list类当中都有这些方法,可以直接调用,但为了解list类的底层 所以手写了一便 只是实现了简单方法 二:上码: package cn.wyj.two;import javax.management.Runti…

java数组键_Java基础之数组

数组数组就是用于存储相同数据类型数据的一个容器。可以通过有规律的索引来访问没有规律的元素。一维数组定义格式:元素的数据类型[ ] 数组名称  new 元素的数据类型 [ 数组容器大小 ];数组定义格式解释:元素:数组中的数据&am…

结构型设计模式总结

结构型设计模式总结Intro前面几篇文章已经介绍完了所有的结构型设计模式,来做一个总结结构型设计模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决一些特定应用场景的问题。结构型模式包括:代理模式、桥接模式、装饰器…

Java手撕Linkedlist(双向链表)基本用法的实现

一:引言 实现的方法 LinkList类都有 自带的 可以直接调用 ,这是为了熟悉底层代码 敲了一下基本用法 ,主要以高琪老师讲的来写 二:上码 package cn.wyj.two;import java.awt.image.RasterFormatException;/**自定义一个链表* pa…

在 MySQL 中使用码农很忙 IP 地址数据库

在下载到码农很忙 IP 地址数据库后,我们可以将其存储在 MySQL 数据库中,并在需要查询某个 IP 对应的位置数据时,通过 SQL 语句获取正确的结果。这是一种很便捷的使用方式,并且在增加了恰当的索引后,可以取得不错的搜索…

java numberformat异常_Java NumberFormat格式化float类型的bug

首先,这个NumberFormat这个类,可以格式化各种数字。你只要稍微设置一下,结果还是很理性的。但是,他有那么一丢丢的bug,不知道你知道不?/*** 2.3F经过格式化,竟然变成2.99啦。what the fuck .* f…

7-24 树种统计 (25 分)(详解)map做法 map真香啊!

一:题目 7-24 树种统计 (25 分)随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。 输入格式: 输入首先给出正整数N(≤10 ​5 ​​ &#xf…

死磕 Redis,我有这么几招

如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力。可以说,熟练使用 Redis 就是后端工程师…

java 递归 全局变量_java - 递归期间的全局变量 - 堆栈内存溢出

我有一个全局变量masterList,它是一个HashMap。private static HashMap, Integer> masterList new HashMap, Integer>();我有一个递归函数generateAnagram,该函数将字谜的ArrayLists放入此HashMap中,并将列表中的单词数作为值。 但是&a…

回归统计在DMP中的实战应用

源宝导读:本文将讲解在大数据分析领域的线性回归统计计算方法,以及如何将非线性转化为线性回归的原理,同时介绍了两种的回归统计库的使用和对比,最后介绍线性回归在DMP产品的应用实践。一、背景回归统计,是数据分析常用…

java 变成题_Java 习题8 参考答案及解析

1.问答题“\hello”是正确的字符串常量吗?“你好KU”.length()和”\n\t\t”.length()的值分别是多少?“Hello”.equals(“hello”)和”java”.equals(“java”)的值分别是多少?“Bird”.compareTo(“Bird fly”)的值是正数还是负数&#xff1…

Java当中Map的认识和基本用法

一:Map Map用于保存具有映射关系的数据,Map集合里保存着两组值,一组用于保存Map的ley,另一组保存着Map的value,也就是Map的 键值 和关键值 。具体举例 ,和查字典类似,通过key找到对应的value,通…

java 解析 manifest_解析AndroidManifest.xml之AXMLParser.java | 学步园

解析AndroidManifest.xml源码地址:http://code.google.com/p/android4me/source/browse/src/android4me/res/AXMLParser.java/* * Copyright 2008 Android4ME * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file exc…

Java手写Hashmap(HashMap的基本用法)

一&#xff1a;引言 HashMap是Map的实现类&#xff0c;其方法都可以继承Map,不用手写&#xff0c;本篇只是为了了解底层代码和复习java基础敲得码 二&#xff1a;上码 package cn.wyj.two;public class Demo5_手写HashMap<K,V> {Node2 table[];//位桶数组int size;pub…

龙芯3A5000初样顺利交付流片

此前&#xff0c;龙芯完成3A5000设计初样的流片交付。在3A4000架构的基础上&#xff0c;3A5000采用12纳米工艺&#xff0c;设计频率提高近40%&#xff0c;同频模式下功耗降低近60%&#xff0c;同时保持与3A4000芯片管脚兼容。龙芯3A5000和3A4000在微结构上变化不大&#xff0c;…

java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

Java中堆、栈和常量池的区别栈 堆 常量池的概念首先我们先了解一下概念&#xff0c;Java把内存分成两种&#xff0c;一种叫做栈内存&#xff0c;一种叫做堆内存。栈内存存放基本类型的变量数据和对象类型的引用(请注意存放的是引用)&#xff0c;对象本身不存放在栈中&#xff0…

Java当中TreeMap用法

一&#xff1a;引言 当用到了TreeMap时候&#xff0c;是因为要根据键值进行排序&#xff0c;使输出的结果是按递增顺序的 二&#xff1a;上码 package cn.wyj.two;import java.util.Map; import java.util.TreeMap;/*** 一般当 键值需要排序时&#xff0c;我们会选择用 Tree…

redhat java 多个版本_Linux下安装JDK(多个版本) 切换

1、检查系统是否自带了OpenJDK以及相关安装包&#xff0c;如果有的话则应先将其卸载。检查命令&#xff1a;java -versionrpm -qa | grep javarpm -e --nodeps tzdata-java-2013g-1.el6.noarchrpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.i686rpm -e --nodeps…

efcore 新特性 SaveChanges Events

efcore 新特性 SaveChanges EventsIntro昨天早上看到之前关注的一个 efcore 的 issue 被 closed &#xff0c;于是看了一眼&#xff0c; ef core 新合并了一个 PR&#xff0c;在 DbContext 中增加了 SaveChanges 相关的几个事件&#xff0c;具体的变更可以参数 PR https://gith…