Volatile,JAVA5之后出现的多线程同步读锁属性修饰符。
让我们看一下一个单例的例子:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 public class Singleton{
2 private static volatile Singleton _instance; //volatile variable
3
4 public static Singleton getInstance(){
5
6 if(_instance == null){
7 synchronized(Singleton.class){
8 if(_instance == null)
9 _instance = new Singleton();
10 }
11
12 }
13 return _instance;
14
15 }
16
17
18 Read more: http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz3pfcVVsK1
19
很明显,我们可以得出两个结论
1 instance只初始化一次
2 instance第一次初始化会比较慢
想想,如果我们不用
volatile ,会有什么结果。每个线程都会有一个线程变量区,彼此并不相通。当有A,B两个线程同时走到第6步,如果线程A得到锁,完成初始化instance之后,线程B同样进入第8步,这样其实是两个instance的。
通过加上volatle,线程B会把instance变量回写到主内存。如果其它线程进来,instance肯定就不是空值了
分享到:
相关推荐
在C语言中,`volatile` 是一个非常重要的关键字,但却常常被初学者忽视。它作为一个类型修饰符,用于指示变量的值可能在编译器无法察觉的情况下发生变化,从而避免编译器进行某些优化可能导致的错误。`volatile` 的...
此外,了解x86架构的CPU缓存系统有助于理解volatile的实现。x86处理器有L1、L2、L3缓存,以及多核之间的缓存一致性协议(如MESI协议),这些机制共同保证了多核环境下volatile变量的正确传播和一致性。 总结来说,...
### volatile变量详解 #### 一、volatile的基本概念与作用 `volatile`是一个在编程语言中常用...了解如何正确使用`volatile`是非常必要的,特别是对于那些经常需要处理硬件中断、多线程编程的嵌入式系统开发者而言。
这里的`volatile`关键字表明,虽然我们两次访问了`*ptr`,但由于其值可能在任何时刻被硬件改变,因此每次都需要从内存中重新读取。如果不使用`volatile`,编译器可能会优化代码,只读取一次值并将其存放在寄存器中,...
Volatile是C语言中的一个类型修饰符,用于告诉编译器该变量可能会在程序的控制之外被改变,从而...通过以上知识点,我们可以了解到volatile在保证程序正确性方面的关键作用,以及如何在实际编程中正确使用volatile。
首先,我们需要了解什么是“volatile”。在C语言标准中,“volatile”是一个类型修饰符,它告诉编译器对使用该类型变量的操作不应进行优化。这种变量通常是用来表示那些可能在程序外部(比如硬件设备、中断服务程序...
在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的数据从较慢的主存复制到更快的CPU缓存中。这种做法虽然提高了性能,但也...
在IT行业中,volatile关键字在编程,尤其是嵌入式系统和多线程编程中扮演着重要的角色。本篇文章将深入探讨volatile关键字的作用,并结合GD32F303单片机的使用场景,来阐述它在实际开发中的应用。 首先,volatile...
这意味着学习者可以通过阅读代码和注释,了解 `volatile` 在实际编程中的用法,并且有文字解释可以帮助理解其背后的理论。这对于初学者来说是非常宝贵的资源,因为理论与实践相结合的学习方式往往能更有效地掌握知识...
了解 `const`、`extern`、`static` 和 `volatile` 的基本概念后,在实际编程过程中可以根据需求灵活运用它们: - **安全性**:通过 `const` 确保某些数据不被意外修改,提高代码的稳定性。 - **内存管理**:利用 `...
要深入理解`volatile`的底层实现机制,我们需要先了解计算机系统中的缓存一致性协议。现代多核处理器系统中,每个处理器都有自己独立的缓存,而这些缓存与主内存之间的数据一致性问题是必须解决的关键问题之一。 ##...
下面我们将深入探讨`volatile`关键字的原理、使用场景以及与`synchronized`的区别。 一、`volatile`关键字的语义分析 1. **保证可见性**:当一个线程修改了`volatile`变量的值,其他所有线程都能立即看到这个变化...
`volatile`的原意在英文中有“易变的”或“暂态的”之意,在C语言中,当我们将一个变量声明为`volatile`时,我们告诉编译器不要对这个变量进行任何优化,即使该变量看起来未被程序修改。这是因为`volatile`变量可能...
《Volatile:一款轻量级Web框架的探索与解析》 在编程领域,开源项目扮演着至关重要的角色,它们...通过对"core-master"的深入研究,我们可以更全面地了解Volatile的工作原理,从而更好地利用它来构建我们的Web项目。
最后,了解并发编程不仅需要掌握`volatile`、`ThreadLocal`等基础概念,还需要理解Java内存模型、锁机制(如`synchronized`关键字)、原子类(如`java.util.concurrent.atomic`包中的类)以及时间控制(如`TimeUnit`...
首先,我们了解`volatile`的基本含义。在Java中,当一个变量被声明为`volatile`时,编译器会确保对该变量的所有读写操作都是原子性的,并且确保所有线程看到的该变量的值是最新的。这意味着,如果一个线程修改了`...
在深入理解volatile的关键特性之前,我们需要先了解Java内存模型(JMM,Java Memory Model)的基本概念。 JMM规定,每个线程都有自己的工作内存,用于存储从主内存中复制的共享变量副本。线程执行运算时是基于工作...
`volatile` 是 C/C++ 语言中的一个关键字,用于修饰变量,表明该变量的...然而,仅仅使用 `volatile` 并不能解决所有的并发问题,开发者还需要了解更多的并发控制机制,如互斥锁、条件变量等,以编写出安全可靠的代码。
为了理解volatile如何实现这些特性,我们需要了解一下缓存一致性协议。在多核处理器系统中,每个处理器都有自己的缓存,MESI协议(Modified, Exclusive, Shared, Invalidated)是常见的缓存一致性协议。当一个线程...
当涉及多线程和并发时,了解CPU的存储层次(如寄存器、L1、L2、L3缓存和主内存)以及它们如何影响数据的一致性和性能是至关重要的。 在并发编程中,理解这些硬件特性可以帮助开发者优化代码,利用多核CPU的优势,...