-
Java Virtual Thread (6), Reentrant을 이용한 Pinned Virtual Thread 방지카테고리 없음 2024. 6. 23. 14:48
private final ReentrantLock lock = new ReentrantLock(); private final Runnable runnable = new Runnable() { @Override public void run() { //synchronized (this) { lock.lock(); try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { lock.unlock(); } //} } };
Reentrant 클래스는 Java에서 제공되는 클래스이다. 이를 이용해 synchronized lock 을 대체할 수 있다.
public static void main(String[] args) { long startTime = System.currentTimeMillis(); log.info("1) main. thread: " + Thread.currentThread()); platform(); //virtual(); log.info("2) main. time: " + (System.currentTimeMillis()-startTime) + " , thread: " + Thread.currentThread()); } private static void virtual() { ThreadFactory factory = Thread.ofVirtual().name("myVirtual-", 0).factory(); try (ExecutorService executorService = Executors.newThreadPerTaskExecutor(factory)) { for (int i = 0; i < 20; i++) { Pinning pinning = new Pinning(); executorService.submit(pinning.runnable); } } } private static void platform() { try (ExecutorService executorService = Executors.newFixedThreadPool(20)) { for (int i = 0; i < 20; i++) { Pinning pinning = new Pinning(); executorService.submit(pinning.runnable); } } }
수행 시간을 확인해보면 platform thread와 virtual thread가 동일한 수행시간을 가지는 것을 확인할 수 있다.
synchronized lock 대신 Reentrant lock 을 사용하면 virtual thread의 효용성을 그대로 살릴 수 있다.