• 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

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

  • 相关阅读:
    Storm笔记——技术点汇总
    Spark笔记——技术点汇总
    Hive笔记——技术点汇总
    Spark SQL笔记——技术点汇总
    Tomcat剖析(三):连接器(2)
    Tomcat剖析(三):连接器(1)
    Tomcat剖析(二):一个简单的Servlet服务器
    Tomcat剖析(一):一个简单的Web服务器
    HTTP协议
    Java实现顺序表
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/12832185.html
Copyright © 2020-2023  润新知