zoukankan      html  css  js  c++  java
  • Java 关键字volatile的解释

    volatile 关键字特征:

    1.可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。可以禁止线程的工作内存对volatile修饰的变量进行缓存,并将修改的变量立即写入主存。

    2.确保有序性 Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义。

    3.原子性:

      原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。

    4.线程不安全性:volatile变量在各个线程的工作内存中存在不一致性的问题,但是,在每次使用前都要刷新,所以执行引擎不会看到不一致的情况,所以认为不存在不一致性问题。以上两个规则,保证了可见性。

    ------------------------------------------------------------------------------------------------------------

    ReadWriteLock的作用:

    对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法

    假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方法都要加入 synchronized同步块。

    这样任何线程在写入时,其它线程无法读取与改变数据;如果有线程在读取时,其他线程也无法读取或写入。这种方式在写入操作远大于读操作时,问题不大,而当读取远远大于写入时,会造成性能瓶颈,因为此种情况下读取操作是可以同时进行的,而加锁操作限制了数据的并发读取。   ReadWriteLock解决了这个问题,当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。

    -------------------------------------------------------------------------------------------------------------

    CopyOnWriteArraryList的作用:

    其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略

    简单的理解就是:当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。

    这是一种读写分离的思想

    1.不能保证数据的实时一致性;

    2.适用于读多写少的场景(白名单,黑名单以及商品更新等场景)。

    ---------------------------------------------------------------------------------------------------------------------

    多线程一共有三种实现方式:
    方式1:继承Thread类,并重写run()方法
    方式2:实现Runnable接口,实现run()方法
    方式3:实现Callable接口,线程结束后可以有返回值,但是该方式是依赖于线程池的。
     
    ----------------------------------------------------------------------------------------------------------------------
    Java关键字:
     

     

    总结:

    1.基本类型:byte, char, double, int, long , short, float  (不包括String类型);

    2.异常和导入包:try, catch, finally, throw, throws, import, package(包);

    3.变量引用:super, this, void;

    4.程序控制:if, else, return, do, while, for, switch, case, default, break, instanceof;

    5.访问控制:private,public,protected;

    6.类,方法,变量修饰符:

    abstract 声明抽象
    class 类
    extends 扩允,继承
    final 终极,不可改变的
    implements实现
    interface 接口
    native 本地
    new 新,创建
    static 静态
    strictfp 严格,精准
    synchronized 线程,同步
    transient 短暂
    volatile 易失

  • 相关阅读:
    编译gcc报错make[3]: Leaving directory `/usr/local/src/gcc-7.4.0/build/gcc' make[2]: *** [all-stage1-gcc] Error 2 处理
    ERROR 1176 (42000): Key 'XXX' doesn't exist in table 'XXX'报错处理
    /lib64/libc.so.6: version `GLIBC_2.18' not found报错解决
    Centos7上pkg-config的安装
    ERROR: Error in Log_event::read_log_event(): 'Found invalid event in binary log', data_len: 31, event_type: 35报错处理
    MySQL5.7主从复制slave报Last_Errno: 1146错误解决
    详述 hosts 文件的作用及修改 hosts 文件的方法
    Java Decompiler(Java反编译工具)
    使用Charles代理工具导致电脑无法正常访问网站(您的连接不是私密连接)
    阿里云服务器Svn-Server无法连接,阿里云服务器SVNServer配置
  • 原文地址:https://www.cnblogs.com/Lxiaojiang/p/6732138.html
Copyright © 2011-2022 走看看