サービス初期化のスコープから呼び出される読み取り/書き込みアクションと invokeAndWait を報告します。

サービス初期化中の読み取り/書き込みアクションの実行、または invokeAndWait の呼び出しにより、デッドロックが発生する可能性があります。

例:

Kotlin:


@Service
internal class MyService {
  private val myData = initMyData();

  constructor() {
    val data = runReadAction { // 不適切: コンストラクター内で読み取りアクションを実行している
      // データの読み取り
    }
  }

  private fun initMyData(): Data {
    return runWriteAction { // 不適切: myData プロパティの初期化中に呼び出されている
      // データの書き込み
    }
  }

  companion object {
    lateinit var companionData: String
    init {
      companionData = runReadAction { // 不適切: init ブロック内で読み取りアクションを実行している
        // データの読み取り
      }
    }
  }
}

Java:


@Service
class MyService {
  private static final Data ourData1 = ReadAction.compute(() -> {
    // データの読み取り
  });
  private static final Data ourData2;

  static {
    ourData2 = ReadAction.compute(() -> { // 不適切: static 初期化ブロック内で読み取りアクションを実行している
      // データの読み取り
    });
  }

  private final Data myData2 = initMyData();

  MyService() {
    Data data = WriteAction.compute(() -> { // 不適切: コンストラクター内で読み取りアクションを実行している
      // データの書き込み
    });
  }

  private Data initMyData() {
    return ReadAction.compute(() -> { // 不適切: myData プロパティの初期化中に呼び出されている
      // データの読み取り
    });
  }
}

PersistentStateComponent:


@Service
@State(...)
internal class MySettings : PersistentStateComponent<MyService> {
  var stateValue: String? = null

  override fun loadState(state: MySettings) {
    val data = runReadAction { // 不適切: loadState 内で読み取りアクションを実行している
      // データの読み取り
    }
    // ...
  }

  override fun noStateLoaded() {
    val data = runWriteAction { // 不適切: noStateLoaded 内で読み取りアクションを実行している
      // データの書き込み
    }
    // ...
  }

  override fun initializeComponent() {
    val data = runReadAction { // 不適切: initializeComponent 内で読み取りアクションを実行している
      // データの読み取り
    }
    // ...
  }

}

2024.2 の新機能です