😊

Kotlinの@Volatile・@Transient・@Strictfp・@Synchronizedについて

2022/12/27に公開

ライブラリの内部実装を見ていると時々出てくる、@Volatileとか@Transientなどのアノテーションが何を意味しているのかをいまいちよく理解していなかったので、今回調べてみました。メモ的な感じです。

@Volatile とは?

  • 共有される変数に対して使用し、主にマルチスレッド処理で使用される。
  • スレッドからアクセスされるたび、必ず、共有メモリ上の変数の値とスレッド上の値を一致させる。
  • なので、複数スレッドからアクセスされる可能性がある場合、@Volatileとして宣言しておくと良い。
  • アノテーションされたプロパティのJVMバッキングフィールドをvolatileとしてマークし、このフィールドへの書き込みが他のスレッドから直ちに見えるようにすることを意味する。
/**
 * Marks the JVM backing field of the annotated property as `volatile`, meaning that writes to this field
 * are immediately made visible to other threads.
 */
@Target(FIELD)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
public actual annotation class Volatile

@Transient とは?

  • アノテートされたプロパティのJVMバッキングフィールドをtransientとしてマークする。なので、それがオブジェクトのデフォルトシリアライズフォームの一部でないことを意味する。
  • @Transientプロパティがついたら、シリアライズのプロセスから見えなくする。
    • つまりシリアライズされなくなる
  • なので、初期値が必ず必要になる。
/**
 * Marks the JVM backing field of the annotated property as `transient`, meaning that it is not
 * part of the default serialized form of the object.
 */
@Target(FIELD)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
public actual annotation class Transient

@Strictfp とは?

  • アノテーションされた関数から生成されたJVMメソッドをstrictfpとしてマークします。これは、より良い移植性を達成するために、メソッド内部で実行される浮動小数点演算の精度が制限される必要があることを意味します。
  • もともと、Javaの浮動小数点数の計算はプラットフォームに依存する形になっているが、Strictfp を使うことでハードウェアから独立した結果を得る事ができる。
  • なので、正確に計算したいときに使うべき
/**
 * Marks the JVM method generated from the annotated function as `strictfp`, meaning that the precision
 * of floating point operations performed inside the method needs to be restricted in order to
 * achieve better portability.
 */
@Target(FUNCTION, CONSTRUCTOR, PROPERTY_GETTER, PROPERTY_SETTER, CLASS)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
public actual annotation class Strictfp

@Synchronized とは?

  • アノテーションされた関数から生成されたJVMメソッドをsynchronizedとしてマークする。これは、メソッドが定義されているインスタンス(または静的メソッドの場合はクラス)のモニターによって、複数のスレッドによる同時実行から保護されることを意味する。
  • なので、ある特定のメソッドからメソッドが実行されているときには、そのメソッドの実行が完了するまで、別スレッドでは実行されないことを保証するアノテーション。
/**
 * Marks the JVM method generated from the annotated function as `synchronized`, meaning that the method
 * will be protected from concurrent execution by multiple threads by the monitor of the instance (or,
 * for static methods, the class) on which the method is defined.
 */
@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
public actual annotation class Synchronized

Discussion