zoukankan      html  css  js  c++  java
  • 线程的原子性与可见性

     

    同步最基本的目的是保证原子性。另一个容易忽略的目的是可见性,即一个线程修改的共享数据对另一个线程可见。

    因为一些基本类型的赋值操作本身是原子的。所以针对这些赋值操作在不使用synchronized的情况下,可以使用volatile来解决一个线程的修改对另一个线程的可见。 所以volatile是在能保证原子性的前提下,避免使用synchronized解决可见性的办法。

    private static volatile int nextSerialNumber = 0;

    public static int generateSerialNumber() {
       //由于nextSerialNumber++这样的“赋值”其实分解成多个步骤。这样下面的方法就不能保证原子性了。
       return nextSerialNumber++;
    }

    改进:
    private static int nextSerialNumber = 0;
    //如果使用synchronized,volatile就可以省略了。后者一样可以保证可见性。
    synchronized public static int generateSerialNumber() {
       return nextSerialNumber++;
    }
    或者:
    //AtomicLong是CAM机制保证可见性与原子性。
    private static final AtomicLong nextSerialNum = new AtomicLong();
    public static long generateSerialNumber() {
        return nextSerialNum.getAndIncrement();
    }

     
     
  • 相关阅读:
    数组塌陷现象
    深浅拷贝的区别
    冒泡排序,选择排序的应用
    JavaScript双重循环的嵌套
    Css Grid网格布局
    css3动画详细介绍
    Python tkinter Label Widget relief upload image
    XXXFD
    XXX1
    Python爬取一个简单网页的HTML代码
  • 原文地址:https://www.cnblogs.com/highriver/p/2285804.html
Copyright © 2011-2022 走看看