关于volatile,公认它的作用是保证可见性,无法保证原子性,对于多个线程的访问还是需要加锁,这是确定的,比如代码示例如下:
public class VolatileTest { private volatile int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void increAge() { age++; } public static void main(String[] args) throws InterruptedException { VolatileTest vt = new VolatileTest(); Thread t1 = new Thread(new Worker(vt)); Thread t2 = new Thread(new Worker(vt)); Thread t3 = new Thread(new Worker(vt)); Thread t4 = new Thread(new Worker(vt)); t1.start();t2.start();t3.start();t4.start(); while (true) { } } private static class Worker implements Runnable { private VolatileTest vt; public Worker(VolatileTest vt) { this.vt = vt; } @Override public void run() { //synchronized(vt) { System.out.println(Thread.currentThread().getName() + " age is:" + vt.getAge()); vt.increAge(); //} } } }
程序运行结果当然是不确定的,其中某一次的结果为:
Thread-0 age is:0
Thread-2 age is:0
Thread-1 age is:2
Thread-3 age is:3
要保证程序逻辑正确执行,还得需要把注释的synchronized打开才行;那么什么时候可以和需要用volatile呢?我总结有以下几点:
1、首先被volatile修饰的变量大部分是一个标志性变量(比如布尔型),而不是一个integer或者double(这些变量往往需要反复被多线程读写),对这个变量的写入是单线程完成的
2、该变量单独使用,不和其他变量组合在一起形成复合判断条件
大概就是这些,以后再补充
相关推荐
《从汇编角度理解volatile》 volatile关键字在编程中扮演着重要的角色,它主要用于多线程编程和与硬件交互的场景。通常的理解是,volatile告诉编译器不要对某个变量进行优化,每次读取该变量时都直接从内存中获取,...
《深入理解Volatile》 Volatile是C/C++编程语言中的一个关键字,它与const一起被称为"cv特性",用于指示变量的值可能被系统或其他线程/进程改变,从而强制编译器每次从内存中读取该变量的最新值。在多线程或嵌入式...
在深入理解volatile时,我们需要考虑JVM内存模型、处理器缓存以及底层的汇编指令,这有助于我们更好地理解和使用volatile,解决并发编程中的问题。在实际开发中,合理利用volatile可以避免不必要的锁同步,提升程序...
在C语言编程实践中,理解和正确使用volatile关键字是非常重要的。尤其是在涉及硬件交互或者并发编程时,对于保证程序的正确性和稳定性起着关键作用。尽管如此,在使用volatile时也要注意,它并不是万能的,比如它并...
在面试和找工作中,理解和掌握`const`和`volatile`的使用是评估程序员基础功底的重要标准。熟悉它们可以帮助编写出更加安全、高效且易于维护的代码,尤其在处理多线程、嵌入式系统或者与硬件交互的场景中。因此,对`...
`volatile`关键字在C语言中是一个非常重要的概念,主要用于处理多线程环境或者与硬件交互时的内存可见性问题。它的主要作用是确保对变量的修改能够立即...理解和正确使用`volatile`对于编写健壮的并发代码至关重要。
`volatile`的中文含义通常被翻译为“易变的”,但根据描述中的观点,将其理解为“直接存取原始内存地址”更为恰当。这是因为`volatile`主要用于标记那些可能会被外部因素(如其他线程、中断服务程序等)意外改变的...
下面是一些关于volatile的常见问题及其解答: 1. **参数可以同时是const和volatile吗?** 是的,一个变量可以既是const也是volatile。比如,它可能是只读的状态寄存器,不能被程序修改,但可能在运行时由硬件改变。...
本文将深入探讨`volatile`关键字的基本概念、使用场景以及注意事项,并结合实际示例来帮助读者更好地理解和应用这一概念。 #### `volatile`关键字详解 在C语言中,`volatile`是一个类型限定符,用于告知编译器不要...
在探讨单片机C语言中`volatile`关键字的作用之前,我们首先需要理解`volatile`的基本概念及其应用场景。`volatile`是一个用于声明变量的关键字,在C语言中,使用`volatile`修饰的变量表明其值可能会在没有程序控制的...
深入理解volatile关键字 volatile关键字是Java语言的高级特性,它可以保证可见性和禁止指令重排序,但是要弄清楚其工作原理,需要先弄懂Java内存模型。 保证可见性 volatile关键字可以保证可见性,即当一个线程...
理解和正确使用`volatile`和`const`关键字对于编写高质量的C语言代码至关重要,尤其是在嵌入式系统开发中。通过确保编译器正确处理这些变量,可以避免许多难以调试的错误,提高系统的稳定性和可靠性。
在标题 "mcu-volatile-example.rar_volatile_单片机C语言" 中,我们可以看出这是一个关于单片机C语言编程中 `volatile` 使用的实例集合。它可能包含了一些具体的应用场景,通过实例来帮助理解 `volatile` 的工作原理...
### static、const、volatile用法解析 在编程领域中,`static`、`const`、`volatile` 这三个关键字非常常见且重要。它们分别用于控制变量的作用域、可变性和不可预测性,是理解程序行为的基础之一。下面将详细介绍...
在iOS和Mac开发中,Objective-C是主要的编程语言,它在定义实例变量或属性时提供了几个关键的修饰符,包括`volatile`、`nonatomic`和`atomic`。这些关键字对于理解多线程环境下的数据同步和内存管理至关重要。本文将...
在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的数据从较慢的主存复制到更快的CPU缓存中。这种做法虽然提高了性能,但也...
在嵌入式系统开发中,特别是在使用AVR-GCC编译器时,正确理解并使用 `volatile` 关键字是非常重要的。 #### 2. `volatile` 在多任务与中断环境中的应用 当涉及到多任务处理或中断服务例程(ISR)时,`volatile` ...
在C和C++编程中,volatile 关键字是一个修饰符,用于告知编译器一个变量的值可能会在程序的控制之外随时改变。...理解 volatile 的正确用法、避免常见误区,并遵循最佳实践,对于编写正确、高效的程序至关重要。
- **增强代码可读性**:`const` 声明可以帮助阅读代码的人理解哪些数据是不变的。 - **优化编译器性能**:编译器能够利用 `const` 信息进行更多的优化。 **2. const 的基本用法** - **声明常量**: ```c++ const...