Java 线程原子性

描述

定义一个静态变量,当两个线程都对该变量进行自增运算,计算结果小于实际值,这种情况称为原子性问题。

题目

请使用编程案例实现线程原子性问题。

题目解决思路

  1. 定义一个静态变量,初始值为 0。
  2. 创建一个线程,线程中运用循环对该变量自增 5000 次。
  3. 创建一个线程,线程中运用循环对该变量自增 5000 次。
  4. 打印最终结果值。

代码具体实现

public class Test { private static int sum = 0; public static void main(String[] args) throws InterruptedException { System.out.println("嗨客网(www.haicoder.net)\n"); Thread t1 = new Thread("Thread01"){ @Override public void run() { for (int i = 0; i <= 5000; i++) { sum++; } } }; Thread t2 = new Thread("Thread02"){ @Override public void run() { for (int i = 0; i <= 5000; i++) { sum++; } } }; t1.start(); t2.start(); t1.join(); // 确保线程 t1 运行完毕,再执行主线程 t2.join(); // 确保线程 t2 运行完毕,再执行主线程 System.out.println("计算结果:" + sum); } }

运行结果如下图:

07_java 线程原子性.png

以上案例发现,两个线程都进行自增 5000 次之后,结果却小于 10000 ,此处可以发现多线程存在原子性的安全问题。