首页 > 试题广场 >

有如下 Java 代码: public class Main

[不定项选择题]
有如下 Java 代码:
public class Main {
    private static int count = 0;
    public synchronized void increment() {
        count++;
    }
    public static void main(String[] args) {
        Main obj1 = new Main();
        Main obj2 = new Main();
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1500; i++) {
                obj1.increment();
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1500; i++) {
                obj2.increment();
            }
        });
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(count);
    }
}
则运行结果可能为()
  • 2911
  • 2634
  • 3000
  • 3015
这段代码存在线程安全问题,最终输出的count值可能小于预期的3000(1500+1500)。

问题分析:

  1. synchronized修饰实例方法的锁对象
    increment()是被synchronized修饰的实例方法,其锁定的是当前对象实例(this)。即:
    • 线程t1调用obj1.increment()时,获取的是obj1对象的锁;
    • 线程t2调用obj2.increment()时,获取的是obj2对象的锁。
    由于obj1和obj2是两个不同的对象,两个线程持有的是不同的锁,因此它们可以同时进入increment()方法,不存在互斥关系。
  2. 静态变量count的线程不安全操作
    count是static变量,属于类级别的共享资源,被所有实例共享。count++操作不是原子操作(包含 “读取 - 加 1 - 写入” 三个步骤)。
    当两个线程同时执行count++时,可能出现以下情况:
    • 线程 1 读取count=100,尚未完成加 1 写入;
    • 线程 2 同时读取到count=100,也执行加 1;
    • 最终两者都写入101,导致一次递增操作 “失效”。
发表于 2025-09-03 09:14:08 回复(0)