深入理解static、volatile关键字

static

意思是静态的,全局的。被修饰的东西在一定范围内是共享的,被类的所有实例共享,这时候需要注意并发读写的问题。

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。所以,static对象可以在他的任何对象创建之前访问,无需引用任何对象。

static可以修饰变量、方法和代码块。

static修饰类变量的时候,被修饰的变量叫做静态变量或者类变量;如果该变量的访问权限是public的话,表示该变量,可以被任何类调用,无需初始化。直接使用 类名.static变量名这种形式访问即可。

static和final一起修饰的变量可以理解为 “全局常量”,一旦赋值就不可更改,并且可以通过类名访问。对于static final修饰的方法不可以覆盖,并且可以通过类名直接访问。

这时候我们非常需要注意的就是线程安全问题了,当多个线程同时对共享变量进行读写时,很可能会出现并发问题

一般有两种解决方法:

  1. 把线程不安全的变量,例如修饰的是ArrayList替换成线程安全的CopyOnWriteArrayList;
  2. 每次访问这个变量,手动加锁。

静态变量和实例变量的区别
对于静态变量,在内存中只有一个拷贝,JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可以用类名直接访问,可以用对象来访问(不推荐)。

对于实例变量,每次创建一个实例,JVM就会为其分配一次内存,它在内存中有多个拷贝,互不影响。

static修饰方法时,该方法内部只能调用static方法,不能调用普通方法,但是普通方法可以调用static方法,也可以在普通方法中访问静态变量。我们常用的util类里面的方法,大多数是被static修饰的方法,在调用的时候很方便。
因为任何实例对象都可以调用静态方法,所以静态方法中不能出现this或者super关键字。

static修饰代码块时,我们叫做静态代码块或者静态方法块,一个类中可以有多个静态代码块,他不在任何方法的内部,JVM加载类的时候会执行这些静态代码块,如果静态代码块有多个,JVM将按照他们在类中的顺序依次执行他们,每个代码块只会执行一次。他常常在类启动之前初始化一些值。

private static Integer age;

static{
   
    age = 18;
}
初始化时机

对于被static修饰的变量、方法块和方法的时机。


/*子类*/
@Slf4j
public class ChildStaticClass  extends ParentStaticClass{
   
    public ChildStaticClass() {
   
      log.info("子类构造方法初始化...");
    }

    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值