invokeAndWait を報告します。
PersistentStateComponent 初期化ライフサイクルメソッド:
loadStatenoStateLoadedinitializeComponentサービス初期化中の読み取り/書き込みアクションの実行、または 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 の新機能です