java多线程04----------final和static
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的更多相关文章
- 理解Java中的final和static关键字
回顾这两个关键字前,先考虑一个问题: Static变量存储在JVM中的位置,或者说static变量是如何被加载的? JVM会把类的静态方法和静态变量在类加载的过程中读入方法区(Method Area) ...
- java中的final与static
许多程序设计语言都有自己的办法告诉编译器某个数据是"常数".常数主要应用于下述两个方面: (1) 编译期常数,它永远不会改变 (2) 在运行期初始化的一个值,我们不希望它发生变化 ...
- [转] Java中的final、static、this、super
final 关键字 final关键字主要用在三个地方:变量.方法.类. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类型的变量,则在对其初始化之后便 ...
- Java基础之final、static关键字
一.前言 关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高.接口中.常量.静态方法等等.但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来.下面,对这两个关键字的 ...
- Java基础之final和static关键字
一.final 根据程序上下文环境,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的. ...
- Java中的final和static
final final可以用在类.方法.变量上. 1.final用在类上,表明当前类它不能被继承,没有子类. 2.final用在方法上,表明当前方法不能被override,不能被重写. 3.final ...
- Java学习(final、static关键词)
final关键词 概念:final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量.不能修饰构造方法. 特点: 1.final修饰的类不可以被继承,但可以继承别的类 ...
- java 补充(final、static)
final 固定的 final 修饰类的时候,只能作为子类继承,不能作为父类. final 定义变量时,必须给成员变量赋值.------ 1.直接赋值 2.构造方法. final 修饰成员方法时 ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Java多线程系列--“JUC集合”04之 ConcurrentHashMap
概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...
随机推荐
- Linux异常体系之stubs_offset
转自 http://www.xuebuyuan.com/2208550.html 在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0x00000000,另一个是0xf ...
- LeetCode(173) Binary Search Tree Iterator
题目 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ...
- nRF52-PCA10040——Overview
Overview Zephyr applications use the nrf52_pca10040 board configuration to run on the nRF52 Developm ...
- URAL - 2065 Different Sums (思维题)
题意: 给n和k,让你用不小于 k 个不同的数字构成一个长度为n的序列,使得序列中不同的区间和的数目最小. n,k<=500 k-1个数填一些数字的一正一负,这样有些区间和为0. 剩下的都填0. ...
- Windows和linux(ubuntu)互传文件简便快捷的方法
现在很多开发和测试的工作环境都是Linux,但测试后期报告的处理一般都是在Windows下完成的,所以需要把结果拿到Windows下. 如果是同一台PC还好些(windows下安装linux的虚拟机, ...
- CDH4 journalnode方式手工安装手册之二
一. Hadoop配置修改 修改core-site.xml文件 <configuration> <property> ...
- Python之code对象与pyc文件(二)
上一节:Python之code对象与pyc文件(一) 创建pyc文件的具体过程 前面我们提到,Python在通过import或from xxx import xxx时会对module进行动态加载,如果 ...
- luogu3178 [HAOI2015]树上操作
裸题 #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...
- 初试webpack打包
第一次接触webpack,学习了如何用webpack打包,记录一下过程. 1.在项目根目录安装webpack $ npm install webpack --save-dev 2.新建一个webpac ...
- ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)
要实现键盘,鼠标对场景的控制,首先要帧监听,就是在每一帧的渲染前后对它进行操作.这里的操作没有用到缓冲区,只是简单的直接获取. 1.这些步骤和前面的一样,直接上代码,操作还是在createScene函 ...