서비스 초기화 범위에서 호출되는 읽기/쓰기 액션과 invokeAndWait을 보고합니다.

서비스 초기화 중 읽기/쓰기 액션을 실행하거나 invokeAndWait을 호출하면 교착 상태를 일으킬 수 있습니다.

예:

Kotlin:


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

  constructor() {
    val data = runReadAction { // 나쁨: 생성자에서 읽기 액션 실행
      // read data
    }
  }

  private fun initMyData(): Data {
    return runWriteAction { // 나쁨: myData 프로퍼티 초기화 중 호출
      // write data
    }
  }

  companion object {
    lateinit var companionData: String
    init {
      companionData = runReadAction { // 나쁨: init 블록에서 읽기 액션 실행
        // read data
      }
    }
  }
}

Java:


@Service
class MyService {
  private static final Data ourData1 = ReadAction.compute(() -> {
    // read data
  });
  private static final Data ourData2;

  static {
    ourData2 = ReadAction.compute(() -> { // 나쁨: static 초기화 블록에서 읽기 액션 실행
      // read data
    });
  }

  private final Data myData2 = initMyData();

  MyService() {
    Data data = WriteAction.compute(() -> { // 나쁨: 생성자에서 읽기 액션 실행
      // write data
    });
  }

  private Data initMyData() {
    return ReadAction.compute(() -> { // 나쁨: myData 프로퍼티 초기화 중 호출
      // read data
    });
  }
}

PersistentStateComponent:


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

  override fun loadState(state: MySettings) {
    val data = runReadAction { // 나쁨: loadState에서 읽기 액션 실행
      // read data
    }
    // ...
  }

  override fun noStateLoaded() {
    val data = runWriteAction { // 나쁨: noStateLoaded에서 읽기 액션 실행
      // write data
    }
    // ...
  }

  override fun initializeComponent() {
    val data = runReadAction { // 나쁨: initializeComponent에서 읽기 액션 실행
      // read data
    }
    // ...
  }

}

2024.2의 새로운 기능