Java 基础(一)核心关键词
提示:本文原创,转载请注明地址 https://www.cnblogs.com/baokang/p/18546998
核心关键词
Java的核心关键词有:final、synchronized、volatile,下述对这些关键词从含义
、作用
、用法
和注意点
这几个方面进行详细描述
1.1 final
final:代表不变、最终的意思
基本用法,它可以用于:
- 修饰类:比如字符串类 String, 表示该类不可以被继承
- 修饰方法:表示该方法不可以被重载
- 修饰变量:被修饰的变量可以是本地变量、方法参数、静态变量、类成员对象,对于被修饰的变量具有引用不可变性
- 如果该变量引用的是基本数据类型,则初始化过后变量值不可以改变
- 如果该变量引用的是对象,则变量初始化之后,不可改变引用的对象,但是对象的内容可以改变
【扩展知识】
final 修饰的变量到底是存储在 JVM 内存的哪个位置的?
答案:在JVM,是运行时常量区,生命周期不会随着方法的结束而结束
final 用于安全发布对象(内存语义)
解释:普通对象的生成包括(1)分配内存区域(2)将引用对象指向该内存区域(3)执行构造函数,这个3个操作不是原子的,多线程环境下,其他线程有读取到中间态的可能,是线程不安全的,而 JVM 规范规定(其实也就是 final 的重排规则) final 关键词修饰的对象,对其他线程可见之前一定是初始化结束的状态,因此对于 final 变量本身,是线程安全的,但是 final 指向的内容可以变化,可能是线程不安全的。因此变量被传递到多线程中使用时,需要定义为 final。具体原理是在对象生成过程中使用内存屏障实现的。
final 关键词注意点:final 修饰的变量,需要在声明的时候进行初始化,可以在构造函数中,静态代码块中,或者声明赋值语句中。
参考:
https://www.javamex.com/tutorials/synchronization_final.shtml
https://blog.csdn.net/aaqian1/article/details/113771134
https://cloud.tencent.com/developer/article/1399428
1.2 synchronized
synchronized 是最基本的用于处理多线程资源竞争的方式,具有原子性和排他性,可以用于修饰方法,或者代码块,有且只有一个线程可以访问被 synchronized 修饰的代码块。
如果有一线程获取到了 synchronized 锁,其他线程将被阻塞,直到锁线程执行完,被阻塞线程被唤醒,允许去争夺该 synchronized 锁。可以使用 Lock 锁、wait/notify 关键词实现相同的功能。
1.3 volatile
volatile 含义为立即可见的,是 jvm 提供的最轻量的同步工具
在多线程环境下,如果一个 volatile 变量被修改了,对于其他线程来说,可以立即读取到最新值,内部原理是:其他线程在读取 volatile 时,增加了一层内存屏障,需要额外去读取一次主存中变量的值。
但是使用 volatile 修饰变量,其变量并不是线程安全的,线程对于读取变量和修改变量这两个操作并不是原子的,所以会造成现场不安全。