Udemyの人気コースが今なら80%OFF!

【Java】スレッドセーフな書き方を目指す(メモ)

【Java入門】スレッドセーフな書き方を目指す

  • ステートレスにする(クラス変数・インスタンス変数を使わずにローカル変数を用いる。)
  • メソッドに変数を渡したい場合は、その都度渡す。
  • 定数等、static宣言するものはクラス変数やインスタンス変数でも可。
  • 文字の連結にはStringBufferを使用する。(StringBuilderは使わない。)
  • 日付を操作する場合はLocalDateTimeクラスを使用する。(DataクラスやCalendarクラスを使わない。)
  • SimpleDateFormatクラスの代わりにDateTimeFormatterクラスを使用する。(前者はスレッドセーフではないが、後者は不変クラスかつ、スレッドセーフである。)
  • 同期化する必要がある処理にはsynchronizedを付与することを検討する。
  • 読み書きする`ArrayList`を用いる場合は`CopyOnwriteArrayList`クラスを用いる
  • 読み取り専用の`ArrayList`を用いる場合は`UnmodifiableList`クラスを用いる
  • ローカル変数の値はメモリ上スタック領域に保持されるため、1つのスレッドからしか参照されない。
  • 一方、クラス変数・インスタンス変数はヒープ領域に保持されるため、複数のスレッドから参照されてしまう。

synchronized

synchronizedブロック

private int method1(int x) {
    //複数のスレッドで使用する可能性のある部分はsynchronizedを付与する
    synchronized(this){
        return x = x + x;
    }
}

synchronizedメソッド

//複数のスレッドで使用する可能性のある部分はsynchronizedを付与する
synchronized private int method1(int x) {

    return x = x + x;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です