Java 关键字作用备忘
来源:互联网 发布:哪个软件有汉仪丫丫体 编辑:程序博客网 时间:2024/04/30 16:47
=========================================================================================================================
Volatile:
一旦一个共享变量被volatile修饰后,那么就具备了两层语义:
1、保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了这个变量的值,这新值对其他线程来说是立即可见的。
2、禁止进行指令重排序。
volaitle保证共享变量修改的可见性:
线程1和线程2 volatile共享变量var,当线程1更改变量var后,会使得线程2关于变量var的缓存行失效,让线程2去主存中读取var的值。
volatile不保证变量操作的原子性:
如果线程1从主存中读取了变量var后,还没来得及更新var的值就被阻塞了,此时线程2得到了执行,去主存中读取了var的值,并更新了值。然后
当线程再会到线程1执行时,线程1更新值时,var的值已经不是最新的了。
volatile保证指令指令有序性:
volatile关键字禁止指令重排序有两层意思:
1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;
2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。
volatile的原理和实现机制
前面讲述了源于volatile关键字的一些使用,下面我们来探讨一下volatile到底如何保证可见性和禁止指令重排序的。
下面这段话摘自《深入理解Java虚拟机》:
“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”
lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2)它会强制将对缓存的修改操作立即写入主存;
3)如果是写操作,它会导致其他CPU中对应的缓存行无效。
volatile声明的共享变量不一定是线程安全的(因为不保证操作原子性)。
* 变量的写操作不依赖变量当前值,那么此volatile变量是线程安全的。否则,是线程不安全的。
=========================================================================================================================
Transicent:
关闭某个域的序列化。即对象中的此域不参加对象的序列化。
=========================================================================================================================
Native:
=========================================================================================================================
Interface中的 default 方法:
Java 8中新加了default关键字特性,旨在兼容优化、升级Interface。
在Java 8之前,若在Interface中增加了方法,所有implements此Interface的类都需要配合、实现新增的方法。也就造成了Interface一旦发布,就
不能新增方法的困扰。
default方法允许在Interface中增加接口的实现。而且implements此Interface的类可以覆盖、重写此方法。
当类implements的两个Interface中都有同一个名字的方法,那么类必须Override此方法,可以在Override的方法里选择调用某一个Interface的方法。
=========================================================================================================================
final :
final用于声明属性、方法和类,分别表示属性不可变、方法不可被覆盖、类不可被继承。
final 声明的变量,表示变量的引用的对象地址不能被改变,而被应用对象内部的值可以被改变。
final 声明的参数,表示参数在方法内部不能被修改。
=========================================================================================================================
static:
static 成员变量:表示是类的变量,不是对象的变量。此种变量在类加载到内存时就在内存中分配了空间并存储,可以直接通过类名访问。
static 成员方法:与static成员变量类似,可以直接通过类名访问。
static 代码块 :在类中独立于成员变量和成员函数的代码块,JVM在加载类时会执行static代码块,如果有多个代码块,JVM将会按顺序执行。需要
注意的是:static代码块只会被执行一次。
static 内部类 :static内部类是指被声明为static的内部类,它可以不依赖于外部实例对象而被实例化。
- Java 关键字作用备忘
- Java关键字及其作用:
- Java关键字及其作用
- Java关键字及其作用
- Java关键字及其作用
- Java关键字及其作用
- Java关键字及其作用
- java关键字及其作用
- Java关键字及其作用
- JAVA关键字极其作用
- Java关键字及其作用
- Java关键字及其作用
- Java关键字及其作用
- Java-关键字及作用
- Java关键字及其作用
- java-final关键字作用
- JAVA关键字及作用
- JAVA关键字及作用
- Java 程序员们值得一看的好书推荐
- nutz的框架NutzDao自定义SQL
- 利用java反射调用类及父类的的私有方法
- 第13届浙江省赛D题POJ3939
- 小何讲Linux: Linux中文件及文件描述符概述
- Java 关键字作用备忘
- PMP认证仅是基础,易迪思项目管理学院八大实战课程为您服务
- npm使用介绍
- 计算机网络——运输层
- 搭建vs2010 boost开发环境
- Spring Security 4 退出 示例(带源码)
- 编写高质量的代码——从命名入手
- android 中aidl
- Tomcat启动报 unrecognized windows sockets error: 0: JVM_Bind解决方法