Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JJUG CCC 2025 Fall: Virtual Thread Deep Dive

Avatar for ternbusty ternbusty
November 15, 2025

JJUG CCC 2025 Fall: Virtual Thread Deep Dive

Avatar for ternbusty

ternbusty

November 15, 2025
Tweet

More Decks by ternbusty

Other Decks in Programming

Transcript

  1. ˜-:$PSQPSBUJPO  "ZBLP)BZBTBLB -*/&Ϡϑʔגࣜձࣾ 4PGUXBSF&OHJOFFS ೥౓ೖࣾ 48"5νʔϜॴଐ 8FCόοΫΤϯυྖҬͰશࣾԣஅతͳٕज़ࢧԉΛ࣮ࢪ ϝΠϯ͸ 4QSJOH#PPU

    +BWB,PUMJO • 3"(ٕज़Λར༻ͨ͠ۀ຿ޮ཰Խπʔϧ 4FFL"* ։ൃ • :BIPP஌ܙାͷ "*ճ౴ػೳʮΈΜͳͷ஌ܙାʯ։ൃ • ੜ੒"*Λར༻ͨ͠ 2"ྖҬͷੜ࢈ੑ޲্πʔϧ։ൃ • :BIPP͖ͬͣϑΟϧλϦϯάػೳ "*ಋೖ ˜-:$PSQPSBUJPO
  2. ˜-:$PSQPSBUJPO • 75͸ඞཁʹԠͯ͡ 04Ϩϕϧͷ $BSSJFS5ISFBE $5 ʹϚ΢ϯτ͞ΕͯॲཧΛߦ͏ • *0଴ͪʹͳΔͱɺ75 ͸

    $5͔ΒΞϯϚ΢ϯτ͞Εɺͦͷ $5͸ଞͷλεΫͷϚ΢ϯτ͕ ՄೳʹͳΔ • *0ॲཧ͕׬ྃ͢Δͱɺ75 ͸࠶ͼ $5ʹϚ΢ϯτ͞Εɺॲཧ͕࠶։͞ΕΔ  7JSUVBM5ISFBE 75 ͷΑ͋͘Δઆ໌ $BSSJFS5ISFBE 75 75 DG4QSJOH'SBNFXPSL4QSJOH#PPUͷ஫໨ػೳ঺հ *0଴ͪൃੜ *0ॲཧ׬ྃ 75 75 75 Կ΋͠ͳ͍ 75 Կ΋͠ͳ͍
  3. ˜-:$PSQPSBUJPO લఏ+BWBͷϝϞϦۭؒʹ͍ͭͯ؆୯ʹ෮श ώʔϓ ελοΫ ελοΫ OFX͞Εͨ ΦϒδΣΫτͷ࣮ମ͸ શͯώʔϓʹࡌΔ ελοΫ͸ 04εϨου

    ຊ͝ͱʹ .#ʙ֬อ͞Ε ελοΫϑϨʔϜ͕֨ೲ ͞ΕΔ QSJOU  0CKFDUP EP4PNFUIJOH  0CKFDUP  *OUJ 0CKFDUP ΦϒδΣΫτͷ࣮ମͰ͸ͳ͘ ͦͷࢀর͕֨ೲ͞ΕΔ 
  4. ˜-:$PSQPSBUJPO લఏ1MBUGPSN5ISFBE͸ϝϞϦΛͲ͏࢖͏ʁ ώʔϓ ελοΫ ελοΫ εϨουͷελοΫϑϨʔϜ 1MBUGPSN5ISFBE͋ͨΓ .#֬อ͕ ඞཁͳͷͰ਺ඦສຊͳͲେྔʹੜ΍͢ͷ͸ෆՄೳ ελοΫʹ͋Δม਺ͷΠϯελϯεͰ͸ͳ͘

    ͦͷࢀর͕֨ೲ͞Ε͍ͯΔͨΊத਎͸εΧεΧ 5ISFBE*OTUBODF  5ISFBEΦϒδΣΫτ ࣗମ΋ΠϯελϯεͳͷͰ NFUBEBUB ͳͲ͕ώʔϓʹ ֨ೲ͞Ε͍ͯΔ • TUBSU ͳͲͷϝιου • 5ISFBEͷ JE • 5ISFBEͷ໊લ • 5ISFBE-PDBM ͷ .BQ ͳͲ $GIUUQTHJUIVCDPNPQFOKELKELCMPCNBTUFSTSDKBWBCBTFTIBSFDMBTTFTKBWBMBOH5ISFBEKBWB
  5. ˜-:$PSQPSBUJPO  7JSUVBM5ISFBEͷΫϥεఆٛΛݟͯΈΑ͏ final class VirtualThread extends BaseVirtualThread { //

    தུ private final Executor scheduler; // தུ private volatile int state; // தུ private final Continuation cont; ૎͍ͬͯ͘ͱ 5ISFBEΫϥεΛܧঝ͍ͯ͠ΔͷͰ 5ISFBE-PDBM.BQ ͱ͔΋࣋ͬͯΔ ͳΜΒ͔ঢ়ଶΛ ͍࣋ͬͯΔΒ͍͠ $POUJOVBUJPOͬͯ ͳΜͩʜʜʁ DGIUUQTHJUIVCDPNPQFOKELKELCMPCNBTUFSTSDKBWBCBTFTIBSFDMBTTFTKBWBMBOH7JSUVBM5ISFBEKBWB
  6. ˜-:$PSQPSBUJPO  $POUJOVBUJPO ܧଓ • ͜Ε͕͖ͬ͞ͷʮελοΫϑϨʔϜΛอଘͯ͠ॻ͖ग़ͨ͠΋ͷʯͷਖ਼ମ public class Continuation {

    // தུ private StackChunk tail; // தུ private volatile boolean mounted; // தུ private Object[] scopedValueCache; ࣮ࡍͷελοΫσʔλ͸ 4UBDL$IVOL ͱͯ͠อ࣋͞Ε͍ͯΔ DGIUUQTHJUIVCDPNPQFOKELKELCMPCNBTUFSTSDKBWBCBTFTIBSFDMBTTFTKELJOUFSOBMWN$POUJOVBUJPOKBWB
  7. ˜-:$PSQPSBUJPO  ώʔϓ্ʹελοΫͷঢ়ଶΛอ࣋͢Δ࢓૊Έ • ελοΫΛҰؾʹϝϞϦʹॻ͖ग़͢ͷͰ͸ͳ͘ɺখ͍͞୯Ґͷ $IVOLʹ෼͚ɺ ͦͷ -JOLFE-JTUͱͯ͠อ࣋ • $POUJOVBUJPO͸

    -JOLFE-JTUͷ຤ඌ΁ͷࢀরΛอ͍࣋ͯ͠Δ • ࠷খݶͷϝϞϦΛอ࣋͠ɺඞཁʹԠͯ͡৳ͼ͍ͯ͘ܗ public final class StackChunk { // தུ private StackChunk parent; // ࣮ࡍͷελοΫσʔλ΋อ࣋͢Δ ҰͭલͷνϟϯΫ΁ͷࢀরΛอ࣋͢Δ DGIUUQTHJUIVCDPNPQFOKELKELCMPCNBTUFSTSDKBWBCBTFTIBSFDMBTTFTKELJOUFSOBMWN4UBDL$IVOLKBWB
  8. ˜-:$PSQPSBUJPO • *0࣌ʹιέοτΛϒϩοΩϯάϞʔυͰར༻ • SFBE  ͷ݁Ռ͕ฦͬͯ͘Δ *0͕׬ྃ͢Δ ·Ͱ 1MBUGPSN5ISFBE͸

    ϒϩοΫ͞Εଓ͚Δ • ͭ·ΓϒϩοΩϯά *0  લఏ1MBUGPSN5ISFBEͰͷ *0 1MBUGPSN 5ISFBE Կ΋͠ͳ͍ SFBE TZTDBMM SFBE ݁Ռͷड͚औΓ 7JSUVBM5ISFBEΛར༻͠ͳ͍৔߹͸Ͳ͏ͳΔʁ
  9. ˜-:$PSQPSBUJPO 7JSUVBM5ISFBEͷεέδϡʔϦϯάશମ૾ 7JSUVBM5ISFBE 75 SFBE  *0݁Ռड͚औΓ 36//*/( 36//*/( 1"3,&%

    6/1"3,&% &"("*/ FQPMM@XBJU  Ͱ *0λεΫ׬ྃ଴ͪ 'PSL+PJO1PPM ʹ 5BTLΛεέδϡʔϧ 1PMMFS 5ISFBE 4DIFEVMFS $BSSJFS 5ISFBE GE Λొ࿥ εέδϡʔϦϯά ॱ൪଴ͪ 75 75 SFBE  VONPVOU NPVOU
  10. ˜-:$PSQPSBUJPO 7JSUVBM5ISFBEͷεέδϡʔϦϯάશମ૾ 7JSUVBM5ISFBE 75 SFBE  *0݁Ռड͚औΓ 36//*/( 36//*/( 1"3,&%

    6/1"3,&% &"("*/ FQPMM@XBJU  Ͱ *0λεΫ׬ྃ଴ͪ 'PSL+PJO1PPM ʹ 5BTLΛεέδϡʔϧ 1PMMFS 5ISFBE 4DIFEVMFS $BSSJFS 5ISFBE GE Λొ࿥ εέδϡʔϦϯά ॱ൪଴ͪ 75 75 SFBE  VONPVOU NPVOU
  11. ˜-:$PSQPSBUJPO • 7JSUVBM5ISFBEͷར༻͕ݕ஌͞ΕΔͱɺιέοτ͸ϊϯϒϩοΩϯάϞʔυʹ • SFBE  ൃߦޙɺ݁Ռ͕͙͢ʹಘΒΕͳ͍৔߹͸ଈ࠲ʹ &"("*/͕ฦ٫͞ΕΔ  1MBUGPSN5ISFBEϒϩοΫݕ஌ͷ࢓૊Έ

    7JSUVBM5ISFBEΛར༻͢ΔͱͲ͏ͳΔʁ • &"("*/ฦ٫͸ *0։࢝ͷ஌Βͤʂ • ΠϕϯτϧʔϓεϨουͰ͋Δ 1PMMFS5ISFBEʹ౰֘ GJMF EFTDSJQUPS͕ొ࿥͞Εɺ*0ͷ ݁Ռ͕དྷͨΒ௨஌Λड͚औΕΔ Α͏ʹͳΔ • 75͸ VONPVOU͞ΕɺελοΫ͕ $POUJOVBUJPO΁ୀආ͞Εͨঢ়ଶ 1"3,&% ʹͳΔ
  12. ˜-:$PSQPSBUJPO  ࣮ߦͯ֬͠ೝͯ͠ΈΑ͏ #37 "Read-Poller" RUNNABLE 2025-10-28T15:50:05.879962Z at java.base/sun.nio.ch.KQueue.poll(Native Method)

    at java.base/sun.nio.ch.KQueuePoller.poll(KQueuePoller.java:68) at java.base/sun.nio.ch.Poller.pollerLoop(Poller.java:248) at java.base/java.lang.Thread.run(Thread.java:1474) at java.base/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:148) #34 "" virtual WAITING 2025-10-28T15:50:05.881511Z at java.base/java.lang.VirtualThread.park(VirtualThread.java:738) at java.base/java.lang.System$1.parkVirtualThread(System.java:2284) at java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:367) at java.base/sun.nio.ch.Poller.poll(Poller.java:197) // தུ at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:307)
  13. ˜-:$PSQPSBUJPO • 1PMMFS5ISFBE͕ *0݁Ռ౸ண௨஌Λ ड͚औΔͱɺ75 ͸ 1"3,&%͔Β 6/1"3,&% ࣮ߦՄೳঢ়ଶ 

    ʹͳΔ • ࣮ߦՄೳͳͷͰɺεέδϡʔϥʹొ࿥ ͞ΕɺϚ΢ϯτͷॱ൪͕ճͬͯ͘Δͷ Λ଴ͭ • σϑΥϧτͰ͸'PSL+PJO1PPM ͷ εέδϡʔϥʹొ࿥͞Εɺ 'PSL+PJO1PPM ಺ͷ $BSSJFS 5ISFBEʹNPVOU ͞ΕΔͷΛ଴ͭ  *0݁Ռ͕ฦ͖ͬͯͨΒͲ͏ͳΔʁ 7JSUVBM5ISFBE 75 1PMMFS 5ISFBE 4DIFEVMFS $BSSJFS 5ISFBE
  14. ˜-:$PSQPSBUJPO • 'PSL+PJO1PPM ͸ 1MBUGPSN5ISFBEͷ QPPM • 75͸σϑΥϧτͰ͜ͷ QPPMͷεϨου্ʹ NPVOU͞ΕΔ

    • εϨου਺͸σϑΥϧτͰ $16ίΞ਺ͱಉ͡ è $BSSJFS5ISFBE͸͍͍ͤͥ $16ίΞ਺͘Β͍ͷຊ਺͔͠ͳ͍ʂ • ϫʔΫεςΟʔϦϯάΞϧΰϦζϜ • Ωϡʔ͸֤ 1MBUGPSN5ISFBEʹ͋Δ͕ɺࣗ෼ͷΩϡʔ͕ۭͷ৔߹͸ଞͷ εϨου͔ΒλεΫΛୣ͑Δ • ͦͷͨΊɺ 1MBUGPSN5ISFBE͸ࣗ෼ͷλεΫ͕ऴΘͬͨΒଞͷεϨουͷ λεΫΛ࣮ߦ͢Δ͜ͱ͕Ͱ͖ɺޮ཰తͳॲཧ͕Մೳ  'PSL+PJO1PPM ͬͯԿʁ DGIUUQTEPDTPSBDMFDPNKBWBTFKQEPDTBQJKBWBVUJMDPODVSSFOU'PSL+PJO1PPMIUNM
  15. ˜-:$PSQPSBUJPO • Ϛ΢ϯτͷॱ൪͕ճ͖ͬͯͨΒɺ 75͸ $BSSJFS5ISFBEʹϚ΢ϯτ͞ΕΔ • 75ͷঢ়ଶ͸ 36//*/(ʹ • ελοΫ΋

    $POUJOVBUJPO͔Β෮ݩ͞Ε͍ͯΔ • ͦͷޙվΊͯ SFBE  Λൃߦ͢Δͱɺࠓ౓͸ ݁Ռ͕౸ணࡁΈͳͷͰଈ࠲ʹ*0݁Ռ͕ ಘΒΕΔ  ॱ൪͕ճ͖ͬͯͨΒ NPVOU͞ΕΔ 7JSUVBM5ISFBE 75 1PMMFS 5ISFBE 4DIFEVMFS $BSSJFS 5ISFBE
  16. ˜-:$PSQPSBUJPO • +&1ͷஈ֊ +%, ʹ͸ɺຊདྷ VONPVOU͞ΕΔ΂͖ 75͕ $5ʹݻఆ͞Εͯ ֎Εͳ͘ͳͬͯ͠·͏໰୊ 1JOOJOH

    ͕ใࠂ͞Ε͍ͯΔ • ಛʹ TZODISPOJ[FEϩοΫͰϒϩοΩϯάͳૢ࡞Λͨ͠৔߹ VONPVOUͰ͖ͳ͘ ͳͬͯ͠·͏ݱ৅͕໰୊ͱͳ͍ͬͯͨ • എܠ • 4ZODISPOJ[FEϩοΫ͸ɺϩοΫͷॴ༗ऀ৘ใͱͯ͠ 1MBUGPSN5ISFBEΛ ه࿥͢Δ • ΋ͦ͠ͷ 1MBUGPSN5ISFBE্ͷ 75͕ VONPVOUͯ͠ GSFFʹ ͳͬͨΓɺผͷεϨου͕ NPVOU͞ΕͨΓͯ͠͠·͏ͱɺॴ༗ऀෆࡏʹ ͳͬͨΓɺॴ༗ऀ͕มΘͬͯ͠·ͬͨΓ͢Δ • ͦͷͨΊɺ΍Ήͳ͘ 1MBUGPSN5ISFBEΛϒϩοΫ͢ΔରԠΛ࠾͍ͬͯͨ  1JOOJOH໰୊ͱ͸ʁ +%,Ҏલʹଘࡏͨ͠໰୊఺
  17. ˜-:$PSQPSBUJPO  ੑೳ௿ԼͰ͸ࡁ·ͣʹσουϩοΫ͕ى͜Δέʔε΋ +%,ҎલͰಛʹ໰୊ʹͳ͍ͬͯͨ఺ final ReentrantLock lock = new ReentrantLock(true);

    lock.lock(); // தུ Thread unpinnedThread = Thread.ofVirtual().name("unpinned").start(takeLock); // தུ List<Thread> pinnedThreads = IntStream.range(0, Runtime.getRuntime().availableProcessors()) .mapToObj(i -> Thread.ofVirtual.start(() -> { synchronized (new Object()) { takeLock.run(); }})).toList(); // தུ lock.unlock(); 3FFOUSBOU-PDL ͷϩοΫ ΛऔಘͰ͖Δ͕ 1MBUGPSN 5ISFBEΛ NPVOUͰ͖ͳ ͍ͷͰ଴ͪ 1MBUGPSN5ISFBEΛ NPVOU͍ͯ͠Δ͕ 3FFOUSBOU-PDL ͷϩοΫΛ औಘͰ͖ͳ͍ͷͰ଴ͪ IUUQTHJTUHJUIVCDPN%BOJFM5IPNBTCDGEEFFEBCGGDF
  18. ˜-:$PSQPSBUJPO • 4ZODISPOJ[FEϒϩοΫ಺ͷ QJOOJOH໰୊͕ղফ͞Εͨʂ • +7.ͷϞχλͷ࣮૷Λݟ௚͠ɺϞχλͷॴ༗ऀΛ 04εϨουͰ͸ͳ͘ Ծ૝εϨουͱඥ෇͚ΔΑ͏ͳมߋ͕ߦΘΕͨ • ϩοΫͷ࣮૷͸

    3FFOUSBOU-PDL Ͱ͸ͳ͘ TZODISPOJ[FEͰॻ͍ͯ΋໰୊ͳ͘ͳͬͨ • ͨͩ͠ɺQJOOJOH ໰୊͕ղফ͞Ε͚ͨͩͰ͋ͬͯɺϩοΫऔಘ଴ͪࣗମʹ࣌ؒ͸ ͔͔ΔͷͰ஫ҙ • +%,Ҏ߱΋ҎԼͷΑ͏ͳྫ֎తͳέʔεͰQJOOJOH͸ൃੜ͠͏Δ͕ɺଟ͘ͷέʔε Ͱ͸໰୊ʹͳΒͳ͘ͳͬͨ • γϯϘϧղܾͷ଴ͪͷؒͷϒϩοΩϯάૢ࡞ • ΫϥεॳظԽͷ଴ͪͷؒͷϒϩοΫϯά • +/*΍ωΠςΟϒίʔυݺͼग़͠ʹΑΔϒϩοΩϯά  +&1ʹΑΔվળ఺ +%,Ҏ߱ͷݱঢ় DGIUUQTPQFOKELPSHKFQT
  19. ˜-:$PSQPSBUJPO • $16CPVOEͳॲཧʹ͍ͭͯ 75Λར༻ͯ͠ੑೳ޲্Λظ଴͢Δ • 6ONPVOU͞ΕΔ༨஍ͷͳ͍ॲཧΛ࣮ߦͨ͠ͱ͜ΖͰ 75ͷԸܙ͸ͳ͍ • 7JSUVBM5ISFBEΛ QPPMJOH͢Δ

    • 75͸ 1MBUGPSN5ISFBEͱҧͬͯߴՁͰ͸ͳ͍ͷͰɺQPPM͢Δҙຯ͕ͳ͍ • λεΫ͝ͱʹେྔੜ੒ɾେྔഁغ͢Δઃܭࢥ૝ • ಉ࣮࣌ߦ਺Λ੍ݶ͢ΔҙਤͰ QPPMΛ࢖͍͍ͨ৔߹͸ɺTFNBQIPSFΛ༻͍Δ͜ͱ ͕ਪ঑͞Ε͍ͯΔ  7JSUVBM5ISFBEͷΞϯνύλʔϯ DGIUUQTPQFOKELPSHKFQT
  20. ˜-:$PSQPSBUJPO • 7JSUVBM5ISFBE͸ 5ISFBEΛܧঝ͍ͯ͠ΔͷͰɺ֤7JSUVBM5ISFBEʹ͍ͭͯݻ༗ͷ 5ISFBE-PDBM Λอ࣋ͨ͠ΓಡΜͩΓॻ͍ͨΓͰ͖Δ͕ʜʜ • ಉ࣌ʹେྔͷ 7JSUVBM5ISFBEΛىಈͨ͠৔߹ɺͦͷ਺ͱಉ͚ͩ͡ͷ 5ISFBE-PDBM

    ͕ॳظԽ ώʔϓʹࡌΓɺͦͷޙ 75ͷऴྃʹ൐ͬͯશͯഁغ͞Ε ΔܗʹͳΔ • ͜ͷڍಈ͸ɺ5ISFBE-PDBM ͷ࢖͍ํʹΑͬͯ͸໰୊ʹͳΓ͏Δ  5ISFBE-PDBM Λར༻͢Δ৔߹ͷ஫ҙ఺
  21. ˜-:$PSQPSBUJPO • .%$ .BQQFE%JBHOPTUJD$POUFYUT  ͳͲɺܰྔͳDPOUFYUΛอ͍࣋ͨ͠ ύλʔϯ • ཧ༝ •

    ͦ΋ͦ΋ܰྔͳͷͰੜ੒ίετ͕ॏ ͘ͳ͍ • SFR͝ͱʹ75Λ্ཱͪ͛ΔΑ ͏ͳঢ়گͰ͸ɺϦΫΤετͷण໋ͱ 75ͷण໋͕Ұக͍ͯ͠Δ • $JQIFSͳͲɺੜ੒ίετ͕ߴ͍  εϨουηʔϑͰͳ͍ϦιʔεΛอ࣋ͯ͠ ͓͍ͯ࢖͍ճ͢ύλʔϯ • ཧ༝ • 75Λେྔʹੜ੒͢ΔͱɺͰ͔͍ ΦϒδΣΫτ͕େྔʹOFX ͞Εͯ͸ɺҰ౓͚ͩར༻͞Εɺ ͦͷޙେྔʹഁغ͞ΕΔܗʹͳΔ • ώʔϓΛѹഭ͢Δ্΋ͷ͍͢͝ແବ ໰୊ʹͳΒͳ͍έʔε ໰୊ʹͳΔέʔε  5ISFBE-PDBM Λར༻͢Δ৔߹ͷ஫ҙ఺ ͲΜͳϢʔεέʔε͕໰୊ʹͳΔʁ
  22. ˜-:$PSQPSBUJPO  5ISFBE-PDBM ͷ୅ΘΓʹ4DPQFE7BMVF ͸ʁ +%,Ͱਖ਼ࣜػೳʹͳͬͨ 4DPQFE7BMVF Λ࢖ͬͯΈΔ • 4DPQFE7BMVF

    ͸ɺ+%,Ͱਖ਼ࣜػೳͱͳͬͨɺ private static final ScopedValue<StringBuilder> SB = ScopedValue.newInstance(); void main() { var sb = new StringBuilder(""); ScopedValue.where(SB, sb) // whereͰɺScopedValueʹ஋ΛϚοϐϯά͢Δ .run(() -> { // runͰɺؔ਺Λ࣮ߦ͢Δ sub1(); sub2(); }); } private void sub1() { StringBuilder sb = SB.get(); // Ϛοϐϯά͞Ε͍ͯΔ஋͕औಘͰ͖Δ sb.append("sub1."); } private void sub2() { StringBuilder sb = SB.get(); // Ϛοϐϯά͞Ε͍ͯΔ஋͕औಘͰ͖Δ sb.append("sub2."); } IUUQTXXXOFKQBTBIJIJTIJEBNBIPNFUFDIKBWBQSFWJFXTDPQFEWBMVFIUNM ΛݩʹҰ෦վม
  23. ˜-:$PSQPSBUJPO εϨουηʔϑͰͳ͍ϦιʔεͷऔΓճ͠ 4DPQFE7BMVF ʹ࣮ମͦͷ΋ͷͰ͸ͳ͘ QPPMΛ CJOE͢Δ • 4DPQFE7BMVF ͸ɺ+%,Ͱਖ਼ࣜػೳͱͳͬͨɺ public

    final class CryptoService { static final ScopedValue<CipherPool> CIPHER_POOL = ScopedValue.newInstance(); public static void withPool(CipherPool pool, Runnable task) { ScopedValue.where(CIPHER_POOL, pool).run(task); } public static byte[] encrypt(byte[] input, byte[] key, byte[] iv) { try (var lease = CIPHER_POOL.get().acquire()) { Cipher c = lease.get(); // ޙུ ͜ͷ QPPMͷआ༻଴ͪΛ TFNBQIPSFΛར༻੍ͯ͠ޚ͢Δ
  24. ˜-:$PSQPSBUJPO ͦͷଞͷΞυόΠε • 7JSUVBM5ISFBEΛ৽ن࠾༻͢Δ৔߹ɺར༻͢ΔϝϞϦͷྖҬ͕େ͖͘มΘΔՄೳੑ͕͋Δ • ैདྷ͸ 1MBUGPSN5ISFBEΛੜ΍ͯ͠QPPM4UBDLྖҬΛେྔʹ֬อ • 7JSUVBM5ISFBEͷ৔߹ɺ75͕ར༻͢ΔTUBDLྖҬ͸ 'PSL+PJO1PPM

    ෼ͷΈ ୅ΘΓʹώʔϓར༻͕େ͖͘ͳΓ͏Δ • ৔߹ʹΑͬͯ͸ɺώʔϓʹׂΓ౰ͯΔϝϞϦͷ্ݶͳͲΛมߋͨ͠ํ͕ྑ͍έʔε΋ग़ͯ͘Δ • ͍ͣΕʹ͠Ζ 7JSUVBM5ISFBE ͷঢ়گ͸؂ࢹͨ͠ํ͕ྑ͍ͷͰɺ.JDSPNFUFSͷ 7JSUVBM 5ISFBE.FUSJDTΛ؂ࢹର৅ʹՃ͓͑ͯ͘ͷ͕ྑ͍ͱߟ͑ΒΕΔ   IUUQTEPDTNJDSPNFUFSJPNJDSPNFUFSSFGFSFODFSFGFSFODFKWNIUNM
  25. ˜-:$PSQPSBUJPO  ·ͱΊ • 7JSUVBM5ISFBE͸ɺϊϯϒϩοΩϯά *0Λ࣮ݱ͢ΔܰྔͳϢʔβϨϕϧεϨου • +&1 +%, Ҏ߱Ͱಋೖͷϋʔυϧ͸େ͖͘Լ͕ͬͨ

    • 5ISFBE-PDBM ͱͷซ༻͸ɺ໰୊ʹͳΔέʔεͱͳΒͳ͍έʔε͕͋Δ • 7JSUVBM5ISFBEΛਖ਼͘͠஌ͬͯਖ਼͘͠࢖͓͏ • ಋೖ࣌ͷτϥϒϧγϡʔςΟϯάͷҙຯͰ΋ɺར༻͢ΔϝϞϦྖҬͳͲΛ೺Ѳ͓ͯ͘͠ ͜ͱ͸ॏཁ