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

我正在用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"; } } 

不,你应该使用像java.util.concurrent.atomic.AtomicInteger这样的东西。 看看它的getAndIncrement()方法。

int上的预增量不是线程安全的,使用无锁的AtomicInteger

 AtomicInteger carsComplete = new AtomicInteger(); //... switch(carsComplete.incrementAndGet()) 

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

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

++运算符不是primefaces的。 请看http://madbean.com/2003/mb2003-44/ 。 对于primefaces操作,您可以使用AtomicInteger

 AtomicInteger atomicInteger = new java.util.concurrent.atomic.AtomicInteger(0) 

每次想要增加时,都可以调用atomicInteger.incrementAndGet()方法,该方法返回一个原语int。 0是primefaces整数的默认初始值。

与C ++相同,operator ++不是primefaces的。

它实际上是在引擎盖下执行的不止一条指令(不要被看到只是一个简单的++i而被欺骗;它是load/add/store )并且因为没有同步涉及多于1条指令你可能有各种各样的指令交错结果错误。

如果你需要以线程安全的方式carsComplete ,你可以使用java的构造AtomicInteger或者你可以同步整个方法

问题是“预增量运算符线程是否安全?”

答:不,为什么? 因为涉及的指令数量。 primefaces意味着单个操作,这里需要执行加载/添加/存储操作。 所以不是primefaces操作。

  Same for post increment.