并发编程系列文章:
初解线程池:http://ray-yui.iteye.com/blog/2072463
详解线程池:http://ray-yui.iteye.com/blog/2075311
并发数据类型:http://ray-yui.iteye.com/blog/2080454
并发数据结构:http://ray-yui.iteye.com/blog/2084202
volatile:http://ray-yui.iteye.com/blog/2231474
判断线程安全:http://ray-yui.iteye.com/blog/2232931
实现线程安全:http://ray-yui.iteye.com/blog/2234688
volatile是一个被遗忘的关键字,在开发串行程序当中不会使用,而并行程序当中也不能代替锁(synchronized)(大多数情况下).但开发当中若然巧妙使用volatile,将避免不必要的加锁操作.
在并行程序开发当中操作变量需要注意两个问题.一个是安全性(正确性),另一个是内存可见性.当多个线程同时操作一个变量时,可以使用锁来保证操作变量的安全性和内存可见性,但若然当操作结果不需要依赖上一个结果,而仅仅只作为一个标识,则可以使用volatile来代替加锁.
以下代码不需要线程安全性,仅仅将变量作为退出线程的标识.但遗憾的是该程序有可能永远无法退出.
public class Application {
private static boolean flag = false;
private static int number;
public static void main(String[] args) throws InterruptedException {
new Test().start();
Thread.sleep(1000);
number = 50;
flag = true;
}
private static class Test extends Thread {
@Override
public void run() {
while (!flag) {
System.out.println(number);
}
}
}
}
volatile是Java提供的一种稍弱的同步机制,用来增大被修饰变量的内存可见性,从而达到将变量的更新操作通知到其他线程.若然访问volatile修饰的变量将会到主存(堆)当中获取.而不会读取线程的变量副本,被修饰的变量亦不会被缓存到寄存器或者对其他处理器不可见的地方.volatile只承诺被修饰变量的内存可见性,而不保证变量是否被正确的操作,因此volatile从语义或使用上都不能替代锁.因此当遇到以下场景时,可考虑使用volatile.
1.对变量的操作不依赖变量的当前值.
2.能确保只有一个线程对其进行修改.
3.修改变量不影响程序正确性.
总结:
在某些情况下使用volatile能避免不必要的加锁操作,尽管有更多或更好的方案代替volatile,但亦可以了解这个关键字的使用方法,必要时多一套解决方案.而在性能方面对比加锁的线程挂起/恢复开销,每次访问变量都需要去主存获取的volatile可以说是忽略不计.
分享到:
相关推荐
### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...
" Java并发编程volatile关键字的作用 " Java并发编程中的volatile关键字是Java语言中提供的一种轻量级的同步机制,主要用于实现可见性和禁止指令重排。volatile关键字可以使变量在多线程之间可见,确保变量的最新值...
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
│ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
8. **JVM内存模型与并发**:JVM内存模型对并发编程有直接影响,书中会阐述Java内存模型(JMM)的概念,以及volatile关键字的作用。 9. **并发编程最佳实践**:最后,书中会提供一些并发编程的最佳实践,帮助读者...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...
Java中的`volatile`关键字在多线程并发编程中扮演着重要的角色,但常常被误解。在J2EE环境中,程序员可能对其有更多了解,而在Android开发中,它并不那么常见,因此导致了一些开发者对它的误用。理解`volatile`的...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
Java内存模型(JMM)是并发编程中的核心概念,书中会详细解析其工作原理,包括volatile、final关键字的作用,以及 Happens-Before 规则。理解JMM有助于编写出正确且高效的并发代码。 源码分析部分,书中的附带源码...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
【并发编程】是计算机科学中的一个重要概念,尤其是在多任务处理和高效系统设计中不可或缺。并发编程的关键在于如何管理和协调多个线程或进程的执行,以充分利用计算资源,提高系统的响应速度和吞吐量。 【JMM...
本资源包含三本权威的Java并发编程书籍:《Java并发编程实践》、《java并发编程的艺术》以及Brian Goetz的文字版《Java并发编程实践》。 首先,我们来看《Java并发编程实践》(Java Concurrency in Practice)这...
Java并发编程中的`volatile`关键字是一个非常重要的概念,它用于解决多线程环境下的数据同步问题。`volatile`关键字提供了两种关键特性: 1. **保证可见性**:当一个线程修改了`volatile`变量,这个修改对于其他...
在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...
Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和编程时应遵守的内存交互操作。JMM的目的是在保证并发编程的正确性的同时,最大化CPU利用率。 并发和并行是两个密切相关的概念,也是...