zoukankan      html  css  js  c++  java
  • 如何使++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锁。

  • 相关阅读:
    独立开发unity2d游戏的问答群
    使用闭包和lambda解决问题与常规方式解决问题的对比。
    说《深渊》
    AS3项目基础框架搭建分享robotlegs2 + starling1.3 + feathers1.1
    ArrayList源码学习
    在springMVC的controller中获取request,response对象的一个方法
    postgresql存储过程
    RabbitMq笔记
    dubbo学习笔记
    修改数据库的最大连接数
  • 原文地址:https://www.cnblogs.com/treasury/p/12991865.html
Copyright © 2011-2022 走看看