Виртуальные потоки появились в Java 21 как лёгкая альтернатива потокам ОС.
До Java 23 им мешало одно ограничение: при входе в synchronized
поток пинился — то есть блокировал поток-носитель до выхода из блока.
Это снижало масштабируемость и мешало использовать synchronized
в коде с блокирующими операциями:
synchronized byte[] getData() {
return socket.getInputStream().read(...);
}
Даже в ожидании входа в блок поток оставался привязан к носителю, из-за чего приходилось переписывать код с использованием ReentrantLock.
В Java 24 это поведение изменено: пиннинг отключён — виртуальные потоки теперь могут входить в
synchronized
без блокировки поток-носителя.Теперь
synchronized
снова можно безопасно использовать с виртуальными потоками — просто и без обходных решений.😎 — если даже не пользовался ими