`

关于volatile的理解

阅读更多

        关于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详解,深入学习Volatile

    《深入理解Volatile》 Volatile是C/C++编程语言中的一个关键字,它与const一起被称为"cv特性",用于指示变量的值可能被系统或其他线程/进程改变,从而强制编译器每次从内存中读取该变量的最新值。在多线程或嵌入式...

    volatile源码分析1

    在深入理解volatile时,我们需要考虑JVM内存模型、处理器缓存以及底层的汇编指令,这有助于我们更好地理解和使用volatile,解决并发编程中的问题。在实际开发中,合理利用volatile可以避免不必要的锁同步,提升程序...

    C语言中关于关键字volatile的用法

    在C语言编程实践中,理解和正确使用volatile关键字是非常重要的。尤其是在涉及硬件交互或者并发编程时,对于保证程序的正确性和稳定性起着关键作用。尽管如此,在使用volatile时也要注意,它并不是万能的,比如它并...

    const和volatile分析

    在面试和找工作中,理解和掌握`const`和`volatile`的使用是评估程序员基础功底的重要标准。熟悉它们可以帮助编写出更加安全、高效且易于维护的代码,尤其在处理多线程、嵌入式系统或者与硬件交互的场景中。因此,对`...

    volatile用法

    `volatile`关键字在C语言中是一个非常重要的概念,主要用于处理多线程环境或者与硬件交互时的内存可见性问题。它的主要作用是确保对变量的修改能够立即...理解和正确使用`volatile`对于编写健壮的并发代码至关重要。

    volatile详解

    `volatile`的中文含义通常被翻译为“易变的”,但根据描述中的观点,将其理解为“直接存取原始内存地址”更为恰当。这是因为`volatile`主要用于标记那些可能会被外部因素(如其他线程、中断服务程序等)意外改变的...

    volatile 变量的说明

    下面是一些关于volatile的常见问题及其解答: 1. **参数可以同时是const和volatile吗?** 是的,一个变量可以既是const也是volatile。比如,它可能是只读的状态寄存器,不能被程序修改,但可能在运行时由硬件改变。...

    stm32 volatile变量的正确使用

    本文将深入探讨`volatile`关键字的基本概念、使用场景以及注意事项,并结合实际示例来帮助读者更好地理解和应用这一概念。 #### `volatile`关键字详解 在C语言中,`volatile`是一个类型限定符,用于告知编译器不要...

    单片机C语言中volatile的作用

    在探讨单片机C语言中`volatile`关键字的作用之前,我们首先需要理解`volatile`的基本概念及其应用场景。`volatile`是一个用于声明变量的关键字,在C语言中,使用`volatile`修饰的变量表明其值可能会在没有程序控制的...

    深入理解 volatile 关键字.doc

    深入理解volatile关键字 volatile关键字是Java语言的高级特性,它可以保证可见性和禁止指令重排序,但是要弄清楚其工作原理,需要先弄懂Java内存模型。 保证可见性 volatile关键字可以保证可见性,即当一个线程...

    C中volatile_const解析

    理解和正确使用`volatile`和`const`关键字对于编写高质量的C语言代码至关重要,尤其是在嵌入式系统开发中。通过确保编译器正确处理这些变量,可以避免许多难以调试的错误,提高系统的稳定性和可靠性。

    mcu-volatile-example.rar_volatile_单片机C语言

    在标题 "mcu-volatile-example.rar_volatile_单片机C语言" 中,我们可以看出这是一个关于单片机C语言编程中 `volatile` 使用的实例集合。它可能包含了一些具体的应用场景,通过实例来帮助理解 `volatile` 的工作原理...

    static,const,volatile用法

    ### static、const、volatile用法解析 在编程领域中,`static`、`const`、`volatile` 这三个关键字非常常见且重要。它们分别用于控制变量的作用域、可变性和不可预测性,是理解程序行为的基础之一。下面将详细介绍...

    volatile,nonatomic和atomic关键字测试

    在iOS和Mac开发中,Objective-C是主要的编程语言,它在定义实例变量或属性时提供了几个关键的修饰符,包括`volatile`、`nonatomic`和`atomic`。这些关键字对于理解多线程环境下的数据同步和内存管理至关重要。本文将...

    Java并发编程:volatile关键字解析

    在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的数据从较慢的主存复制到更快的CPU缓存中。这种做法虽然提高了性能,但也...

    AVR-GCC 中如何使用volatile 关键字.pdf

    在嵌入式系统开发中,特别是在使用AVR-GCC编译器时,正确理解并使用 `volatile` 关键字是非常重要的。 #### 2. `volatile` 在多任务与中断环境中的应用 当涉及到多任务处理或中断服务例程(ISR)时,`volatile` ...

    深入理解 `volatile` 关键字:用法、误区与最佳实践

    在C和C++编程中,volatile 关键字是一个修饰符,用于告知编译器一个变量的值可能会在程序的控制之外随时改变。...理解 volatile 的正确用法、避免常见误区,并遵循最佳实践,对于编写正确、高效的程序至关重要。

    const,extern,static,volatile的使用

    - **增强代码可读性**:`const` 声明可以帮助阅读代码的人理解哪些数据是不变的。 - **优化编译器性能**:编译器能够利用 `const` 信息进行更多的优化。 **2. const 的基本用法** - **声明常量**: ```c++ const...

Global site tag (gtag.js) - Google Analytics