うっかり忘れそうなのでメモ。
【ダメダメな例】
インクリメントしようとして、インクリメントできていないときが600万回くらいあります。
「int型をインクリメントするくらいで、スレッド間の競合を考えなくてもいいだろ。」という考えはスパっと切り捨てましょう。
【正しい例】
MyThreadだけ書き換えます。
今度は大丈夫です。
【もうひとつの正しい例】
もちろんsynchronizedを使ってもかまいません。
ただし、処理時間でAtomicIntegerに負けるそうです。
また、MyThreadのみ変更します。
これでも期待通りの結果が得られます。
参考にさせていただきました:
AtomicIntegerを追ってみた