增量前运算符是否线程安全?

2022-09-02 02:35:15

我正在用java制作一个程序,让几辆车相互竞争。每辆车都是一个单独的线程。

当汽车完成比赛时,每个汽车都调用此方法。我已经在不同的计时器速度下测试了该方法,它似乎工作正常。但我确实意识到每个线程都在访问可变的carsComplete,有时是完全在同一时间(至少在date命令给我的范围内)。

所以我的问题是:这种方法是线程安全的吗?

 public static String completeRace()
 {
      Date accessDate = new Date();
      System.out.println("Cars Complete: " + carsComplete + " Accessed at " + accessDate.toString());
      switch(++carsComplete)
      {
           case 1: return "1st";
           case 2: return "2nd";
           case 3: return "3rd";
           default: return carsComplete + "th";    
      }
 }

答案 1

不,您应该使用类似 .看看它的方法。java.util.concurrent.atomic.AtomicIntegergetAndIncrement()


答案 2

预增量 on 不是线程安全的,使用它是无锁的:intAtomicInteger

AtomicInteger carsComplete = new AtomicInteger();

//...

switch(carsComplete.incrementAndGet())

顺便说一句,下面的代码也不是线程安全的。你能说出为什么吗?

carsComplete.incrementAndGet();
switch(carsComplete.get())