关于Volatile关键字的研究

问题1:Volatile有什么作用?

package com.victor.hello;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class VolatileTest {
	private static volatile int volatileCounter = 0;
	private static int noneVolatileCounter = 0;

	public static void main(String[] args){
		final ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
		for(int i =0;i<10;i++){
			service.scheduleAtFixedRate(new Runnable(){

				@Override
				public void run() {
					String threadName = Thread.currentThread().getName();
					volatileCounter++;
					sleep();
					volatileCounter--;
					noneVolatileCounter++;
					sleep();
					noneVolatileCounter--;
					System.out.println(volatileCounter+"	"+noneVolatileCounter+"	["+threadName+"]");
				}

			}, 0, 3, TimeUnit.SECONDS);
		}
	}

	private static void sleep(){
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

为了体验Volatile这个关键字的作用,我写了一个测试方法。两个int类型的变量,分别用volatile和不用volatile修饰。先做一个++的操作,再做一个--的操作。之间休息0.1秒。起十个线程,定时的操作。

有经验的同学一看就知道,这么操作觉得线程不安全。让我们看看执行的结果。

0 9 [pool-1-thread-9]

0 8 [pool-1-thread-7]

0 7 [pool-1-thread-5]

0 6 [pool-1-thread-3]

0 5 [pool-1-thread-1]

0 4 [pool-1-thread-2]

0 3 [pool-1-thread-4]

0 2 [pool-1-thread-8]

0 1 [pool-1-thread-6]

0 0 [pool-1-thread-10]

1 9 [pool-1-thread-3]

1 8 [pool-1-thread-5]

1 7 [pool-1-thread-9]

1 6 [pool-1-thread-7]

1 5 [pool-1-thread-2]

1 4 [pool-1-thread-4]

1 3 [pool-1-thread-1]

1 2 [pool-1-thread-6]

1 1 [pool-1-thread-8]

1 0 [pool-1-thread-10]

1 9 [pool-1-thread-1]

1 8 [pool-1-thread-3]

1 7 [pool-1-thread-5]

1 5 [pool-1-thread-9]

1 5 [pool-1-thread-7]

1 4 [pool-1-thread-4]

1 3 [pool-1-thread-8]

1 2 [pool-1-thread-2]

1 1 [pool-1-thread-6]

1 0 [pool-1-thread-10]

1 9 [pool-1-thread-7]

1 8 [pool-1-thread-5]

1 7 [pool-1-thread-9]

1 6 [pool-1-thread-8]

1 5 [pool-1-thread-4]

1 4 [pool-1-thread-1]

1 3 [pool-1-thread-2]

1 2 [pool-1-thread-3]

1 1 [pool-1-thread-6]

1 0 [pool-1-thread-10]

1 9 [pool-1-thread-3]

1 8 [pool-1-thread-7]

1 7 [pool-1-thread-5]

1 6 [pool-1-thread-4]

1 5 [pool-1-thread-8]

1 4 [pool-1-thread-1]

1 3 [pool-1-thread-9]

1 3 [pool-1-thread-2]

1 1 [pool-1-thread-6]

1 1 [pool-1-thread-10]

1 9 [pool-1-thread-7]

1 8 [pool-1-thread-3]

1 7 [pool-1-thread-9]

1 7 [pool-1-thread-5]

1 6 [pool-1-thread-1]

1 5 [pool-1-thread-4]

1 4 [pool-1-thread-8]

1 3 [pool-1-thread-2]

1 2 [pool-1-thread-6]

1 1 [pool-1-thread-10]

1 10 [pool-1-thread-4]

1 9 [pool-1-thread-7]

1 8 [pool-1-thread-1]

1 7 [pool-1-thread-3]

1 6 [pool-1-thread-8]

1 5 [pool-1-thread-2]

1 4 [pool-1-thread-9]

1 2 [pool-1-thread-5]

1 2 [pool-1-thread-10]

1 1 [pool-1-thread-6]

可见,每次并发的时候。Volatile的修改都能迅速的让其他线程感知到。也就是线程间的可见性。

但几次并发以后,它就忍不住线程不安全了。可见并没有保证线程的安全。

关于Volatile关键字的研究

时间: 2024-10-12 17:40:46

关于Volatile关键字的研究的相关文章

就是要你懂Java中volatile关键字实现原理

原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地

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

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola

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

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola

volatile关键字解析

转载:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来

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

Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatil

《转》JAVA并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola

【Java并发编程】6、volatile关键字解析&amp;内存模型&amp;并发编程中三概念

转自:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来

Java并发编程:volatile关键字解析(转载)

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola

Java并发编程(六):volatile关键字解析(转载)

原文转载自:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我