转载自

相关文章

你真的了解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 的操作是线程安全的么?为什么?如何使其线程安全呢?相关推荐

  1. java中使用lua操作redis

    java中使用lua脚本参见我的上一篇文章 lua基础 本篇简单说下java中使用lua操作redis的示例,如下: 先引入jedis <dependency><groupId> ...

  2. java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式详解与比较(转)

    java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式详解与比较(转) http://wishlife.javaeye.com/blog/181865 posted on 2010-12 ...

  3. 深圳软件测试培训:java中数组的操作

    深圳软件测试培训:java中数组的操作 一.数组最常见的一个操作就是遍历. 因为数组的每个元素都可以通过索引来访问,通过for循环就可以遍历数组. public class M { public st ...

  4. java中的IO操作总结

    java中的IO操作 在java中IO涉及的范围比较大,本文主要针对文件内容的读写 对于文件内容的操作主要分为两大类: 字符流:有两个抽象类 writer Reader 其对应子类FileWriter ...

  5. java中的IO操作总结(一)

    转载:http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.html    所谓IO,也就是Input与Output的缩写.在java中 ...

  6. java中文件的操作讲解

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://ww ...

  7. Java中的日期操作

    在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception {SimpleDateFormat sdf = ne ...

  8. atomic java_在Java中添加@atomic操作

    atomic java 总览 原子操作如何在Java中工作,OpenJDK / Hotspot中是否存在可以转换为原子的当前替代方法. 反馈 在我以前的文章中, 对可变字段进行原子操作. 有几次指出, ...

  9. Java中不一致的操作会扩大规则

    总览 当您在Java中执行一元或二进制操作时,标准行为是使用最宽的操作数(或对byte , short和char使用更宽的操作数). 这很容易理解,但是如果考虑最佳类型可能会造成混淆. 乘法 当执行乘 ...

最新文章

  1. c# java数据类型不同点
  2. 图形界面不卡的linux,图形化界面linux(linaro)的安装小结
  3. Java面试题阶段汇总
  4. map的extract 是更换 map 的键而不重分配的唯一方式:
  5. java 拆箱_Java自动装箱拆箱
  6. python打印生成word_使用python调用zabbix接口截取监控图并生成Word文档
  7. .net 怎么循环得到数组里的值_HashMap 底层实现、加载因子、容量值及死循环
  8. 回溯算法之幸运的袋子
  9. mvc模式 mysql做网页_SpringMVC + Hibernate + MySQL 的简易网页搭建(Control实现篇)
  10. 在PyCharm下使用Jupyter Notebook
  11. php中数字字符串转换为字符串,php如何实现数字转字符串,php字符串转换为数字...
  12. Mybatis新发现—在idea中数据库操作出现了异常,最好的查错助手居然是这个!
  13. unity5, Configurable Joint: Anchor, Connected Anchor, Auto Configure Connected Anchor
  14. Java和JavaScript中使用Json方法大全
  15. wamp怎么安装mysql服务器_使用WAMPServer套件可安装Apache服务器和MySQL服务器
  16. Rust : utf8与unicode码
  17. 关于VGA的分辨率。。。。图解
  18. 在Excel中如何实现快速互换两列内容
  19. 无损连接和保持依赖性(有脑就行,尽量说人话版本)
  20. LeetCode 915. 分割数组**(double,需要trp)

热门文章

  1. C++虚继承(四) --- /d1 reportSingleClassLayout插入看类内存布局
  2. cocos2d-x游戏开发(十一)细说场景切换
  3. SQLite3的提交事务代码
  4. C语言程序设计 | 扫雷游戏
  5. kubernetes(一)kubeadm搭建k8s集群
  6. Redis内存使用优化与存储
  7. 再见了微服务!全面拥抱 DDD 真正的价值
  8. 跟着邓神 3 天掌握 Go 语言基础(免费)
  9. 力扣--替换后的最长重复字符
  10. Qt的Socket通信