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

来源:互联网 发布:mac怎么设置独立显卡 编辑:程序博客网 时间:2024/06/12 20:30

原子性:某个操作同时只能由一个线程执行。

可见性:一个线程的修改对其他线程是可见的。也就是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/

原创粉丝点击