习惯了先举个例子,这个是我学习时遇到的问题。
volatile x = 0;
A,B俩个线程。
都做加一操作x=x+1。
输出结果A线程X=1, B线程X=1.(一种情况)
我自己期望出现的结果:1,2。我的理解是,当A线程改变了x的值,B会及时知道,然后做加一操作,那么等到结果一定是2。可是忘了加操作和赋值是2个操作,x=x+1并非原子性。
分析:
1,A,B线程均读到x=0
2,B做加一操作,等到结果为1,由于x=x+1是非原子性操作,所以此时未赋值给x
3,A做完加一操作,主内存中x的值此时为1。
4,由于volatile确保了可见性,所以此时B更新内存x值,此时B线程中x=1。
5,加操作完后应该赋值了,把1赋给x,所以此时B线程中x=1。
最后结果输出2个1。
可以从步骤上看到,加了volatile并不会像加了synchronized一样,一个线程执行完后,另一个线程再执行,所以volatile没有确保线程的有序性。A改变x值后,B重新读取x的值,这样就如同volatile定义一样,一个线程改变了共享变量,其它线程可见,亦可见性。
与未加volatile比,B线程是不会做第4步更新x值的操作。valatile确保线程的可见性,确保当共享变量改变时,其它线程可见。
由于volatile只确保了可见性,所以用到它的地方,一般是赋值操作,确保了得到的值是最新的值。
分享到:
相关推荐
《从汇编角度理解volatile》 volatile关键字在编程中扮演着重要的角色,它主要用于多线程编程和与硬件交互的场景。通常的理解是,volatile告诉编译器不要对某个变量进行优化,每次读取该变量时都直接从内存中获取,...
本文将深入探讨`volatile`关键字的基本概念、使用场景以及注意事项,并结合实际示例来帮助读者更好地理解和应用这一概念。 #### `volatile`关键字详解 在C语言中,`volatile`是一个类型限定符,用于告知编译器不要...
深入理解volatile关键字 volatile关键字是Java语言的高级特性,它可以保证可见性和禁止指令重排序,但是要弄清楚其工作原理,需要先弄懂Java内存模型。 保证可见性 volatile关键字可以保证可见性,即当一个线程...
Java 关键字 volatile 的理解与正确使用 Java 语言中关键字 volatile 被称作轻量级的 synchronized,与 synchronized 相比,volatile 编码相对简单且运行时的开销较少,但能够正确合理地应用好 volatile 并不是那么...
在C语言编程实践中,理解和正确使用volatile关键字是非常重要的。尤其是在涉及硬件交互或者并发编程时,对于保证程序的正确性和稳定性起着关键作用。尽管如此,在使用volatile时也要注意,它并不是万能的,比如它并...
Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。...在设计并发程序时,理解`volatile`的工作原理和限制,有助于编写出更加高效且线程安全的代码。
Java中的`volatile`关键字是多线程编程中一个非常重要的概念,它用于修饰变量,确保在并发环境下,多个线程可以正确地共享和同步数据。...理解和正确使用`volatile`,可以帮助我们编写出更加高效和可靠的多线程程序。
深入理解Java中的volatile关键字 Java中的volatile关键字是一个非常重要的概念,它不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。volatile关键字的主要作用是提供可见性、原子性和...
简单来说,volatile能够确保对共享变量的读写操作不会被指令重排序,从而避免了多线程环境下程序行为的不确定性。 内存屏障是实现Volatile可见性的重要机制之一。它确保在volatile字段的前后,所有的内存操作都必须...
本资料《深入探讨Java多线程中的volatile变量》将带你深入理解这个概念,全面解析其工作原理和实际应用。 volatile关键字在Java中主要用于解决多线程环境下的可见性和有序性问题。它确保了被volatile修饰的变量对...
4. 在某些特定场景下,如只涉及单个变量的简单赋值操作,volatile可以作为轻量级的synchronized来使用,因为它能保证赋值操作的原子性且不阻塞线程。 理解volatile的关键在于掌握Java内存模型。在Java中,所有变量...
volatile的使用需要谨慎,它并非简单的“易变”标志,而是确保变量状态的实时性和可见性的手段。在嵌入式系统中,理解并正确使用volatile是区分普通程序员和专业嵌入式系统程序员的关键技能。只有深入理解其背后的...
Java中的`volatile`关键字是用来解决多线程环境下的可见性和有序性问题的,它确保了共享变量在被修改后,其他线程能够立即看到最新的值,...理解它们的工作原理和应用场景,有助于我们在编写并发程序时做出合理的选择。
在实际开发中,理解`volatile`的局限性至关重要。错误地依赖`volatile`可能导致难以调试的并发问题。例如,假设你用`volatile`维护一个状态变量,而其他线程依赖这个状态进行后续操作,如果没有适当的同步措施,可能...
`volatile`适用于简单共享变量的场景,而`synchronized`适合复杂的同步逻辑。 总的来说,`volatile`关键字是Java并发编程中的一个重要工具,理解其背后的内存模型和语义对于编写高效、线程安全的代码至关重要。然而...
一个简单的例子是,主线程通过修改一个volatile变量来通知其他线程执行某些操作。在代码示例中,主线程修改了volatile变量flag,这将确保所有线程都能看到这个变化,从而触发相应的动作。如果没有volatile修饰,线程...
下面是一个简单的示例,展示了如何在访问硬件寄存器时使用`volatile`: ```c #include // 假设这是一个硬件寄存器的地址 volatile unsigned int *const hardware_register = (unsigned int *)0x12345678; int ...
- 对于简单的状态变量(如标志位)的可见性保证,推荐使用`volatile`,因为它更轻量级且性能更好。 - 当需要实现互斥访问或复合操作的原子性时,应选择使用`synchronized`。 - 在不确定如何选择时,优先考虑`...
通过一个简单的例子来验证volatile的可见性: ```java public class VolatileDemo { int x = 0; volatile boolean b = false; // 写操作 private void write() { x = 5; b = true; System.out.println("x=>...