【Kotlin/Android】AtomicIntegerでスレッドセーフにカウンターを扱う方法
この記事からわかること
- Android Studio/KotlinのAtomicIntegerの使い方
- スレッドセーフなカウンターを実装するには?
- synchronizedの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Kotlinで異なるスレッドからの操作の注意点
Kotlinで異なるスレッドから変更を加えるような実装にすると期待する通りに反映されないことがあります。例えば以下のように100個のスレッドからcounterを参照してインクリメントさせる実装では結果が100000になるはずですが、出力結果は少し欠落した値になってしまっています。
この結果は予期せぬバグの温床になるので異なるスレッドから値を参照する際は適切に管理する必要があります。
AtomicInteger
AtomicIntegerはスレッドセーフな整数型です。先ほどの問題はこのAtomicIntegerを使用することで解決できました。
ここからはAtomicIntegerの使い方をまとめていきます。
インスタンス化
インスタンス化するにはAtomicIntegerのコンストラクタを使用します。
値の取得
現在の値を取得するにはgetメソッドを使用します。
新しい値を設定
新しい値を設定するにはsetメソッドを使用します。
インクリメントして取得
インクリメントして取得するにはincrementAndGetメソッドを使用します。
デクリメントして取得
デクリメントして取得するにはdecrementAndGetメソッドを使用します。
指定した値を加算して取得
指定した値を加算して取得するにはaddAndGetメソッドを使用します。
指定した値なら指定した値に更新して取得
指定した値なら指定した値に更新して取得するにはcompareAndSet(int expect, int update)メソッドを使用します。
synchronizedで同期化
スレッドセーフにカウンターを扱う方法としてsynchronizedブロックを使用することで期待通りに動作させることも可能です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。





