使用非原子性的自增和原子性的自增进行多线程测试。

本文通过对比非原子性自增与原子性自增的操作结果,解释了多线程环境下非原子性自增操作可能导致的数据不一致问题,并提供了一个简单的Java示例程序。

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

结果截图如下:

原因分析:

因为非原子性的自增一共包括3个原子性操作(步骤1:取i的值 步骤 2:i+1 步骤3:把新的值赋予i),当多个线程对其进行操作时,如一个线程在步骤1取i 的值结束后,还没有来得及进行步骤2,另一个线程就对还没完成自增的i进行自增了,导致i的值经过这两个线程的自增操作后i的值只加1。

源代码如下:

public class Test1_5 {
	private static int value1=0;
	public static void main(String[] args) {
		AtomicInteger value2=new AtomicInteger();
		Thread[] thread1s=new Thread[10000];
		for(int i=0;i<10000;i++) {
			thread1s[i]=new Thread() {
				public void run() {
					value1++;
				}
			};
			thread1s[i].start();
		}
		
		for(Thread thread:thread1s) {
			try {
				thread.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		Thread[] thread2s=new Thread[10000];
		
		for(int i=0;i<10000;i++) {
			thread2s[i]=new Thread() {
				public void run() {
					value2.incrementAndGet();
				}
			};
			thread2s[i].start();
		}
		
		for(Thread thread:thread2s) {
			try {
				thread.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println("非原子性的自增一万次得出的结果为:"+value1);
		System.out.println("原子性的自增一万次得出的结果为:"+value2);
	}

}

注意:

源代码中的value1必须定义为类的变量,而不能定义在main函数中,不然不能进行自增操作,会提示

Local variable value defined in an enclosing scope must be final or effectively final

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值