volatile修饰符】的更多相关文章

volatile 修饰符,用于多线程同步 volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值.而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值. 一个 volatile 对象引用可能是 null. 使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行.(出处:双重校验锁实现对象单例(线程安全))…
今天学java特性时,发现了volatile修饰符,这个修饰符修饰的变量告诉java编译器忽略优化机制,这样的优势是: java优化后,寄存器会缓存内存里的变量,另一个线程修改这个变量的内存时,不会同步到另一个线程变量的寄存器,加上volatile修饰符后,java不会增加寄存器缓存机制,这样会让变量直接读写内存,达到多线程协调作用.总结一句话为可见性. 应用场景: 1.多线程变量读取时,多个线程可以都读内存,另一个线程修改变量内存,而本线程还在读取寄存器中的变量,导致死循环 2.单例时使用,在…
在java语言中:为了获得最佳速度,同意线程保存共享成员变量的私有拷贝.并且仅仅当线程进入或者离开同步代码块时才与共享成员变量的原始值进行对照. volatilekeyword的作用就是提示vm:对于这个成员变量不能保存它的私有拷贝.而应直接与共享变量进行交互. 被volatile修饰符修饰的成员变量在每次被线程訪问时.都强迫从共享内存中重读该成员变量的值. 并且,当成员变量发生变化时.又强迫线程将变化了的值写回共享内存,这样在不论什么时刻.两个不同的线程总是看到某个成员变量的同一个值.这样当多…
STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay;  这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下 /* IO definitions (access restrictions to peripheral registers) */ #ifdef __cplusplus   #define   __I     volati…
STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay; 这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下 /* IO definitions (access restrictions to peripheral registers) */ #ifdef __cplusplus #define   __I     volatile…
一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写. double 和 long 都是 64 位宽,因此对这两种类型的读是分为两部分的,第一次 读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的.volatile 修复符的另一个 作用是提供内存屏障(memory barrier),例如在分布式框架中的应用.简单的 说,就是当你写一个 volatil…
Volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值.而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值. 一个volatile对象引用可能是null. (1)Java程序代码 package niukewang; public class volatile_Test { public static void main(String args[]) { MyRunnable r = n…
package ThreadABC; public class MyThread extends Thread { public static int status = 0; @Override public void run() { while (true) { synchronized (MyThread.class) { if ("A".equals(Thread.currentThread().getName()) && status < 30 &…
转载请注明出处:     volatile用处说明     在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要. 在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致. 要解决这个问题,就需要…
volatile用处说明     在JDK1.2之前,java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要. 在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致. 要解决这个问题,就需要把变量声明为volatil…
volatile用处说明 ​ 在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要. 在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致. 要解决这个问题,就需要把变量声明为volatile(…
Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] argum…
转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主要有两类修饰符: 访问修饰符:default, public , protected, private 非访问修饰符:final, abstract, strictfp 修饰符一般使用在一个语句的前端,例: public void Pig{ int a = 1; protected String b…
Synchronized 修饰符 Synchronized 关键字声明的方法同一时间只能被一个线程访问.Synchronized 修饰符可以应用于四个访问修饰符. 实例 public synchronized void showDetails() { ....... } Transient 修饰符 序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量. 该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型. 实例 public transi…
修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] arguments) { // 方法体 } 访问控制修饰符 Java中,可以使用访问控…
所以我以此主题写了这篇文章.这也是一个可用于测试你的计算机科学知识的面试问题. Java修饰符是你添加到变量.类和方法以改变其含义的关键词.它们可分为两组: 访问控制修饰符 非访问修饰符 让我们先来看看访问控制修饰符,以及如何使用它们的一些代码示例. 修饰符 说明 public 公共可见 private 类可见 protected 包和所有的子类可见 那么如何使用这三种访问控制修饰符呢?请看下面两个类.请忽略此处代码的低效,因为这是教程. 创建一个名为project/mypackage/Pers…
1. 访问修饰符. 指定声明的类型和类型成员的可访问性. (1) public:是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. (2) private:是一个成员访问修饰符.私有访问是允许的最低访问级别.私有成员只有在声明它们的类和结 构体中才是可访问的. (3) internal:是类型和类型成员的访问修饰符.只有在同一程序集的文件中,内部类型或成员才是可访问的. (4)protected:是一个成员访问修饰符.受保护成员在它的类中可访问并且可由派生类访问…
写在前面 今天下午一个同事问「register」关键字是什么作用?噢,你说的是「register」啊,它的作用是……脑袋突然断片儿,我擦,啥意思来着,这么熟悉的陌生感.做C语言开发时间也不短了,不过好像没有用到过「register」,但作用还是知道的,一下子想不起来了,一万个草泥马飞奔过来. 其实C语言中除了register外,还包含常见的const.static.volatile.auto.extern等修饰符,现在一起再总结一下好了. register 修饰符 register,寄存器变量,…
一.标识符 1.概念:标识符好比人和物的姓名,java中标识符就是类.对象.方法.变量.接口和自定义数据类型等等的名字. 2.规则: (1)首位不能是数字. (2)标识符对大小写敏感. (3)不可以是java中的关键字和保留字. (4)标识符字间不能有空格. (5)可由数字,字母和下划线(_),美元符号($)或人民币符号(¥)组成,中文也行,很国际化. (6)没有长度限制. (7)不能是true.false和null. 3.命名约定: (1)类和接口名:每个字的首字母大写,含有大小写.例如,My…
Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 访问控制修饰符 访问控制修饰符用来修饰类和类内部的成员变量和成员方法,来确定其访问权限 类的访问控制修饰符只有两种 default 和 public default (即缺省,什么也不写): 只在同一包内可见.不能引入其包中 类A为default,当类A和类B位于同一个包内,那么可以在类B中直接使用new A() 来创建类A的实例,而不需要先引入类A 当类A和类B不位于同一个包中,则在类B文件中无法引入类A,更无法在类B…
访问修饰符 default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符.使用对象:类.接口.变量.方法. private : 在同一类内可见.使用对象:变量.方法. 注意:不能修饰类(外部类) public : 对所有类可见.使用对象:类.接口.变量.方法 protected : 对同一包内的类和所有子类可见.使用对象:变量.方法. 注意:不能修饰类(外部类). 默认访问修饰符 使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的.接口里的变量都隐式声明为 public…
JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1    什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Demo,就是我们定义的类名.类名就属于标识符的一种. 标识符除了应用在类名上,还可以用在变量.函数名.包名上.(要求同学们先记住,以后会详细见到这些). 1.2    标识符必须遵循以下规则 标识符由26个英文字符大小写(a~zA~Z).数字(0~9).下划线(_)和美元符号($)组成. 不能以数字开头…
前言:Java内功心法之Java 修饰符,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protec…
Java 修饰符 Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(Strin…
浅析java修饰符之public default protected private static final abstract 一   修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 二   分类(大致分两类) 1.访问修饰符,包括:public default protected private 2.非访问修饰符,包括:static final abstract 三 访问修饰符——Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权…
本文记录在学习Java语言过程中,对碰到的修饰符的一些疑问,在这里具体的拿出来详细学习和记录一下,以作后续参考和学习. Java修饰符 Java语言提供了很多修饰符,但主要分两类: 访问修饰符 非访问修饰符 修饰符是用来定义类,方法或者变量的,放在语句的最前端. public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int…
一.Java 修饰符 1.1 访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符.使用对象:类.接口.变量.方法. private : 在同一类内可见.使用对象:变量.方法. 注意:不能修饰类(外部类) public : 对所有类可见.使用对象:类.接口.变量.方法 protected : 对同一包内的类和所有子类可见.使用对象:变量.方法. 注意…
修饰符 一般是放在定义类,方法,变量的最前端 访问控制修饰符 修饰符 当前类 同一包内 子孙类 其他包 public Y Y Y Y protected Y Y Y N default Y Y N N private Y N N N 感觉这个表格挺清晰的,至少我一眼就懂了 若是不加修饰符,貌似是默认public 非访问控制修饰符 static 修饰符,用来创建类方法和类变量. (静态变量的话,就是说无论被实例化多少次,静态变量只拷贝一次,而且不变 静态方法的话,不能使用类的非静态变量,而且不用n…
一.Java修饰符: Java语言提供了很多修饰符,主要分为以下两类:访问修饰符和非访问修饰符.修饰符用来定义类.方法或者变量,通常放在语句的最前端. 1.访问控制修饰符: Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问. Java支持4种不同的访问权限:我们可以可以通过以下表来说明访问权限:(1)public 意味着任何地方的其他类都能访问.(2)默认则是同一个包的类可以访问.(3) protected 表示同一个包的类可以访问,其他的包的该类的子类也可以访问.(4) p…
    Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符     修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className {   // ...}private boolean myFlag;static final double weeks = 9.5;protected static final int BOXWIDTH = 42;public static void main(String[]…