`

关于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 关键字.doc

    深入理解 volatile 关键字.doc

    volatile的用法

    volatile的用法,在写代码正确使用volatile,正确理解volatile的用法,增强代码的健壮性

    volatile关键字使用

    详细描述关于votatile关键字使用,可以帮助你加深对volatile关键字的理解和使用。

    C++中mutable与volatile的深入理解

    const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而volatile和mutable恰好相反,指示数据总是可变的。mutable和volatile均可以和const搭配使用,但两者在使用上有比较大差别。 下面话不多说了,...

    聊聊C++的mutable和volatile

    const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而volatile和mutable恰好相反,指示数据总是可变的。mutable和volatile均可以和const搭配使用,但两者在使用上有比较大差别。 mutable mutable...

    #define((volatile unsigned *) ) 讲解

    本文介绍了是用C语言的一个关于volatile的问题。

    Java 关键字 volatile 的理解与正确使用

    本文主要介绍 volatile 的使用准则,以及使用过程中需注意的地方,感兴趣的朋友一起看看吧

    深入理解Java中的volatile关键字(总结篇)

    volatile这个关键字,不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。这篇文章主要介绍了Java中的volatile关键字,需要的朋友可以参考下

    深入理解Java内存模型??volatile

    理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码: class VolatileFeaturesExample { ...

    谈谈Java中Volatile关键字的理解

    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果,本文给大家介绍java中volatile关键字,需要的朋友参考下

    Java中volatile关键字的作用与用法详解

    volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下

    深入理解Java内存模型.程晓明(带书签文字版).pdf

    volatile 写-读建立的 happens before 关系 30 volatile 写-读的内存语义 32 volatile 内存语义的实现 35 JSR-133 为什么要增强 volatile 的内存语义 40 锁 42 锁的释放-获取建立的 happens before 关系 42 锁...

    Java 并发核心编程

    本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接口可以构建高并发、线程...

    java中volatile和synchronized的区别与联系

    主要介绍了java中volatile和synchronized的区别与联系的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下

    Java多线程并发编程 Volatile关键字

    volatile 关键字是一个神秘的关键字,也许在 J2EE 上的 JAVA 程序员会了解多一点,但在 Android 上的 JAVA 程序员大多不了解...只要稍了解不当就好容易导致一些并发上的错误发生,例如好多人把 volatile 理解成变量的锁

    深入理解java内存模型

    volatile写-读建立的happens before关系 volatile写-读的内存语义 volatile内存语义的实现 JSR-133为什么要增强volatile的内存语义 锁 锁的释放-获取建立的happens before 关系 锁释放和获取的内存语义 锁内存语义的...

    java同步之volatile解析

    volatile可以说是Java虚拟机提供的最轻量级的同步机制了,了解volatile的语义对理解多线程的特性具有很重要的意义,下面小编带大家一起学习一下

    c# volatile 关键字的拾遗补漏

    要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理。比如对于下面这段代码: public class Example { public int x; public void DoWork() { x = 5; var y = x + 10; Debug.WriteLine...

Global site tag (gtag.js) - Google Analytics