• Java 常用关键字理解


    static

    代码执行顺序

    父类静态变量初始化
    父类静态块初始化
    子类静态变量初始化
    子类静态块初始化
    main 方法执行
    父类构造器初始化
    子类构造器初始化

    父类的静态变量和静态块比子类优先初始化;
    静态变量和静态块比类构造器优先初始化。

    final

    被 final 修饰的类,表明该类是无法继承的;
    被 final 修饰的方法,表明该方法是无法覆写的;
    被 final 修饰的变量,说明该变量在声明的时候,就必须初始化完成,而且以后也不能修改其内存地址

    我们说的是无法修改其内存地址,并没有说无法修改其值。因为对于 List、Map 这些集合类来说,被 final 修饰后,是可以修改其内部值的,但却无法修改其初始化时的内存地址。

    volatile

    volatile 的意思是可见的,常用来修饰某个共享变量,意思是当共享变量的值被修改后,会及时通知到其它线程上,其它线程就能知道当前共享变量的值已经被修改了。
    就是在多核 CPU 下,为了提高效率,线程在拿值时,是直接和 CPU 缓存打交道的,而不是内存。主要是因为 CPU 缓存执行速度更快,比如线程要拿值 C,会直接从 CPU 缓存中拿, CPU 缓存中没有,就会从内存中拿,所以线程读的操作永远都是拿 CPU 缓存的值。

    这时候会产生一个问题,CPU 缓存中的值和内存中的值可能并不是时刻都同步,导致线程计算的值可能不是最新的,共享变量的值有可能已经被其它线程所修改了,但此时修改是机器内存的值,CPU 缓存的值还是老的,导致计算会出现问题。

    这时候有个机制,就是内存会主动通知 CPU 缓存。当前共享变量的值已经失效了,需要重新来拉取一份,CPU 缓存就会重新从内存中拿取一份最新的值。

    volatile 关键字就会触发这种机制,加了 volatile 关键字的变量,就会被识别成共享变量,内存中值被修改后,会通知到各个 CPU 缓存,使 CPU 缓存中的值也对应被修改,从而保证线程从 CPU 缓存中拿取出来的值是最新的。

    transient

    序列化时忽略加有该关键字的变量

  • 相关阅读:
    GitLab 介绍
    git 标签
    git 分支
    git 仓库 撤销提交 git reset and 查看本地历史操作 git reflog
    git 仓库 回退功能 git checkout
    python 并发编程 多进程 练习题
    git 命令 查看历史提交 git log
    git 命令 git diff 查看 Git 区域文件的具体改动
    POJ 2608
    POJ 2610
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/12832185.html
Copyright © 2020-2023  润新知