码迷,mamicode.com
首页 > 编程语言 > 详细

java多线程04----------final和static

时间:2018-07-15 19:31:42      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:没有   并且   对象创建   实现   构造函数   size   构造方法   引用数据类型   类成员   

final和static关键字

final关键字

  1.final关键字在单线程中的特点:   

    1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次。
    2)final修饰的类成员变量,可以在三个地方进行赋值:显示初始化、构造代码块和构造方法,并且仅能赋值一次。
         3)final修饰的局部变量,必须在使用之前进行显示初始化(并不一定要在定义是赋值),仅能赋值一次。
     总之,final修饰的静态成员必须在类加载完之前进行赋值,final修饰的成员变量,必须在对象创建完之前进行赋值。
     补充:final修饰的基本数据类型不能被重新赋值,final修饰的引用数据类型,引用类型的地址不能改变,引用类型的内部属性可以改变。

    2. final在多线程的作用  

  由于重排序的作用,一个线程读取到一个对象的引用时,该对象可能尚未初始化完毕,即这些线程可能读取到该对象字段的默认值而不是初始值。
final关键字具有特殊的作用:当一个对象发布到其他线程的时候,该对象的所有final字段都是初始化完成的,即其他线程读取到的都是相应字段的初始值而不是默认值。而非final字段就没有这种保障。
对于final修饰的引用类型的字段,该字段还能保障该字段所引用的对象 初始化完毕。

  这种机制是通过禁止重排序实现的:

    对于final变量的写:禁止final域的写重排序到构造方法之外,即得到一个对象的引用时,其内部的final域必定已被初始化完毕。

    对于final域的读:禁止初次读该对象的引用与读该对象包含的final域进行重排序。

    这两种重排序都是底层是通过内存屏障实现的,编译器会在final域写之后,构造函数执行完之前插入一个storestore屏障,在读final域之前插入一个loadload屏障。

static关键字

  static关键字能够保证一个线程即使在未使用其他线程同步机制的情况下也总是可以读到一个类静态变量的初始值,但这种可见性的保障仅限于 初次读取该变量

  

 

  

java多线程04----------final和static

标签:没有   并且   对象创建   实现   构造函数   size   构造方法   引用数据类型   类成员   

原文地址:https://www.cnblogs.com/gdy1993/p/9314116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!