static总结:

1、修饰静态变量,通过类名.变量名,不需要实例化对象,属于静态资源,所有类实例共享

2、修饰静态方法,通过类名.方法,不需要实例化对象,属于静态资源,所有类实例共享

3、静态代码块,类初始化的时候引用,只执行一次

4、静态资源的加载顺序,按照定义顺序加载,并且按照父类静态代码块->子类静态代码快顺序执行

5、静态代码块对应定义在它之后的变量可以赋值,但不能访问

6、import static 资源,建议少用,影响代码的可读性

注意:静态方法内不能有非静态资源,非静态方法类可以引用静态资源,static修饰的静态变量不可序列化(原因:静态变量属于类变量,不属于实例变量)

 

final总结:

1、修饰引用:

a、修饰基本数据类型,则该数据为常量,值无法修改

b、修饰引用数据类型,如对象、数组,则该对象、数组本身可以修改,但指向该对象、数组的引用不可修改

c、修饰类的引用,该引用必须被当场赋值

2、修饰方法:最终的方法,不可被子类重写,但可以继承

3、修饰类:简称断子绝孙类,不可被继承。如String

 

transient总结:

1、如果想让对象中的某个成员变量不被序列化,可以在成员变量上加上transient关键字

2、只能修饰变量,不能修饰方法和类

3、用户自定义的类变量,如果被transient修饰需要实现serializable接口

4、银行卡、密码等数据适合用transient修饰

注意:本地变量(native)不能被transient修饰

 

volatile总结:

volatile可见性是通过汇编加上Lock前缀指令,触发底层的MESI缓存一致性协议来实现的,MESI缓存的最小单元是缓存行,当共享的数据长度超过一个缓存行的长度,MESI协议就会失效,会触发总线加锁机制

1、保证内存可见性

2、禁止指令重排序:如单列模式双重锁,并发的情况下会出现指令重排序

3、不能保证原子性

 

synchronized总结:

保证同一时刻只有一个线程可以执行某个方法或代码块,也可以保证一个线程的变化可见性和共享变量的内存可见性可以代替volatile

1、方法

a、实例方法,锁的是类的实例对象

b、静态方法,锁的是类对象

2、代码块

a、实例对象,锁的是类的实例对象

b、class对象,锁的是类对象

c、任意实例对象中的变量参数,锁的的是实例对象

原理:方法级的同步是隐式的,无需通过字节码指令控制(monitorenter,monitorexit两个指令),取而代之的是字节码中会出现ACC_SYNCHRONIZED标识,指明该方法为同步方法。