Java并发编程一:volatile关键字
2016-06-15 22:45
435 查看
在网络上找了好多关于volatile的文章,一直没有找到体现volatile作用的代码示例,本文通过代码给大家介绍一下volatile的作用。如有不正之处,欢迎批评指正。
示例一:
这是网上找的一段示例,被无数个猿类喷了,大家纷纷说加不加“volatile”结果都一样,楼主没验证程序就把代码贴出来了,我建了个工程run了这段代码,确实如大家所说,加不加“volatile”都会输出“!=”。于是乎自己接着上网找资料,找能够说明volatile作用的代码,无意中看到了“在多线程环境下,volatile能够保证线程获取到最新的数据”多线程这几个字在我心中一闪,于是我开始改造上面的示例代码
示例二:
我启动了10个做判定条件的线程,run了代码,这时候volatile的作用体现出来了,不加volatile的代码一直出于运行状态,加了volatile的代码马上就exit了。感觉到volatile的作用了,接着我又调整了一下代码。
示例三:
我把10个判定条件的线程移到代码的后面,run代码,发现加不加“volatile”都可以快速的exit程序。
为什么会是这样的?以下是我的推测
示例二中:先建立10线程同时获取bChanged的值,这是volatile起到了作用能够使个线程获取最新的值。
示例三中:先设置bChanged值,后获取bChanged的值,for循环创建线程,创建第一个线程,就相当于示例一的代码了,有可能在没有创建完全部线程的时候,第一个创建的线程已经exit程序了。所以加不加volatile执行结果都一样。分享给大家。
示例一:
public class TestWithVolatile { private volatile static boolean bChanged; public static void main(String[] args) throws InterruptedException { new Thread() { @Override public void run() { for (;;) { if (bChanged == !bChanged) { System.out.println("!="); System.exit(0); } } } }.start(); Thread.sleep(1); new Thread() { @Override public void run() { for (;;) { bChanged = !bChanged; } } }.start(); } }
这是网上找的一段示例,被无数个猿类喷了,大家纷纷说加不加“volatile”结果都一样,楼主没验证程序就把代码贴出来了,我建了个工程run了这段代码,确实如大家所说,加不加“volatile”都会输出“!=”。于是乎自己接着上网找资料,找能够说明volatile作用的代码,无意中看到了“在多线程环境下,volatile能够保证线程获取到最新的数据”多线程这几个字在我心中一闪,于是我开始改造上面的示例代码
示例二:
public class TestWithVolatile { private static volatile boolean bChanged; public static void main(String[] args) throws InterruptedException { for(int i = 0; i < 10; i++){ new Thread() { @Override public void run() { for (;;) { if (bChanged == !bChanged) { System.out.println("!="); System.exit(0); } } } }.start(); } Thread.sleep(1); new Thread() { @Override public void run() { for (;;) { bChanged = !bChanged; } } }.start(); } }
我启动了10个做判定条件的线程,run了代码,这时候volatile的作用体现出来了,不加volatile的代码一直出于运行状态,加了volatile的代码马上就exit了。感觉到volatile的作用了,接着我又调整了一下代码。
示例三:
public class TestWithVolatile { private static volatile boolean bChanged; public static void main(String[] args) throws InterruptedException { new Thread() { @Override public void run() { for (;;) { bChanged = !bChanged; } } }.start(); Thread.sleep(1); for(int i = 0; i < 10; i++){ new Thread() { @Override public void run() { for (;;) { if (bChanged == !bChanged) { System.out.println("!="); System.exit(0); } } } }.start(); } } }
我把10个判定条件的线程移到代码的后面,run代码,发现加不加“volatile”都可以快速的exit程序。
为什么会是这样的?以下是我的推测
示例二中:先建立10线程同时获取bChanged的值,这是volatile起到了作用能够使个线程获取最新的值。
示例三中:先设置bChanged值,后获取bChanged的值,for循环创建线程,创建第一个线程,就相当于示例一的代码了,有可能在没有创建完全部线程的时候,第一个创建的线程已经exit程序了。所以加不加volatile执行结果都一样。分享给大家。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树