Многие проекты с открытым исходным кодом пытаются уйти от использования Synchronized из-за его поведения с виртуальным потоком.
Что касается виртуальных потоков, я понимаю, что внутри блока Synchronized, в ситуациях, когда происходит сетевое соединение (которое обычно паркует поток) или файловый ввод-вывод, поток-носитель в идеале должен быть передан другому потоку, но он остается «закрепленным». Правильно ли я понимаю?
Иная ли ситуация с традиционной многопоточностью на основе ThreadPool? В случаях, когда асинхронная обработка происходит внутри синхронизированного блока, можно ли правильно передать поток-носитель другому потоку?
Кроме того, возникает ли аналогичная проблема в процессе получения блокировки для выполнения синхронизированного блока? Другими словами, когда другой поток выполняет синхронизированный блок, а виртуальный поток ожидает, остается ли он закрепленным до тех пор, пока блокировка не будет снята?
Мои вопросы можно резюмировать следующим образом:
public void someMethod() {
// Does Virtual Thread get pinned here, too?
synchronized(this) {
someIOMethods() // Virtual Thread gets 'pinned' here, right? How about classical ThreadPools?
}
}