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

本文通过一个简单的Java示例,介绍了并发编程中原子性和可见性的概念。详细解释了原子操作的重要性,以及如何通过synchronized关键字确保操作的原子性和可见性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值