Java并发编程(二):volatile关键字
1)保证被volatile修饰的共享变量对所有线程总是可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。
2)禁止指令重排序优化。在执行程序时为了提高性能,编译器和处理器通常会重新安排指令的执行顺序。
public class T {
/*volatile*/ boolean running=true;
void m(){
System.out.println("m start");
while (running){}
System.out.println("m end");
}
public static void main(String[] args) {
T t=new T();
new Thread(()->t.m(),"t1").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.running=false;
}
}
这段代码中没加volatile的话,循环的后面的输出语句"m end"不会输出,但是main方法里面确实是已经将running的值改成了false。这里有关java的内存模型,简单来说就是程序运行时,running的值已经被加载到了缓存里面,而改的是t对象的running值在堆内存中。加了volatile就不一样了,它改完数值之后,会通知其他线程,让其他线程重新读一下堆内存中的值,也就是内存可见性。
public class T1 {
volatile int count=0;
/*synchronized*/ void m(){
for (int i=0;i<10000;i++){
count++;
}
}
public static void main(String[] args) {
T1 t=new T1();
List<Thread> threads=new ArrayList<Thread>();
for(int i=0;i<10;i++){
threads.add(new Thread(()->t.m(),"thread-"+i));
}
threads.forEach((o)->o.start());
threads.forEach((o)->{
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(t.count);
}
}
这段代码中,十个线程执行count++加到1w循环,理想状态当然是加到10w,但是volatile只能保持线程的可见性,不能保持原子性。给count变量加上了volatile,最后输出的count值也达不到10w。这就是volatile与synchronized的区别,volatile只能保持可见性,而synchronized可以保持可见性和原子性。但是volatile更加轻量级,能用volatile的情况下,尽量别用synchronized。
Java并发编程(二):volatile关键字的更多相关文章
- Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- (转)Java并发编程:volatile关键字解析
转:http://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或 ...
- Java并发编程:volatile关键字解析(转载)
转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 ...
- Java并发编程:volatile关键字解析-转
Java并发编程:volatile关键字解析 转自海子:https://www.cnblogs.com/dayanjing/p/9954562.html volatile这个关键字可能很多朋友都听说过 ...
- 6、Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- 转:Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字, ...
- [转载]Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- Java并发编程:volatile关键字解析(学习总结-海子)
博文地址:Java并发编程:volatile关键字解析
- 【转】Java并发编程:volatile关键字解析
转自:http://www.importnew.com/18126.html#comment-487304 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备 ...
- 《转》JAVA并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...
随机推荐
- $NIM$游戏小总结
$umm$可能之后会写个博弈论总结然后就直接把这个复制粘贴上去就把这个删了 但因为还没学完所以先随便写个$NIM$游戏总结趴$QAQ$ 首先最基础的$NIM$游戏:有$n$堆石子,每次可以从一堆中取若 ...
- 「SP25784」BUBBLESORT - Bubble Sort 解题报告
SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...
- 数据库并发处理 - 上的一把好"锁"
为什么要有锁? 我们都是知道,数据库中锁的设计是解决多用户同时访问共享资源时的并发问题.在访问共享资源时,锁定义了用户访问的规则.根据加锁的范围,MySQL 中的锁可大致分成全局锁,表级锁和行锁三类. ...
- 传统远程注入线程,加载DLL
代码根据<windows黑客编程技术详解>来的 远程DLL注入:把我们的恶意DLL强制注入到正常的进程中 每个程序执行时都会调用kernal32.dll,加载DLL时,通过Load ...
- 移动web 1像素边框
实现方法 border-image 图片 实现 这篇文章是腾讯github上的解决方案border-image来实现的 链接走起 <使用border-image实现类似iOS7的1px底边> ...
- JAVA读取yml配置文件指定key下的所有内容
先引入需要的依赖 <!--读取yml文件--> <dependency> <groupId>org.yaml</groupId> <artifac ...
- jdk1.7扩容时,不论是否有链表,并发都可能出现循环链表
扩容时使用transfertransfer不同于put时的判断hash冲突,直接使用头插法,如果没有冲突,则next为null.如下:e.next = newTable[i];newTable[i] ...
- JPQ整合Querydsl入门篇
# JPQ整合Querydsl入门篇 不知道你们喜不喜欢用JPA ,我本人是很喜欢 不要和我说JPA不适合复杂查询等等的,你要知道现在都是微服务,只要你服务器拆分够细表设计够合理,都是服务之间调能用 ...
- 初探ASP.NET Core 3.x (1) - 关于ASP.NET Core
I 什么是ASP.NET Core ASP.NET is an open source web framework, created by Microsoft, for building modern ...
- dp - 循环数组的最大和
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...