`

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
分享到:
评论

相关推荐

    JAVA学习笔记.pdf

    其中,修饰符可以是static、final、transient、volatile等,类型是变量的数据类型,变量名是变量的名称,初始值是变量的默认值。 成员变量的修饰符有四种:static、final、transient、volatile。static表示成员变量...

    java 程序设计笔记

    域变量可以被public、private、static修饰,局部变量不可以,但都可被 final 修饰。 - 参数传递:参数都是按值传递的,但对于引用型变量,传递的值是引用值,所以方法中对数据的操作可以改变对象的属性。 - 动态...

    java笔记.docx

    private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { ...

    单例模式学习笔记

    private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { ...

    17-Java单例模式的学习笔记1

    private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 这种实现方式在类加载时即完成了实例化,因此...

    单例设计模式--浅浅笔记

    private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { ...

    【课堂笔记】单例模式详解

    private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { ...

    剑指Offer(第二版)笔记.docx

    private volatile static Singleton5 instance; private Singleton5() {} public static Singleton5 getInstance() { if (instance == null) { synchronized (Singleton5.class) { if (instance == null) { ...

    java学习笔记

    ### Java学习笔记——设计模式与基础概念解析 #### 一、设计模式概述 设计模式是在软件开发过程中,针对常见的问题提出的经过验证的解决方案。这些模式是开发者们在长期实践中不断提炼和完善的结果,能够帮助...

    JAVA上课笔记class_04

    private static volatile Singleton instance; // 使用 volatile 确保多线程环境下的可见性 private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized ...

    我自己的个人的编程笔记

    private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` - **双重检查锁定(DCL)**:使用`synchronized`关键字...

    很好的JAVA课堂笔记

    ### JAVA课堂笔记精要 #### JVM与Java执行过程 Java程序的执行依赖于JVM(Java虚拟机),它是运行Java字节码的标准平台。当Java程序执行时,`.java`源代码文件首先被编译成`.class`文件,然后由JVM解释执行。JVM在...

    计算机科学 Java核心编程笔记

    * 非访问修饰符:final、static、abstract、transient、synchronized、volatile、native 五、Java 流程控制 * 条件语句:if、else * 循环语句:do、while、for * 跳转语句:break、continue、return 六、Java ...

    Android核心知识点笔记V2020.03.30.pdf

    static关键字用于定义静态变量或静态方法,final用于定义常量或修饰方法、类,表示最终状态,不可被继承或修改。 1.3 String、StringBuffer、StringBuilder 这三种类型都是字符串操作的类,String是不可变类,而...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    11.1.5 synchronized与volatile 334 11.1.6 等待与通知 345 11.2 并行api 349 11.2.1 lock、readwritelock与condition 349 11.2.2 使用executor 357 11.2.3 并行collection简介 370 11.3 重点复习 373 ...

    计算机Java核心编程笔记

    Java修饰符包括public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native等。 七、Java流程控制 Java流程控制语句包括package、import、throw、throws、...

    计算机科学与计算java核心编程笔记

    * 修饰符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native。 四、动作和保留字 * 动作:package、import、throw、throws、extends、implements...

    Java笔记Java笔记Java笔记

    修饰符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native 是 Java 语言中的修饰符关键字。这些关键字用于修饰类、方法和变量的访问权限和行为。 ...

    计算机核心java编程笔记

    * volatile * native 六、Java 动作 Java 语言中的动作可以用于控制程序的执行流程,例如: * package * import * throw * throws * extends * implements * this * super * instanceof * new 七、Java 保留字 ...

Global site tag (gtag.js) - Google Analytics