Java 关键字 final volatile static

final关键字

修饰类对象、方法、局部变量、成员变量、基本类型、引用类型上效果都不一样

  1. final修饰的类,不可被继承,比如String类
  2. final修饰的方法,不能被子类重写覆盖,比如ClassLoader.findLoadedClass()就是final的
  3. final修饰的静态成员变量,也叫常量,比如常量工具类
  • final修饰成员变量的时候,在申明的时候就必须赋值
  • final修饰局部变量的时候,可以在使用的时候再进行赋值
  • final的赋值是基本类型的时候,一旦赋值就不能修改
  • final的赋值是其它类型的时候,一旦赋值就不能重新引用

volatile关键字

  • 每次读的时候去读主存上的值而不是本地栈中的值,每次写都立刻写到主存当中,而不是等线程结束后再回写到主内存
  • 轻量级的同步机制,实现变量的改变对所有线程可见,并不能避免线程安全
  • 该方法中禁止指令重排序优化

公用的对象存放在主内存当中,每个线程去处理公用对象的时候会拷贝镜像到本地内存当中,在CPU进行读取,修改,写回到本地内存,最后写回到主内存当中,这时候线程之间不可见。volatile关键字会让读取和写的操作的时候,会立刻通知更新主内存同步,并不保证线程安全。

static的特点

线程共享唯一,节省内存开销,优先于构造函数加载

  1. 和类的信息加载而一起加载,不依赖于对象的存在,也优先于对象实例化(构造函数)加载
  2. 保存在方法区,线程共享。
  3. 线程共享所以节省内存开销,比如一些常量对象,另外常量方法不需要实例化对象再调用他,可以直接类名.方法调用,这样不仅简约代码,而且避免实例化对象的内存开销
  4. 线程共享所以可以统一维护多个相同类型的对象属性值。
  5. 常用形式: 静态方法,静态成员变量,静态代码块
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容