您的位置:首页 > 编程语言 > Java开发

java并发-原子性和可见性(7)

2017-11-17 14:53 246 查看
原子性:某个操作同时只能由一个线程执行。

可见性:一个线程的修改对其他线程是可见的。也就是A线程修改了变量x,那么B,C,D...线程此时去拿到的x肯定是A修改之后的值。

package com.concurenny.chapter.six;

/**
* 创建者:Mr lebron 创建时间:2017年11月17日 下午2:27:32
*/
public class AtomicityDemo {
private static int count = 0;

public static void main(String[] args) {
// 不是原子操作,可能会出现重复输出
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(add(1));
}).start();
}
// 原子操作,不会有问题
// for (int i = 0; i < 200; i++) {
// new Thread(() -> {
// System.out.println(add2(1));
// ;
// }).start();
// }

}

public static int add(int plus) {
// count = count + plus 显然不是原子操作。
// count = count+plus可能执行过程:
// 有2个线程A,B同时执行该方法
// 1.A:寄存器读取count.
// 2.B:寄存器读取count.
/// 3.A:对count执行+plus
// 4.B:A:对count执行+plus
// 5.A:赋值给count 这一步显然得到了B线程的执行结果,并不是A线程想要的。
// 6.B:赋值给count
// 这里原子性就是指A线程在执行count = count + plus操作时,整个过程不能有其他线程参与。
// 可见性是指A执行count = count + plus之后的count对B可见,也就是B拿到的count是A计算之后的count的值。
count = count + plus;
return count;
}

// 加上synchronized之后,保证了原子性和可见性。因为同时只能有一个线程执行该方法,执行完毕会将变量count的值刷新到内存中。其他线程执行该方法会得到新值。
public static synchronized int add2(int plus) {
int rst = count + plus;
return rst;
}
}

相关文章:
http://ifeve.com/java%E9%94%81%E6%98%AF%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%81%E6%80%A7%E7%9A%84/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: