static、final、volatile笔记

一、关键字final
     Java关键字final有“这是无法改变的”或者“终态的”含义。
1、final类:不能被继承,其类的成员方法不能被覆盖。
2、final方法:如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法,final方法能被继承。使用final方法的原因:
    a)把方法锁定,防止任何继承类修改它的意义和实现
    b)高效,编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
3、final变量:用final修饰的成员变量表示常量,一旦设定了值就不会再改变。定义final变量时,必须要为变量赋初始值。
4、final参数:当函数参数为final类形时,可以读取使用该参数,但是无法改变改参数的值。

二、关键字static
     static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块:
static {
        int b = 1;
        int c = 2;
        //可以在此初始化方法。
    }

       用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。
1、被static修饰的成员变量(也叫静态变量)和成员方法(也叫静态方法)独立于该类的任何对象,它不依赖于类特定的实例, 被类的所有实例共享
2、static变量:
    a)被static修饰的变量:叫静态变量或类变量。静态变量在内存中只有一个拷贝,JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问。

private static int a ;


    b)没有被static修饰的变量:叫实例变量。每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

private int a;


static final用来修饰成员变量和成员方法,可简单理解为“全局常量”

private static final String str = "Hello World";//全局常量



三、关键字Volatile
当一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值(线程的可见性)。
1、volatile无法保证对变量的任何操作都是原子性;但能在一定程度上保证有序性。
2、volatile能保证可见性和禁止重排序
3、 volatile原理:加入volatile关键字时,会多出一个lock前缀指令(相当于一个内存屏障)。内存屏障会提供3个功能:
a)它确保指令重排序时不会把其后面的指令排到内存屏障前面的位置,也不会把前面的指令排在内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成。
b)它会强制将对缓存的修改操作立即写入到主存中。
c)如果是写操作,它会导致其他cpu对应的缓存行无效。
4、只有当某个操作具备原子性时,才能保证使用volatile关键字的程序在并发时能够正确执行。


四、happens-before原则(先行发生原则)
1、程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作。
2、锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。
3、Volatile变量规则:对一个变量的写操作先行发生于对这个变量的读操作。
4、传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则操作A先行发生于操作C。
5、线程启动规则:Thread对象的start()先行发生于此线程的每一个动作。
6、线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。
7、线程终结规则:线程中所有操作都先行发生于线程的终止检测,可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行。
8、对象终结规则:一个对象的初始化完成先行发生于他的fianlize()方法的开始。


参考:hhttp://www.cnblogs.com/dolphin0520/p/3920373.html

猜你喜欢

转载自itxiaojiang.iteye.com/blog/2284908
今日推荐