Реліз Java 21: Long live a new LTS!

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Минуло півроку, і цей день настав, знов! Офіційний реліз JDK 21 уже сьогодні (19 вересня), уже зараз! А це означає, що треба розібратися, що ж тут нового, бо це найбільший та вкрай важливий реліз для Java-спільноти.

Java 21 general availability

Ми, Oracle, та безпосередньо Java Platform Group, з гордістю оголошуємо про загальну доступність JDK 21. Цей реліз є дванадцятим за рахунком функціональним випуском, який зʼявляється в рамках шестимісячної каденції. Такий рівень передбачуваності дозволяє розробникам легко керувати впровадженням інновацій завдяки постійному потоку очікуваних покращень.

Java 21 general availability

Oracle надаватиме довгострокову підтримку Java 21 щонайменше протягом восьми років. Завдяки таким тривалим періодам підтримки організації та компанії мають гнучкість, яка дозволяє довше підтримувати додатки у виробництві з мінімальними витратами на обслуговування, а згодом мігрувати на власних умовах. На основі відгуків наших клієнтів, комʼюніті та використання в екосистемі Java, Oracle також оголосила, що довгострокова підтримка Java 11 була подовжена як мінімум до січня 2032 року. Це забезпечить щонайменше ще вісім років підтримки та оновлень від Oracle.

Вклад компаній у Java 21

Як і під час минулих релізів, Java 21 відзначає внесок багатьох людей та організацій у спільноту OpenJDK — ми всі разом створюємо Java!

Швидкість змін у релізах JDK протягом багатьох років залишалася практично однаковою, але за шестимісячної каденції темп, з яким надаються готові до використання функції (standard features) та покращення, різко збільшився.

Замість того, щоб вносити десятки тисяч виправлень і випускати близько сотні JEP (JDK Enhancement Proposal) кожні кілька років (як це було з релізами JDK 8 та JDK 9), покращення випускаються у скорочених функціональних релізах за більш керованим і передбачуваним шестимісячним графіком. Зміни, які вносяться в JDK, варіюються від значних нових функцій (Virtual Threads, Pattern Matching) до невеликих удосконалень для рутинного обслуговування JDK, виправлення помилок і поліпшення документації. Кожна зміна представлена у вигляді однієї фіксації стану JDK (відповідної дорелізної фази, наприклад, як зараз JDK 21 build 35) для одного релізу в bug-трекері JDK.

Із 24 196 тікетів JIRA, позначених як виправлені в Java 11 — Java 21 на момент їх GA, 17 288 були завершені людьми, що працюють в Oracle, тоді як 6 908 були внесені індивідуальними розробниками та розробницями, що працюють в інших компаніях. Переглянувши проблеми та зіставивши дані, отримані від правонаступників, ми отримали таку діаграму організацій, які спонсорували розробку внесків у Java:

У Java 21 з 2585 JIRA-тікетів, позначених як виправлені, 1868 було завершено командою Oracle, а 717 надано іншими членами спільноти розробників Java. Ми висловлюємо подяку розробникам, які працюють в таких організаціях, як Amazon, ARM, Azul, Google, Huawei, IBM, Intel, ISCAS, Red Hat, Rivos, SAP і Tencent, за їхній значний внесок. Ми вдячні за внесок менших компаній, таких як Bellsoft та Loongson, а також незалежних розробників, які в сукупності внесли 8% виправлень у Java 21.

Крім того, через програму OpenJDK Quality Outreach ми хотіли б подякувати проєктам FOSS, які надали чудові відгуки про тестування збірок раннього доступу Java 21, щоб допомогти поліпшити якість випуску:

  • Apache Commons
  • Apache ZooKeeper
  • AssertJ
  • BNYM Code Katas
  • JUnit5
  • Karate
  • MyBatis

Що нового у JDK 21

Поряд з багатьма оновленнями продуктивності, стабільності та безпеки, Java 21 надає десятки нових функцій. 15 з них є достатньо важливими для того, щоб отримати власні пропозиції щодо вдосконалення JDK (JEP), що охоплюють шість preview features та одну incubated feature.

JEP preview feature — це повністю визначений та реалізований функціонал мови або віртуальної машини платформи Java SE, але слід врахувати, що preview features не просто так у стані preview — функціонал або інтерфейс не є сталим. Ці нові можливості стають доступними у випусках функцій JDK, щоб забезпечити з розробниками зворотний зв’язок, заснований на реальному використанні нового коду, перш ніж нові компоненти мови та runtime стануть постійними в майбутньому випуску. Це також дає постачальникам інструментів з екосистеми Java можливість працювати над підтримкою функцій до того, як вони будуть фіналізовані в стандарті Java SE.

JEP Incubator Modules дозволяють надавати не кінцеві API та інструменти в руки розробників і користувачів, щоб зібрати відгуки, які в підсумку покращать якість платформи Java шляхом зворотнього звʼязку від користувачів до розробників.

15 JEP, що увійшли до релізу Java 21, згруповані у шість категорій, які відповідають ключовим довгостроковим проєктам у сфері технології Java та апаратної підтримки.

Project Amber

JEP 430: String Templates (Preview). Мета та цілі:

  • спрощує написання програм на Java, дозволяючи легко виражати змінні типу String, які містять значення, обчислені під час виконання;
  • покращує читабельність String, які поєднують текст і вирази, незалежно від того, чи вміщується текст в одному рядку коду (як у випадку з рядковими літералами), чи охоплює декілька рядків (як у випадку з text blocks);
  • підвищує безпеку Java-програм, які складають рядки з наданих користувачем значень і передають їх іншим системам (наприклад, створюють запити до баз даних), підтримуючи перевірку і перетворення як шаблону, так і значень вбудованих виразів;
  • зберігає гнучкість, дозволяючи бібліотекам Java визначати синтаксис форматування, що використовується в шаблонах рядків;
  • спрощує використання API, які приймають значення типу String, написані мовами, відмінними від Java (наприклад, SQL, XML і JSON);
  • дозволяє створювати нестрокові значення, обчислені з буквального тексту та вбудованих обчислень, без необхідності переходу через проміжне рядкове представлення.

Головна цінність JEP 430 — впровадити String-templates, які є вкрай корисними для різного типу промтів AI, HTML-templates та дуже простих JSON, XML, YAML.

JEP 440: Record Patterns. Мета цього JEP: ще глибше проробити patter matching для Java Record, що дасть змогу деконструювати відповідний Record на його складові.

JEP 441: Pattern matching for switch. Головною задачею є вдосконалити мову програмування Java за допомогою зіставлення шаблонів для виразів і операторів switch. Розширення зіставлення шаблонів на switch дозволяє перевіряти вираз на відповідність декільком шаблонам, кожен з яких виконує певну дію, що дозволяє лаконічно і безпечно формулювати складні запити, орієнтовані на дані.

JEP 443: Unnamed Patterns and Variables (Preview). Метою цього JEP є доповнити мову Java неіменованими шаблонами, які відповідають компоненту запису без зазначення імені або типу компонента, та неіменованими змінними, які можна ініціалізувати, але не використовувати. Обидва типи позначаються символом підкреслення _. Неіменовані шаблони та паттерни вже давно існують в інших мовах програмування, то ж настав час впровадити їх у Java та JDK.

JEP 445: Unnamed Classes and Instance Main Methods (Preview). Одною з проблем при вивченні мови програмування Java є їхня виразність та досить високий рівень складності. А якщо порівнювати простоту написання hello world з іншими мовами програмування типу Python, C, то ситуація стає взагалі сумною. Тож для спрощення вивчення мови програмування були впроваджені неіменовані класи, які допоможуть новачкам простіше орієнтуватися на самому початку. Метою такого рішення було бажання докорінно змінити баланс мов програмувань, показуючи простоту Java для дітей та студентів вишів.

Project Loom

JEP 444: Virtual Threads. Тут і казати нічого, вже було сказано і показано багато. Це одна із найгарячіших тем останнього року в спільноті Java. Тепер офіційно! Віртуальні потоки стали стандартним функціоналом JDK і дадуть змогу підвищити продуктивність мережевих застосунків у межах меншої кількості ресурсів.

JEP 446: Scoped Values (Preview). Метою команди Projet Loom є введення значень з певною областю видимості (доступності) значення, які можна безпечно та ефективно передавати методам без використання параметрів методу. Їм надається перевага перед локальними змінними потоку (ThreadLocal), особливо при використанні великої кількості віртуальних потоків. API ще у стані Preview feature. По суті, значення з областю видимості є неявним параметром методу. Це нібито кожен метод у послідовності викликів має додатковий, невидимий параметр. Жоден з методів не оголошує цей параметр, і тільки методи, які мають доступ до об’єкта scoped value, можуть отримати доступ до його значення (даних). Значення з областю видимості дозволяють безпечно передавати дані від того, хто їх викликає, до віддаленого абонента через послідовність проміжних методів, які не оголошують параметр для даних і не мають доступу до них.

JEP 453: Structured Concurrency (Preview). Перехід від асинхронної моделі програмування до структурного паралелізму вимагає наявності сегментів виконання паралельного коду. Для цього вводиться конструкція Structured Concurrency з метою спрощення паралельного програмування за допомогою API для структурованого паралелізму. Структурований паралелізм розглядає групи пов’язаних завдань, що виконуються в різних потоках, як єдину робочу одиницю, тим самим спрощуючи обробку та скасування помилок, підвищуючи надійність та покращуючи спостережливість.

Project Panama

JEP 442: Foreign Function & Memory API (3rd Preview). Як і декілька релізів до цього, метою було впровадити комплекс API, за допомогою якого Java-програми можуть взаємодіяти з кодом і даними поза межами runtime Java, а саме: мовами типу C/C++. Ефективно викликаючи нативні функції (тобто код за межами JVM) та безпечно отримуючи доступ до всієї області наявної пам’яті (тобто пам’яті, якою не керує JVM), API дозволяє Java-програмам викликати нативні бібліотеки та обробляти власні дані без крихкості та небезпеки JNI.

JEP 448: Vector API (Sixth Incubator). Основною метою є впровадження Java-реалізації до SIMD (векторних обчислень на регістрах процессорів архітектури amd64 та сімействі процесорів ARM). Векторні обчислення дозволяють робити багато математичних операцій над сегментами даних від 128 до 512 біт одночасно (розмірність залежить від типу, архітектури та покоління процесору). Ці операції дуже важливі для криптографії, алгебри великих чисел, обробки медіаконтекту та сучасних компіляторів.

Core Libraries

JEP 431: Sequenced Collections. Вводяться три нові типи Collections:

  • SequencedCollection
  • SequencedSet
  • SequencedMap

Та декілька нових методів для Collections.

SequencedCollection. Для забезпечення нових, уніфікованих методів, Java 21 вводить інтерфейс SequencedCollection, який, серед іншого, визначає два методи getFirst() та getLast(), представлені вище. Інтерфейс успадковується або реалізується тими інтерфейсами, елементи яких мають фіксовану послідовність:

  • List (тобто ArrayList, LinkedList)
  • SortedSet and its extension NavigableSet (TreeSet)
  • LinkedHashSet

На додаток до наведених вище методів, SequencedCollection також визначає:

  • void addFirst(E)
  • void addLast(E)
  • E removeFirst()
  • E removeLast()

SequencedSet Interface. Важливо знати, що addFirst(E) та addLast(E) мають особливе значення у SequencedSet: якщо елемент, що додається, вже існує, його буде переміщено на початок або кінець набору відповідно.

SequencedMap. SequencedMap пропонує такі методи:

  • Entry<K, V> firstEntry()
  • Entry<K, V> lastEntry()
  • Entry<K, V> pollFirstEntry()
  • Entry<K, V> pollLastEntry()
  • V putFirst(K, V)
  • V putLast(K, V)
  • SequencedMap<K, V> reversed()

І навіть більше:

  • SequencedSet sequencedKeySet() 
  • SequencedCollection<V> sequencedValues()
  • SequencedSet<Entry<K,V>> sequencedEntrySet()

Клас Collections було розширено деякими статичними методами утиліти, зокрема для послідовних колекцій:

  • newSequencedSetFromMap(SequencedMap map)
  • unmodifiableSequencedCollection(SequencedCollection c)
  • Collections.unmodifiableSequencedMap(SequencedMap m)
  • Collections.unmodifiableSequencedSet(SequencedSet s)

Performance Updates

JEP 439: Generational ZGC. Усім і так уже відомо, що ZGC позиціонується (і є таким насправді) як надшвидкий GC, який робить паузи типу stop the world непомітними для застосунку та обробки даних, запитів чи інших задач. Основна мета ZGC — скоротити паузи до менш ніж як 10 мс, а ідея Generational ZGC навіть більш амбітна — паузи до 1мс.

JEP 452: Key Encapsulation Mechanism API. Надважливий криптографічний функціонал забезпечення безпеки симетричних ключів шифрування. Загалом, будуть впроваджені популярні та стандартизовані алгоритми типу RSA-KEM, ECIES, NIST-кандидат.

Maintenance and Deprecation

JEP 449: Deprecate the Windows 32-bit x86 Port for Removal

JEP 451: Prepare to Disallow the Dynamic Loading of Agents

Висновки

Java залишається мовою програмування № 1 серед сучасних технологічних трендів. Як показує своєчасне впровадження покращень у Java 20, завдяки постійному ретельному плануванню та залученню екосистеми, платформа Java має всі можливості для сучасного розвитку та зростання у хмарі.

Новий реліз JDK 21 планує стати LTS (Long-Time-Support) версією і мати довгострокову підтримку. Тому зараз дуже добрий і правильний час оновлюватися, друзі!

Стежте за новинами та оновленнями за посиланнями:

  • Dev.java (спеціальний портал Oracle для поглиблення ваших знань з Java та участі у комʼюніті).
  • Inside.java (суто технічний блог, який ведуть архітектори та інженери, що розроблюють Java).
  • Inside.java (подксат про JDK, JVM, GC, core-libs і так далі).
  • Inside.java Newscasts (щотижневе ютуб-шоу винятково про Java).
  • Java on YouTube (усе про Java та екосистему).
  • OpenJDK mailing lists (місце, де можна дізнатися поточний стан речей у OpenJDK-комʼюніті).
  • Підписуйтесь на OpenJDK і Java on Twitter.
👍ПодобаєтьсяСподобалось13
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Спасибі за статтю.

Якщо б мені треба було написати на Java AWS Lambda щось складніше за todo app, що мені гуглити? Є якісь аналоги Spring? Самий спрінг стартує відносно повільно, пуста апка 5 секунд.

Якщо дуже треба Spring, то в них є Spring Functions. Там є все необхідне для AWS. Але я все ще вважаю це заскладним і не маю кращої ідеї, ніж користуватися нативними бібліотеками для написання Serverless Функцій, бо в десятки разів менше залежностей у вашому застосунку.

Лямда це ж мікро чи навіть нано-сервіс. Яка складна логіка там має бути? Для роботи з базами та сторонніми вебсервісами вистачить звичних бібліотек, немає особливого сенсу тягнути сюди спрінг, хіба що просто через звичку.

Типова реакція: «навіщо spring і сюди тягнути?!». Вона вірна загалом, окрім декількох аспектів: — оригінальна кодова база (була) є написана на Spring (Spring Cloud). Із серверлесс досі найбільшою проблемою є деплоймент-пакет — частіше за все це якийсь вироджений архів або контейнер із купою обмежень. І в таких випадках чим менший розмір на диску, там краще. Саме тут спрінг просто програє так швидко, що навіть maven архетип не встигає встановитися =)

насправді задача про те що тягнути в serverless spring не рекоммендує сам amazon.

Minimize the complexity of your dependencies. Prefer simpler frameworks that load quickly on execution environment startup. For example, prefer simpler Java dependency injection (IoC) frameworks like Dagger or Guice, over more complex ones like Spring Framework.

ідеологічно lambdas це про максимально просту інтеграцію готових різних cloud рішень/сервісів і багатоступінчаті workflow(що і формують складну архітектуру що там буде з 10-ок різних aws сервісів що взаєимодіють між собою) — а не про розробку api на базі фреймворків котрі мають величезний власний code base для різних задач.

docs.aws.amazon.com/...​de/design-principles.html
Serverless applications usually comprise several AWS services, integrated with custom code run in Lambda functions.

Немає сенсу тулити це в lambda — якщо потрібен spring що буде кверяти якийсь postgress і роздавати json-и, беріть просто Beanstalk і диплойте туди свої веб апки.

Java залишається мовою програмування № 1 серед сучасних технологічних трендів

голословное заявление

Ваша думка може не збігатися із цим висловлюванням, але опитування показують, що ситуація саме така. І ось декілька фактів:
* студенти все більше схиляються до вибору Java при карʼєрному орієнтуванні.
* у той час як писати hello world простіше на Python, але банківську систему буде реалізовано на Java.
* наявність таких ініціатив як MicroProfile є дуже великою перевагою в порівнянні із іншими технологіями типу node.js, python, golang

я б ще міг запропонувати аргументів, але й цього буде вдосталь.

студенти все більше схиляються до вибору Java при карʼєрному орієнтуванні.

можна посилання на це і на опитування

* студенти все більше схиляються до вибору Java при карʼєрному орієнтуванні.

чому не Python? результати якогось конкретного опитування?

* у той час як писати hello world простіше на Python, але банківську систему буде реалізовано на Java.

у той час як писати банківську систему простіше на Java, Kubernetes, Docker, Terraform будуть реалізовані на Go.

* наявність таких ініціатив як MicroProfile є дуже великою перевагою в порівнянні із іншими технологіями типу node.js, python, golang

Тобто ви зараз зрівняли специфічний білд Java з іншими мовами в цілому? Ну тоді так:
* наявність таких ініціатив як container image з single Go binary є дуже великою перевагою в порівнянні з роздутим MicroProfile

можна посилання на це і на опитування

Це опитування проводилося в США так званим college board серед майже усіх великих ВИШів із IT спеціальностями. Я трохи дотичний до цього, як буде саме що пошерити — напишу.

Kubernetes, Docker, Terraform будуть реалізовані на Go.

Вірно, а до цього був OpenStack і Python, був Chef та Puppet з Ruby, але чомусь я не бачу засилля цих інструментів у сьогоденній розробці. Щодо Kubernetes, Istio і майже усього CNFC, то це й не дивно, бо всі розуміють хто просуває ініціативи. Із Terraform ситуація трохи складна, тому і виникли ініціативи типу Pulumi, тому що golang для багатьох ця мова є лише проблемою. А от для OpenSource я сам обирав Golang не один раз, буду відвертим (бо багато працюю із Serverless).

Тобто ви зараз зрівняли специфічний білд Java

Ви трохи не зрозуміли MicroProfile, це надпотужна ініціатива в спільноті мета якої створити уніфікований набір інструментів, плагінів, інджекшенів для створення cloud-native мікросервісів без привʼязки до транспортного протоколу.

container image з single Go binary

це якщо ви hello-world пишите, в продакшені ж ситуація зовсім інша: golang плагіни, native бібліотеки. Єдиний плюс Golang в данному випадку, так це уніфіковані інтерфейси HttpRequest, HttpResponse. А MicroProfile це про час і кошти на розробку, бо з коробки є майже все що треба для інтеграції у кубери чи то хмари (oracle cloud, aws, gcp). Ну а про компіляцію в native image я вже не кажу, бо є такі проекти як GraalVM з Java SE які створять вам native image з Java коду.

Kubernetes, Docker, Terraform будуть реалізовані на Go.

То й що? Най буде

Хочете ви того чи ні, а джава це де факто лінгва франка для сегменту великого бізнесу. Веб екоммерс рітейл логістика банкінг оце все шо генерує грошенята в промислових обсягах там джава є дефолтною мовою кампухтирів.

Думаю Java потеряет позиции если сильно изменится подход к созданию сервисов на бекенде. Сейчас же все +/- то же самое и Java выглядит наиболее зрелой технологией с достаточно хорошей скорость. Возможно конкурентом будет Go в перспективе если люди начнут писать меньше сервисы использую более удобные инструменты теплая или все перейдут на лямбды где Java тоже будет слабей языков изначально рассчитанных на лямбды

Не існує мов «ізначально рассчітаних» на serverless. Нагадаю, AWS Lambda це оркестратор firecracker над гіпервізором. Тобто лямбда — віртуальна машина. У всіх інших серверлесс — це контейнери (cgroup). Отже, є рантайми більш схильні до швидкого старту (компільовані) і швидкого прогріву, а є інтерпретатори (Python, node). Останні — найгірші для серверлесс, бо при малих ресурсах запуск самого інтерпретатора — дуже дороге задоволення. У той же час є Java, із нею ситуація зовсім інша — можна скомпілювати код в native image, а можна використовувати AppCDS і кеш з класами, що зробить запуск швидким, а прогрів JVM ще ближчим у часі. Е ще ініціатива CRaC або point-restore-in-time, це коли можна створити JVM, прогрітим зробити снепшот і перенести у якості рантайму у контейнері, приклад. Я вже не кажу, про збірку через jlink кастомногш рантайму без зайвих компонентів. І вже при цьому всьому Java легко може конкурувати по швидкості запуску із Golang та C++ в серверлесс.

Да, все так.

CRaC

и подобные штуки как раз появляются потому что появляется новый подход, на который старая (1.8 например) Java не сильно рассчитана. В том же Go это есть уже из коробки. Возможно дальше с учетом развития AI придумают язык который тоже будет учитывать AI и будет более высокого уровня.
Я вот думаю что есть область драйверов и системного программирования и там как был Си основным языком так и остается и думаю мало кто подвинет его оттуда в ближайшее время, но при этом появились новые области где Си уже не так хорош.
Думаю через Н лет Яву ждет что либо похожее.

У вас є прояви релігійної любові до Го > Джава.
Але, не кожен програміст зможе так само полюбити го. Не дарма його називають самою огидною на вигляд мовою програмування.
Також, джава для ентерпрайзу стала такою популярною, тому що нею можна дуже легко виражати складні задачі, багатоступеневі та заплутані. На го, якщо твоя задача для бекенду не «Витягни з бд інфу, та скинь в жсоні на фронт», то вже починаються тут проблеми. (Кибернетіс та докери, які ви згадали, насправді, мають ± такого рівня задачі, бо самі ВМ написані на С, докер їх тільки запускає).
Також го, при високих навантаженнях починає вести себе непередбачуванго. Як наприклад легковажні горутини, які під зав’язку забивають пам’ять.
Тому, якщо колись джаву на щось і замінять, то це повинна бути не менш експресивна мова і швтдка мова. Тому я радше повірю в Раст чи Котлін, аніж в Го)

Також, джава для ентерпрайзу стала такою популярною, тому що нею можна дуже легко виражати складні задачі, багатоступеневі та заплутані.

Це не так
Java для ентерпрайзу стала популярною, бо у момент її появи її просували як «безпечну мову програмування — ваші програмісти не зможуть напартачити, всі програми виконуються у контрольованому безпечному середовищі».
Це, звичайно, була не зовсім правда, але головне було переконати менеджерів :)

Альтернативами для ентерпрайзу були C++ (власне, на недоліки якого і був націлений піар Java), VB або Delphi (статистично мала доля, хоч як Борланд не пижився).
Або зоопарки систем, написаних на купі пропрієтарних мов. Навіть IBM зі своїм Visual Age старався (Smalltalk пацани! :) )

У самій Java нема нічого дуже особливого, що би якось підтримувало «вираження складних, багатоступеневих і заплутаних задач» — все залежить від прямоти рук.
Навіть більше, ранні версії Java, ще до дженеріків, були тупі і повільні — сиди і займайся «боксінгом-анбоксінгом».

На го, якщо твоя задача для бекенду не «Витягни з бд інфу, та скинь в жсоні на фронт», то вже починаються тут проблеми.

А які проблеми, можеш привести приклад?
З того, що я бачу — Go цілком собі Тюрінг-повна мова і на ній можна писати все те, що і на Java. Просто на ній не треба писати, як на Java
«Програму на Фортрані можна написати на будь-якій мові» ;)

А які проблеми, можеш привести приклад?
З того, що я бачу — Go цілком собі Тюрінг-повна мова і на ній можна писати все те, що і на Java

Питання не в мові а в екосистемі.
Java, Spring, maven дозволяє зробити все стандартне як конструктор, тупо складаючи спрінг бут плагіни. Готові інтеграції є для всього.

на который старая (1.8 например) Java не сильно рассчитана. В том же Go это есть уже из коробки.

Порівняв реліз джави з 2014 і GO з першим релізом у 2012=)
Ти б ще го з делфі порівняв)

E getFirst()
E getLast()
E removeFirst()
E removeLast()

but why E, not Optional !?!?

ібо нєфіг ))
тому що це з Deque, і по ідеї буде кидати ексепшн

Саме так. Дякую, що випередили мене.

ок, має сенс тоді.
Але все одно, тоді треба було б ще такі методи додати, наприклад:
Optional E getHead()
Optional E getTail()
Optional E getAt()
Тому що бенефітів якихось в методі E getFirst() перед E get(0) щось не видно. Ну хіба там де Deque тепер більше реалізацій можна використати.
Де той JEP обговорювали? Цікаво, чи це просто ніхто не пропонував, чи вирішили відкинутиз якихось міркувань?

Structured Concurrency дуже схоже на async/await у .NET ???

Дякую що запитали, я не дуже спеціаліст в .NET, нажаль.

Structured Concurrency являє собою сегмент коду який по суті своїй є синхронним блоком виконання, але всередині цього блоку можна запускати асинхронні блоки, які можна легко профілювати навідміну від асинхронного коду з конкретною точкою входу, я наприклад в Python 3.

Ось тут я розписував що воно таке dou.ua/forums/topic/39928

Зовсім не схоже — .net використовує асинхронний неблокуючий api що ранить все на thread pool(по дефолту там де не має ui треду) і заточений чисто під i/o (для cpu bound у них там купа іншого інструментарію), натомість java наче пропонує цей інструмент для cpu bound/i/o bound одночасно і ранить все на lightweight тредах(яких у дотнеті немає) і блокує у місцях синхронізації — що більше насправді зручно бо прокидувати асинхронну сигнатуру по стеку виклику це вже вчорашній день, але дотнету це змінити виявилось складніше(нещодавно там заморозили роботу над green threads що мали замінити типовий асинхронний апі на більш простий до того що є у go і тут у java). як результат жити з цим кривим async/await дотнетчикам до кінця днів схоже.

Формально так, за допомогою фабрики Thread.ofPlatform().factory() або Thread.ofVirtual().factory() можна створити блок Structured Concurrency під певний вид тредів. Але в документації до віртуальних тредів сказано, що вони ефективні лише в I/O задачах бо там є висока частота перемикань контекстів (очікування I/O івентів). В найгіршому випадку, CPU-задача запущена на віртуальному потоці призведе до блокування потоку-носія (carrier thread, аналогічно до концепту в Golang) що виконує віртуальний поток. Тому треба бути уважним який потом за замовчуванням створюється в Structured Concurrency.

В найгіршому випадку, CPU-задача запущена на віртуальному потоці призведе до блокування потоку-носія (carrier thread, аналогічно до концепту в Golang) що виконує віртуальний поток. Тому треба бути уважним який потом за замовчуванням створюється в Structured Concurrency.

ну якщо в java на 10к віртуальних тредів задієються 20 тредів OS то це не виглядає на проблему взагалі — навідміну від дотнету з їх thread pool де вони крутять фактично OS треди і задіюють окремий тред на кожну задачу, хоча формально це і .net абстракція і там треба паритися з цими блокуванням постійно в клієнтському апі щоб не почало лагать.

проблема таки буде.
Це, мабуть трохи схоже, якщо у вебсервері запустити parallelSream важкі обчислення на дефолтному ThreadPool десь у сервісі, в такому разі може стати обробка вхідних веб запитів.

Фактично ні, бо виконуються обчислення фактору паралелізму для обох типів потоків на старті. JVM порахує скільки треба створити платформених потоків (ForkJoinPool), та окремо порахує скільки треба потоків-носіїв для віртуальних потоків, які будуть створюватися через новий ExecutorService. В будь-якому випадку просадки не буде видно, бо в обох випадках пули потоків вже існують.

Але, в теорії, треба уникати таких ситуацій. Так каже «command responsibility segregation concept», типу довгі та важки запити повінню оброблятися окремим компонентом.

Загалом ні, не буде. Віртуальних тредів для очікування чогось хоч мільйон зробіть.
Почитайте більш детально про віртуальні треди.

Підписатись на коментарі