Java 理论与实践: 正确使用 Volatile 变量
volatile 变量使用指南
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
另附
双重检查加锁 单例模式
public class Singleton {
/**
* volatile关键词确保:当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量
*/
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {//检查实例,如果不存在就进入同步区块
synchronized (Singleton.class) {//注意,只有第一次才彻底执行这里的代码
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
上面的单例模式写法可以大大减少getInstance的时间消耗!
“急切”单例模式
public class Singleton {
/**
* volatile关键词确保:当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量
*/
private volatile static Singleton uniqueInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
分享到:
相关推荐
Java的Volatile实例用法及讲解 Java的Volatile关键字是Java语言中一种特殊的修饰符,在多线程编程中发挥着重要作用。Volatile关键字主要在可见性中发挥作用,保证了变量的可见性,使得变量的变化可以被其他线程立即...
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized ...
在上述示例中,`increaseCounter()`方法就存在这个问题,即使使用了volatile,也不能保证线程安全。 4. **VolatileData类示例**:在给出的示例代码中,`VolatileData`类的`counter`变量被声明为volatile。这使得`...
总结来说,`volatile`变量在Java多线程编程中起着关键作用,它简化了同步代码,提高了效率,但使用时需谨慎,因为它并不保证所有的线程安全需求。正确理解和使用`volatile`,可以帮助开发者编写出更高效、更可靠的...
例如,在`VolatileTest3`类中,如果没有使用`volatile`修饰`isShutDown`,那么在`shutdown`方法将`isShutDown`设置为`true`之后,其他线程可能仍然继续执行`doWork`方法,因为他们可能没有看到这个更新。使用`...
### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...
Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...
1. `volatile`的基本用法: 当一个变量被声明为`volatile`时,编译器会知道这个变量的值可能在运行时被外部不可预见的因素(比如硬件中断、多线程等)修改。因此,每次访问`volatile`变量时,都会从内存中读取最新...
Java中的关键字volatile详解 一、volatile关键字原理 在Java中,volatile关键字经常用来修饰变量。volatile关键字的作用是使变量在多个线程之间可见。volatile关键字可以保证变量的可见性,但不能保证变量的原子性...
1. **使用范围**:`volatile`只能修饰变量,而`synchronized`可以修饰方法和代码块。 2. **原子性保证**:`volatile`无法保证操作的原子性,如`i++`操作,而`synchronized`可以确保整个同步块内的操作是原子性的。 ...
总的来说,`volatile`关键字在Java并发编程中扮演着重要角色,合理使用它可以有效提高代码的并发性能并减少同步带来的开销。但同时,也应清楚其限制,避免在需要原子性保障或更严格一致性的场景中误用。在设计并发...
为了确保原子性,可以使用`synchronized`块或Java并发包(java.util.concurrent)中的原子类,如`AtomicInteger`。原子类提供了原子操作的方法,可以在多线程环境下安全地进行类似自增的操作,而无需担心数据一致性...
Java并发编程中的`volatile`关键字是一个非常重要的概念,它用于解决多线程环境下的数据同步问题。`volatile`关键字提供了两种关键特性: 1. **保证可见性**:当一个线程修改了`volatile`变量,这个修改对于其他...
当使用 volatile 变量而非锁时,某些习惯用法(idiom)更加易于编码和阅读。此外,volatile 变量不会像锁那样造成线程阻塞,因此也很少造成可伸缩性问题。 在某些情况下,如果读操作远远大于写操作,volatile 变量...
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...
例如,在`ThreadSave`类的`inscane()`方法中,`j++`操作不是原子性的,即使使用了`volatile`关键字,多个线程同时增加`j`的值时,仍然可能出现数据不一致的问题。在这种情况下,通常需要使用`synchronized`块或`...
Java基础:volatile详解 Java基础:volatile详解问:谈谈你对volatile的理解? volatile是Java虚拟机提供的轻量级的同步机制,它有三个特性:保证可见性、不保证原子性、禁止指令重排。 1、volatile保证可见性 ...
在深入理解volatile时,我们需要考虑JVM内存模型、处理器缓存以及底层的汇编指令,这有助于我们更好地理解和使用volatile,解决并发编程中的问题。在实际开发中,合理利用volatile可以避免不必要的锁同步,提升程序...
Java 关键字 volatile 的理解与正确使用 Java 语言中关键字 volatile 被称作轻量级的 synchronized,与 synchronized 相比,volatile 编码相对简单且运行时的开销较少,但能够正确合理地应用好 volatile 并不是那么...