Java中static、final、volatile、synchronized、transient、strictfp关键字的使用及原理小结

1、static:

   static可以用来修饰class、field、method等,被static修饰的关键字都存在于堆内存中,也即其生命周期一般是整个应用生命周期,static修饰的field又叫做全局变量,可以在整个类包括其子类中被使用,static修饰的class一般用于静态内部类,是一个类的静态成员,外部可以直接通过类名.静态内部类名来访问,可用new关键字,保证该类所有实例共享一个内存空间;static修饰method,可以不用该方法所属类的实例,直接通过该方法名调用该方法,该方法作为一个对象存放在堆内存中的静态方法区。

2、final:

    可以用来修饰class、field、method,final关键字的作用表明该field或class是一个常量,只能进行一次初始化。

3、volatile:

   一般用于修饰field,保证改数据的内存可见性以及防止jvm对指令进行重排,其原理是:线程A中,cpu执行修改改field时,会先将各种数据加入计算机的缓存中,执行完了后,在写回缓存里面,最后在某个时间,对应线程再读回到主存中,但这样会导致内存可见性安全问题。使用volatile关键字,保证了每个线程都会从主存中去读取该field的值,执行完成后再写回主存中,而不经过缓存,以此来保证线程安全。

4、synchronized:

  该关键字一般用于保证线程安全,可以直接修饰class的某个实例、class、method、field等,修饰class的某个实例表示,获取这个实例的对应monitor,只有该monitor没有被其他线程占用时,才可以进入该代码段,修饰class或static时,表示这一类的所有实例都只能同时有一个线程进行访问。修饰field和method和修饰实例差不多。

5、transient:

  此关键字修饰的field表示该field被序列化时,此对象的值不可见,只存在于当前内存中。

6、strictfp

浮点精度统一,用来修饰类、接口或方法,以此来限制该类的所有float和double都遵循统一的IEEE 754 标准,在不同的操作系统平台环境下都产生同样的值。

猜你喜欢

转载自blog.csdn.net/weixin_41896427/article/details/79790078