京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?
转载自
相关文章
你真的了解volatile关键字吗?http://blog.csdn.net/FansUnion/article/details/79495080
面试题:为什么最后两行没有运行?http://blog.csdn.net/FansUnion/article/details/79625308
Java并发编程之CAS http://blog.csdn.net/FansUnion/article/details/79494554
网友观点
一、
如果是方法里定义的,一定是线程安全的,因为每个方法栈是线程私有的。
JVM的栈是线程私有的,所以每个栈帧上定义的局部变量也是线程私有的,意味着是线程安全的。可以参考http://blog.csdn.net/taohuaxinmu123/article/details/24472073中对Java虚拟机栈(Java Virtual Machine Stacks)的说明。
如果是类的成员变量,i++则不是线程安全的,因为i++会被编译成几句字节码语句执行,可以通过synchronize块来提供同步。
二、非线程安全, 用 AtomicInteger 即可
三、++i的操作肯定是线程安全的。
四、
如果是我答这道题:
先说不是原子的,因为这个是分为三步,读值,+1,写值。在这三步任何之间都可能会有CPU调度产生,造成i的值被修改,造成脏读脏写。
接下来说volatile不能解决这个线程安全问题。因为volatile只能保证可见性,不能保证原子性。回答这个只为了让面试官晓得你考虑周全,知识面广。
接下来说可以用锁。使用synchronized或者ReentrantLock都可以解决这个问题。这里还可以比较下这两种方式的优劣。教科书式的比较结束后,来一句“我认为一般使用synchronized更好,因为JVM团队一直以来都在优先改进这个机制,可以尽早获得更好的性能,并且synchronized对大多数开发人员来说更加熟悉,方便代码的阅读”。
最后补上AtomicInteger。为什么AtomicInteger使用CAS完成?因为传统的锁机制需要陷入内核态,造成上下文切换,但是一般持有锁的时间很短,频繁的陷入内核开销太大,所以随着机器硬件支持CAS后,JAVA推出基于compare and set机制的AtomicInteger,实际上就是一个CPU循环忙等待。因为持有锁时间一般较短,所以大部分情况CAS比锁性能更优。
最初是没有CAS,只有陷入内核态的锁,这种锁当然也需要硬件的支持。后来硬件发展了,有了CAS锁,把compare 和 set 在硬件层次上做成原子的,才有了CAS锁。
五、
由于线程共享栈区,不共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全。
2. AtomicInteger 和 各种 Lock 都可以确保线程安全。AtomicInteger 的效率高是因为它是互斥区非常小,只有一条指令,而 Lock 的互斥区是拿锁到放锁之间的区域,至少三条指令。
原文链接:http://group.jobbole.com/26557/
京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?相关推荐
- java中使用lua操作redis
java中使用lua脚本参见我的上一篇文章 lua基础 本篇简单说下java中使用lua操作redis的示例,如下: 先引入jedis <dependency><groupId> ...
- java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式详解与比较(转)
java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式详解与比较(转) http://wishlife.javaeye.com/blog/181865 posted on 2010-12 ...
- 深圳软件测试培训:java中数组的操作
深圳软件测试培训:java中数组的操作 一.数组最常见的一个操作就是遍历. 因为数组的每个元素都可以通过索引来访问,通过for循环就可以遍历数组. public class M { public st ...
- java中的IO操作总结
java中的IO操作 在java中IO涉及的范围比较大,本文主要针对文件内容的读写 对于文件内容的操作主要分为两大类: 字符流:有两个抽象类 writer Reader 其对应子类FileWriter ...
- java中的IO操作总结(一)
转载:http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.html 所谓IO,也就是Input与Output的缩写.在java中 ...
- java中文件的操作讲解
1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://ww ...
- Java中的日期操作
在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception {SimpleDateFormat sdf = ne ...
- atomic java_在Java中添加@atomic操作
atomic java 总览 原子操作如何在Java中工作,OpenJDK / Hotspot中是否存在可以转换为原子的当前替代方法. 反馈 在我以前的文章中, 对可变字段进行原子操作. 有几次指出, ...
- Java中不一致的操作会扩大规则
总览 当您在Java中执行一元或二进制操作时,标准行为是使用最宽的操作数(或对byte , short和char使用更宽的操作数). 这很容易理解,但是如果考虑最佳类型可能会造成混淆. 乘法 当执行乘 ...
最新文章
- c# java数据类型不同点
- 图形界面不卡的linux,图形化界面linux(linaro)的安装小结
- Java面试题阶段汇总
- map的extract 是更换 map 的键而不重分配的唯一方式:
- java 拆箱_Java自动装箱拆箱
- python打印生成word_使用python调用zabbix接口截取监控图并生成Word文档
- .net 怎么循环得到数组里的值_HashMap 底层实现、加载因子、容量值及死循环
- 回溯算法之幸运的袋子
- mvc模式 mysql做网页_SpringMVC + Hibernate + MySQL 的简易网页搭建(Control实现篇)
- 在PyCharm下使用Jupyter Notebook
- php中数字字符串转换为字符串,php如何实现数字转字符串,php字符串转换为数字...
- Mybatis新发现—在idea中数据库操作出现了异常,最好的查错助手居然是这个!
- unity5, Configurable Joint: Anchor, Connected Anchor, Auto Configure Connected Anchor
- Java和JavaScript中使用Json方法大全
- wamp怎么安装mysql服务器_使用WAMPServer套件可安装Apache服务器和MySQL服务器
- Rust : utf8与unicode码
- 关于VGA的分辨率。。。。图解
- 在Excel中如何实现快速互换两列内容
- 无损连接和保持依赖性(有脑就行,尽量说人话版本)
- LeetCode 915. 分割数组**(double,需要trp)