java i线程安全吗_Java中 i++ 是线程安全的么?为什么?

问题

在 int i = 0; i = i++; 语句中,i = i++是线程安全的么?如果不安全,请说明上面操作在JVM中的执行过程,为什么不安全?说出JDK中哪个类能达到以上的效果,并且是线程安全而且高效的,简述其原理。

回答

语句 i = i++;不是线程安全的。

该语句执行过程如下,

先把 i 的值取出来放到栈顶,可以理解为引入了一个第三方变量 k,此时,k的值为i,

然后执行自增操作,i的值变为1,

最后执行赋值操作 i = k (自增前的值)

因此执行结束后,i的值还是0.

从上面的分析可知,i = i++语句的执行过程有多个操作组成,不是原子操作,因此不是线程安全的。

在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而java.util.concurrent.AtomicInteger是一个提供原子操作的Integer类,其提供了线程安全且高效的原子操作,是线程安全的。

AtomicInteger类的底层实现原理是利用处理器的CAS操作(Compare And Swap,比较与交换,一种有名的无锁算法)来检测栈中的值是否被其他线程改变,如果被改变则CAS操作失败。这种实现方法在CPU指令级别实现了原子操作,因此,其比使用synchronized来实现同步效率更高。

CAS操作过程都包含三个运算符:内存地址V、期望值E、新值N。当操作的时候,如果地址V上存放的值等于期望值E,则将地址V上的值赋为新值N,否则,不做任何操作,但是要返回原值是多少。这就保证比较和设置这两个动作是原子操作。系统主要利用JNI(Java Native Interface,Java本地接口)来保证这个原子操作,它利用CPU硬件支持来完成,使用硬件提供swap和test_and_set指令,但CPU下同一指令的多个指令周期不可中断,SMP(Symmetric Multi-Processing)中通过锁总线支持这两个指令的原子性。

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

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

相关文章

EBS 多组织访问设置

如果想让你的职责下为单组织模式,那么你在Profile下只设置MO: Operating Unit的值,MO: Operating Unit提供只访问一个单独的OU。如果你想让你的职责下为多组织模式,你需要设置MO: Security Profile,MO: Security Profile提供多组织…

java第k小元素_java – 如何从对象列表中提取K“最小”元素?

我会对清单进行排序.然后,我将创建一个包含这10个最小对象的列表,并更改原始列表list1以包含其余对象.就像是:Collection.sort(list1);ArrayList yourSmallestElements (ArrayList)(list1.sublist(0, 9).clone());list1.removeAll(yourSmallestElements);注意&…

JQuery学习系列总结—菜单制作

1、页面中的菜单项可以通过嵌套的ul和li来表示 2、菜单最外层为ul,一层每个主菜单放在一个li中,如果有子菜单,在这个主菜单的li中建立新的ul,再依次嵌套即可构建多层的菜单 3、浏览器中ul和li元素默认情况下文字前都有圆点标识符&…

mysql 大量列 动态变量_aardio动态mysql变量设置

aardio动态mysql变量设置aardio动态mysql变量设置废话不多说,直接开始干活!从上午度娘到现在!终于有点结果!需求是从数据库读取数据,根据条件(变量)直接上代码,如有任何问题,欢迎老铁指正&#…

制作简单的java应用程序_使用exe4j工具制作简单的java应用程序

首先需要下载exe4j工具并进行安装,下面是利用exe4j工具制作应用程序的步骤。1.首先将工程导出为可运行的jar包,选择extract required libralies into generated java,会将引用到的jar包也打到里面。右键java工程--export--java--runnable jar…

HDU 4422 The Little Girl who Picks Mushrooms(简单题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid4422 题目大意:小姑娘背着5个包去山上采蘑菇,每座山上只能用一个背包采集。三个小精灵会要她3个背包,其里面蘑菇的数量必须是1024的倍数,否则5个背包都会被拿走。…

Java三维文字特效设计_jQuery实现3D文字特效的方法

本文实例讲述了jQuery实现3D文字特效的方法。分享给大家供大家参考。具体如下:这款基于jQuery的3D文字特效演示,不是真正的3D,是由多个文字形成的3D效果,如果首次加载网页出错的话,请刷新一下页面,当然在使…

MVC的传递数据的方法

1、使用ViewBag 1 #region 0.2 Action方法 ActionResult Index2()2 /// <summary>3 /// Action方法4 /// </summary>5 /// <returns></returns>6 public ActionResult Index2()7 {8 …

java 找不到构造函数_JAVA找不到符号构造函数

JAVA找不到符号构造函数关注:52 答案:2 mip版解决时间 2021-02-05 09:13提问者彼岸独舞2021-02-05 00:06class Rect{private double length;private double width;public Rect(double length,double width){this.widthwidth;this.lengthlength;}public double getLength(){re…

SRF之数据访问

数据访问组件实现实体类和数据表映射、SQL语句配置执行、动态sql语句等功能&#xff0c;ORM方式能实现简单的对象和表的映射&#xff08;配置类似hibernate&#xff09;&#xff0c;但比较单一&#xff08;不支持一对多、多对多的情况&#xff09;&#xff0c;下边不做介绍&…

java 抽象类 方法_java 抽象类

Java为什么使用抽象类和接口Java接口和Java抽象类代表的就是抽象类型&#xff0c;就是我们需要提出的抽象层的具体表现。OOP面向对象的编程&#xff0c;如果要提高程序的复用率&#xff0c;增加程序的可维护性&#xff0c;可扩展性&#xff0c;就必须是面向接口的编程&#xff…

JQuery Show()的几种效果

1 show()方法和hide()方法 $("selector").show() 从display:none还原元素默认或已设置的display属性$("selector").hide() 设置元素的display样式为none&#xff0c;等于$("selector").css("display","none")&#xff…

java 创建servlet出错_java-创建applicationContext.xml时出错:在Servlet...

我正在尝试使用Spring和Hibernate配置Java MVC Web应用程序,但是当我运行服务器时出现此错误,并且我不知道这是什么问题.ERROR: org.springframework.web.context.ContextLoader - Context initialization failedorg.springframework.beans.factory.BeanCreationException: Err…

POJ 2054 Color a Tree

贪心。。。。 Color a TreeTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 6647 Accepted: 2249Description Bob is very interested in the data structure of a tree. A tree is a directed graph in which a special node is singled out, called the "ro…

php多进程并发,php多进程模拟并发事务

用实例代码给大家介绍关于php多进程模拟并发事务产生的一些问题&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说了&#xff0c;来一起看看详细的介绍吧数据表drop table if exists test;create table if not exists test (id int not null auto_increment ,count …

查看数据库中有哪些活动的事务,对应的会话id,执行的语句

select dbt.database_id,DB_NAME(dbt.database_id) 数据库名,dbt.transaction_id,at.name,at.transaction_begin_time,case at.transaction_type --事务类型 when 1 then 读/写事务 when 2 then 只读事务 when 3 then 系统事务 when 4 then 分布式事务 end trans…

php xml 空格,php闭合标签输出多余空行使xml页面显示错误的处理

在PHP官方文档中&#xff0c;曾经指出最好不要再结尾添加?>结束标记。但我们编程的习惯和使用的IDE都会为我们自动建立php结束标记?>。这个标记使用在正常情况下是不影响程序的运行的。尤其在早期的php4中&#xff0c;这种标记使用不当也不会影响最后的输出。但我最近遇…

Oil Deposits

hdu1241:http://acm.hdu.edu.cn/showproblem.php?pid1241 题意&#xff1a;就是找出有多少块有石油的区域&#xff0c;就是数组中的,这边相邻指的是是周围的八个位置。 题解&#xff1a; dfs&#xff0c;从一块油田的位子开始&#xff0c;朝着与他相邻的8个方向收索&#xff…

apache配置php版本,apache配置支持多版本php

首先在apache2配置目录中建立虚拟主机配置文件如下ServerName gzshes.localhostDocumentRoot "/var/www/gzshes"DirectoryIndex index.html index.phpOptions Indexes FollowSymLinks ExecCGIAllowOverride AllRequire all granted#下面为URL静态重写环境的配置&…

php批量采集电视剧,如何通过PHP多线程批量采集下载远程网站图片代码实例

/*** curl 多线程* author http://www.lai18.com* param array $array 并行网址* param int $timeout 超时时间* return mix*/public function Curl_http($array,$timeout15){$res array();$mh curl_multi_init();//创建多个curl语柄foreach($array as $k>$url){$conn[$k]…