java原子操作cas_java并发编程系列二:原子操作/CAS

什么是原子操作

不可被中断的一个或者一系列操作

实现原子操作的方式

Java可以通过锁和循环CAS的方式实现原子操作

CAS( Compare And Swap )  为什么要有CAS?

Compare And Swap就是比较并且交换的一个原子操作,由Cpu在指令级别上进行保证。

为什么要有CAS:因为通过锁实现原子操作时,其他线程必须等待已经获得锁的线程运行完以后才能获得资源,这样就会占用系统的大量资源

CAS包含哪些参数?

CAS包含三个参数:1、变量所在内存地址V;2、变量对应的值A;3、我们将要修改的值B。如果说V上的变量的值是A的话,就用B重新赋值,如果不是A,那就什么事也不做,操作的返回结果原值是多少。

循环CAS:在一个(死)循环【for(;;)】里不断进行CAS操作,直到成功为止(自旋操作即死循环)。

CAS实现原子操作的三大问题

1、 ABA问题:其他的线程把值改成了B,很快改成了A,原子操作的线程发现值是A就修改,这样会有问题。解决ABA,引入版本号:1A-》2C-》3A

2、 循环时间很长的话,cpu的负荷比较大

3、 对一个变量进行操作可以,同时操作多个共享变量有点麻烦

CAS线程安全(面试点)

通过硬件层面的阻塞实现原子操作的安全

原子更新基本类型类

AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。

AtomicInteger的常用方法如下

·int addAndGet(int delta):

·boolean compareAndSet(int expect,int update):

·int getAndIncrement(): 原子递增,但是返回的是自增以前的值

incrementAndGet原子递增,但是返回的是自增以后的值

·int getAndSet(int newValue):

packagecom.lgs.atomicint;importjava.util.concurrent.atomic.AtomicInteger;/*** lgs

* 原子操作更新整型*/

public classAtomicIntTest {static AtomicInteger ai = new AtomicInteger(1);public static voidmain(String[] args) {

System.out.println(ai.getAndIncrement());

ai.incrementAndGet();

System.out.println(ai.get());

}

}

输出:

1

3

原子更新数组类

AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray

AtomicIntegerArray类主要是提供原子的方式更新数组里的整型,

其常用方法如下。

·int addAndGet(int i,int delta):

·boolean compareAndSet(int i,int expect,int update):

数组通过构造方法传入,类会将数组复制一份,原数组不会发生变化。

packagecom.lgs.atomicarray;importjava.util.concurrent.atomic.AtomicIntegerArray;/*** lgs

* 原子操作更新数组*/

public classAtomicArray {static int[] value = new int[]{1,2};static AtomicIntegerArray ai = newAtomicIntegerArray(value);public static voidmain(String[] args) {

ai.getAndSet(0,3);

System.out.println(ai.get(0));

System.out.println(value[0]);

}

}

输出:

3

1

原子更新引用类型提供的类。

·AtomicReference: 可以解决更新多个变量的问题

·AtomicStampedReference:解决ABA问题 使用数字作为版本 关心得是有几个人改过

·AtomicMarkableReference:解决ABA问题 使用Boolean作为版本,关心的是有没有修改过

packagecom.lgs;importjava.util.concurrent.atomic.AtomicReference;/*** lgs

* 原子操作更新引用类型即可以同时更新多个值*/

public classAtomicRef {static AtomicReference userAtomicReference = new AtomicReference<>();public static voidmain(String[] args) {

User user= new User("lgs",26);

userAtomicReference.set(user);

User updateUser= new User("ll",27);

userAtomicReference.compareAndSet(user,updateUser);

System.out.println(userAtomicReference.get().getName());

System.out.println(userAtomicReference.get().getOld());

}static classUser{privateString name;private intold;public User(String name, intold) {this.name =name;this.old =old;

}publicString getName() {returnname;

}public intgetOld() {returnold;

}

}

}

输出:

ll

27

原子更新字段类

Atomic包提供了以下3个类进行原子字段更新。

·AtomicReferenceFieldUpdater:

·AtomicIntegerFieldUpdater:

·AtomicLongFieldUpdater:

违反了面向对象的原则,一般不使用

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

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

相关文章

power bi 日期计算_PowerBI 动态计算周内日权重指数

在很多行业&#xff0c;尤其是零售业&#xff0c;其销售规律在一周内呈现一定的特点。例如&#xff1a;平时有一种购买特点&#xff1b;周末有一种购买特点。故而一周内的星期一到星期日呈现一定的权重分布。周内日权重分布1 到 12 表示月序号&#xff1b;1 到 7 表示周内日。这…

updatechecker.java_解决ehcache的UpdateChecker问题

问题描述项目中用了ssh框架&#xff0c;每次启动tomcat的时候都特别慢&#xff0c;会在这样一句话下面停留很久[2016-01-08 23:55:51,517 INFO UpdateChecker.java:doCheck:98] ---- New update(s) found: 2.6.5 [http://www.terracotta.org/confluence/display/release/Releas…

vb 6.0 获取重定向的url_接口测试:A07_HttpRunner重定向_04_解决方案

A07_HttpRunner重定向_04_解决方案既然 HttpRunner 是对 requests 模块的封装&#xff0c;那我们就试图从 requests 中寻找答案&#xff0c;在其官网中发现了对重定向的描述和处理&#xff1a;地址&#xff1a;http://cn.python-requests.org/zh_CN/latest/user/quickstart.htm…

java wordcount程序_[java]wordcount程序

词数统计系统。作业解析&#xff1a;这次作业的内容是从本地读取一个程序代码&#xff0c;计算出这个程序中的行数&#xff0c;单词数&#xff0c;也可进行拓展。实现语言&#xff1a;java编程思路&#xff1a;程序是由各种单词和符号组成的&#xff0c;单词包括关键字&#xf…

python怎么创建虚拟环境_anaconda怎么创建python虚拟环境

anaconda创建python虚拟环境的方法是&#xff1a;执行命令【conda create -n your_env_name pythonxx】即可。如果我们要激活虚拟环境&#xff0c;执行命令【activate your_env_name】即可。具体方法如下&#xff1a;创建python虚拟环境conda create -n your_env_name pythonxx…

java servlet深入理解_java 步步惊心 (web ) 深入理解servlet

用户在浏览器中输入一个网址回车&#xff0c;浏览器会向服务器发送一个HTTP请求。服务器端程序接受这个请求&#xff0c;并对请求进行处理&#xff0c;然后发送回应&#xff0c;浏览收到回应&#xff0c;再把回应的内容显示出业。这种请求-响应模式就是典型web应用程序访问过程…

robot ride edit 页面不显示_【框架】robot-framework预研

隔壁组在使用robot framework进行自动化测试&#xff0c;这玩意之前我没接触过&#xff0c;决定来预研一下这个auto test框架。背景一个好的框架&#xff0c;背后少不了一个牛逼的团队或组织(金主爸爸)&#xff0c;也是判断是否值得投入时间学习的一个参考因素(虽然强如塞班系统…

java 多态 降低耦合_java多态

Java多态就是为了降低耦合&#xff0c;方便我们开发的一种特性。比如我写了一个动物的接口。然后我通过接口实现了猫和狗这个类。在我需要使用的时候我可以这样实例化对象动物 w new 猫。这就是向上转型。这里就有一点疑问了&#xff0c;我们开发人员为啥不直接写个猫和狗的类…

jap和java有关系吗_hibernate与jpa有什么区别和联系?

~JPA Java Persistence API&#xff0c;是Java EE 5的标准ORM接口&#xff0c;也是ejb3规范的一部分。Hibernate&#xff0c;当今很流行的ORM框架&#xff0c;是JPA的一个实现&#xff0c;但是其功能是JPA的超集。JPA和Hibernate之间的关系&#xff0c;可以简单的理解为JPA是标…

python找房源_Python租房信息分析!找到最适合自己的房源信息!

原标题&#xff1a;Python租房信息分析&#xff01;找到最适合自己的房源信息&#xff01;租房信息分析import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfile_data pd.read_csv("./data/链家北京租房数据.csv")file_dat…

php 任意字符串_php 生成任意长度字符串的类(只含有数字 只含有字母 混合数字和字母)...

[php]代码库/** 生成随机字符串的类&#xff0c;默认只包含数字、大小写字母*/class randomString {/** 生成的字符串包含的字符设置*/const NUMERIC_ONLY 1; //只含有数字const LETTER_ONLY 2; //只含有字母const MIXED 3; //混合数字和字母/** 用户传入变量&#xff0c;分…

python添加时间戳_在python中添加时间戳

这两个解决方案(AFAIK)都可以在python的任何2.x版本上运行(因此保证了相当多的向后兼容性)仅依赖于regex库的实现&#xff1a;import redata 2011-03-07 0:27:412011-03-06 0:13:412011-03-05 0:17:402011-03-04 0:55:402011-05-16 0:55:402011-05-16 0:55:402011-07-16 0:55:…

php 删除某个文件夹,Php删除指定文件与文件夹的方法

例子&#xff1a;复制代码 代码示例://删除指定目录(文件夹)中的所有文件函数function delfile($dir) {if (is_dir($dir)) {$dhopendir($dir);//打开目录//列出目录中的所有文件并去掉 . 和 ..while (false ! ( $file readdir ($dh))) {if($file!"." && $fi…

python 按月份分组_django ORM queryset按月、周、TruncMonth分组

如何在Django ORM中对datetime字段进行group by查询&#xff1f;在型号&#xff1a;class test1(models.Model):id models.AutoField(primary_keyTrue, uniqueTrue, verbose_nameid)name models.CharField(verbose_namename, max_length200)cdate models.DateField(verbose_…

explode php 报错,ecshop在php5.4下报错怎么办

ecshop在php5.4下报错的解决办法&#xff1a;1、打开“cls_template”文件&#xff0c;并修改“$tag_selarray_shift(explode( ,$tag));”&#xff1b;2、修改“static”&#xff1b;3、修改cls_captcha文件。本教程操作环境&#xff1a;windows7系统、PHP5.4版、Dell G3电脑。…

python response.json()报错_解决Django响应JsonResponse返回json格式数据报错问题

解决Django响应JsonResponse返回json格式数据报错问题,给大家,报错,代码,图书,希望能解决Django响应JsonResponse返回json格式数据报错问题易采站长站&#xff0c;站长之家为您整理了解决Django响应JsonResponse返回json格式数据报错问题的相关内容。代码return JsonResponse({…

php 实例 规范,PHP开发规范实例详解

本文主要和大家分享PHP开发规范实例详解&#xff0c;希望能帮助到大家。源文件代码使用<?php开头 &#xff0c;忽略闭合标签?>文件格式必须是无BOM UTF-8格式一个文件只声明一种类型&#xff0c;如class和interface不能混写在一个源文件中缩进使用4个空格来缩进&#x…

sql 相加_SQL经典题型

SQL内容及常见面试题如下&#xff1a;以下为具体的面试题内容和答案一、简单查询题目查询姓“猴”的学生名单查询姓名中最后一个字是“猴”的学生名单查询姓名中带“猴”的学生名单查询姓“孟”老师的个数二、汇总分析题目查询课程号为“0002”的总成绩查询选了课程的学生人数查…

centos编译apache php mysql,在CentOS6.7中编译安装 apache php mysql

安装 开发工具 yum groupinstall "Development Tools" ------------------------------ tar -jxvf apr-1.5.2.tar.bz2 cd apr-1.5.2 ./configure --prefix/usr/local/apr make && make install ----------------- tar -jxvf apr-util-1.5.4.tar.bz2 cd apr-u…

python为什么虚部是j不是i_Python基础02 基本数据类型

简单的数据类型以及赋值变量不需要声明Python的变量不需要声明&#xff0c;你可以直接输入&#xff1a;>>>a 10那么你的内存里就有了一个变量a&#xff0c; 它的值是10&#xff0c;它的类型是integer (整数)。 在此之前你不需要做什么特别的声明&#xff0c;而数据类…