inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

LettureLockStockFacadeTest에서 오류가 발생합니다.

미해결

재고시스템으로 알아보는 동시성이슈 해결방법

package com.example.stock.repository; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.time.Duration; @Component public class RedisLockRepository { private RedisTemplate<String, String> redisTemplate; public RedisLockRepository(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } public Boolean lock(Long key) { return redisTemplate .opsForValue() .setIfAbsent(generateKey(key), "lock", Duration.ofMillis(3_000)); } public void unlock(Long key) { redisTemplate.delete(generateKey(key)); } private String generateKey(Long key) { return key.toString(); } } package com.example.stock.facade; import com.example.stock.repository.RedisLockRepository; import com.example.stock.service.StockService; import org.springframework.stereotype.Component; @Component public class LettuceLockStockFacade { private final RedisLockRepository redisLockRepository; private final StockService stockService; public LettuceLockStockFacade(RedisLockRepository redisLockRepository, StockService stockService) { this.redisLockRepository = redisLockRepository; this.stockService = stockService; } public void decrease(Long key, Long quantity) throws InterruptedException { while(!redisLockRepository.lock(key)){ Thread.sleep(100); } try{ stockService.decrease(key, quantity); }finally { redisLockRepository.unlock(key); } } } package com.example.stock.facade; import com.example.stock.domain.Stock; import com.example.stock.repository.StockRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest class LettuceLockStockFacadeTest { @Autowired private LettuceLockStockFacade lettuceLockStockFacade; @Autowired private StockRepository stockRepository; @BeforeEach public void before(){ stockRepository.saveAndFlush(new Stock(1L, 100L)); } @AfterEach public void after(){ stockRepository.deleteAll(); } @Test public void 동시에_100개의_요청() throws InterruptedException { int threadCount = 100; ExecutorService executorService = Executors.newFixedThreadPool(32); CountDownLatch latch = new CountDownLatch(threadCount); for(int i = 0; i < threadCount; i++){ executorService.submit(() -> { try{ lettuceLockStockFacade.decrease(1L, 1L); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { latch.countDown(); } }); } latch.await(); Stock stock = stockRepository.findById(1L).orElseThrow(); assertEquals(0, stock.getQuantity()); } } 이렇게 코딩했고 dockre에 redis를 설치하고 window Shell에서 데이터가 남아 있을까봐 1번 key 값을 삭제해서 돌렸는데도 오류가 발생했습니다. 또한 레디스가 실행이 되지 않은 채 했을까봐 ping을 입력했는데 pong이라는 응답을 받았습니다. Hibernate: drop table if exists stock 2024-11-03T22:08:40.414+09:00 DEBUG 17108 --- [ Test worker] org.hibernate.SQL : create table stock (id bigint not null auto_increment, product_id bigint, quantity bigint, version bigint, primary key (id)) engine=InnoDB Hibernate: create table stock (id bigint not null auto_increment, product_id bigint, quantity bigint, version bigint, primary key (id)) engine=InnoDB 2024-11-03T22:08:40.439+09:00 INFO 17108 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2024-11-03T22:08:41.136+09:00 INFO 17108 --- [ Test worker] o.s.d.j.r.query.QueryEnhancerFactory : Hibernate is in classpath; If applicable, HQL parser will be used. 2024-11-03T22:08:42.092+09:00 WARN 17108 --- [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2024-11-03T22:08:42.990+09:00 INFO 17108 --- [ Test worker] c.e.s.facade.LettuceLockStockFacadeTest : Started LettuceLockStockFacadeTest in 6.21 seconds (process running for 7.345) 2024-11-03T22:08:43.504+09:00 DEBUG 17108 --- [ Test worker] org.hibernate.SQL : insert into stock (product_id,quantity,version) values (?,?,?) Hibernate: insert into stock (product_id,quantity,version) values (?,?,?) 2024-11-03T22:08:44.203+09:00 DEBUG 17108 --- [ Test worker] org.hibernate.SQL : select s1_0.id,s1_0.product_id,s1_0.quantity,s1_0.version from stock s1_0 where s1_0.id=? Hibernate: select s1_0.id,s1_0.product_id,s1_0.quantity,s1_0.version from stock s1_0 where s1_0.id=? 2024-11-03T22:08:44.245+09:00 DEBUG 17108 --- [ Test worker] org.hibernate.SQL : select s1_0.id,s1_0.product_id,s1_0.quantity,s1_0.version from stock s1_0 Hibernate: select s1_0.id,s1_0.product_id,s1_0.quantity,s1_0.version from stock s1_0 2024-11-03T22:08:44.252+09:00 DEBUG 17108 --- [ Test worker] org.hibernate.SQL : delete from stock where id=? and version=? Hibernate: delete from stock where id=? and version=? Expected :0 Actual :100 <Click to see difference> org.opentest4j.AssertionFailedError: expected: <0> but was: <100> at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151) at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132) at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197) at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:182) at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:177) at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:639) at com.example.stock.facade.LettuceLockStockFacadeTest.동시에_100개의_요청(LettuceLockStockFacadeTest.java:55) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 어디를 더 수정해야 하는지 모르겠습니다..

  • java
  • spring
  • 동시성
소리쨩 댓글 2 좋아요 1 조회수 301

BlockingQueue의 offer, poll 질문 드립니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

안녕하세요! 너무 알찬강의 잘 듣고 있습니다! 강의에서 BlockingQueue의 offer와 poll은 일정시간만큼 대기하신다고 하셨는데요, 이때 이들이 기다리는 영역은 어디가 되는건가요..? ReentrantLock을 획득하기 위한 대기 wait()을 위한 대기 아니면 그 어느것도 상관없이 항상 대기 Queue가 된 후 2초인걸까요?! 그리고 만약 어떤 상황이든 2초만을 기다리고 종료시키는 방법이라면, Lock을 획득하고, 생산자나 소비자가 무언가 데이터를 처리하는 과정에서 2초가 지났을 때 이 작업을 강제 종료해 버리면 동일하게 동시성 문제가 발생할 수 있지 않을까요? (실제 처리하지 않았지만 실패로 결과가 나타난다던가..)

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
FWoody 댓글 2 좋아요 0 조회수 195

Executor 스레드 풀 관리 - 분석 에서 BlockingQueue

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

1. 강의 내용과 관련된 질문인가요?예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 쓰레드 풀 core사이즈와 max사이즈가 어떻게 관리 되는지는 어느정도 이해한 것 같은데, 이 예제에서 BlockingQueue안에서 쓰레드들이 스레드 대기 집합, 락 대기 집합에 어떻게 관리되는 것 까지 이해해보려고 하니 매우 어렵네요.. ai야 도와줘~!

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
ssshhh 댓글 1 좋아요 0 조회수 187

스레드 대기 집합과 스케쥴링 큐

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] synchronized를 사용하면 사용되는 스레드 대기 집합과 기존 멀티스레드 환경에서 사용되는 스케쥴링큐는 다른건가요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
ssshhh 댓글 1 좋아요 0 조회수 187

스레드 강의 질문이 있습니다.

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

1) main, Thread-A, Thread-B 3개의 스레드를 만들고 실행시킨 후 main 스레드에서 의도적으로 exception을 발생시켜도 main 스레드만 종료되고 Thread-A, Thread-B는 돌아가는데 이 때 자바 자체를 중지하려면 Thread-A와 B를 Daemon으로 생성하는 방법 밖에 없을까요? 2) 궁금증이 발생했는데 main 스레드를 Daemon으로 선언할 수 있나요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
index 댓글 1 좋아요 0 조회수 164

warning 뜸

미해결

앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해

코드파일의 5번 SerialSyncProject의 WriteSyncronously()를 실행할 경우 SerialSyncProject(9296,0x104550200) malloc: nano zone abandoned due to inability to reserve vm space. 현재 이름(write-safe): 재석 유 ================== WARNING: ThreadSanitizer: data race (pid=9296) Write of size 8 at 0x000108f5f7d0 by thread T8: #0 SerialSyncProject.Person.changeName(firstName: Swift.String, lastName: Swift.String) -> () <null> (SerialSyncProject.debug.dylib:arm64+0xdc98) #1 closure #1 () -> () in SerialSyncProject.WriteSyncPerson.changeName(firstName: Swift.String, lastName: Swift.String) -> () <null> (SerialSyncProject.debug.dylib:arm64+0x105b4) ....기타 경고들.... ================== 현재 이름(write-safe): 구라 김 현재 이름(write-safe): 나래 박 현재 이름(write-safe): 동엽 신 현재 이름(write-safe): 세형 양 마지막 이름은?(write-safe): 세형 양 이런식으로 경고메세지가 뜨는데 정상인걸까요? - 데이터 레이서 때문에 생기는 현상이어서 그냥 넘겨도 되는건지 궁금합니다!

  • ios
  • swift
  • 동시성
밀라이 댓글 1 좋아요 0 조회수 180

16:50부분에서 타입락 질문드립니다.

미해결

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

ResourceA의 methodA메서드가 호출될때 ResourceA.cass락이 1번쨰로걸리고 ResourceB.class락이 두번째로 걸리고나서 ResourceB.class락이걸린상태에서 resourceB.methodB2()메서드가 호출되는데 resourceB.methodB2()메서드 내부에서 ResourceB.class락으로 컨트롤 하고있는데 ResourceA의 두번째 락에서 ResourceB.class로 락을 반환하지않은상태에서 실행된다고 생각하는데 resourceB.methodB2()의 내부는 어떻게 실행되는걸까요? 정리 methodA()ResourceA1번째락 > ResourceA.cass methodA()ResourceA2번째락 > ResourceB.cass ResourceA2번째락내부에서 resourceB.methodB2()실행 resourceB.methodB2()내부는 ResourceB.cass락 질문사항 methodA()ResourceA2번째락에서ResourceB.cass을 점유하고있는데 resourceB.methodB2()도 ResourceB.cass락으로 블록락 실행중인데도 불구하고 점유 가능한 이유가 무엇인가요?

  • java
  • 동시성
  • multithread
  • synchronisation
ultimates 댓글 2 좋아요 0 조회수 134

Future로 받아오는 방식이 자바스크립트의 await 비동기 방식과 유사한지 궁금합니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 우선 좋은 강의 제공해 주셔서 감사합니다. 다름이 아니라 해당 강의 공부 중에 자바스크립트의 비동기 방식과 유사한 것 같은데 내부 동작은 물론 다르겠지만, 자바스크립트의 Promise나 await 방식과 같이 비동기로 처리해서 값을 가져오는게 유사한 것 같은데 맞는지 궁금합니다. 강의 내용과는 다른 내용일 수도 있어서 죄송합니다.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
왼발주발 댓글 1 좋아요 0 조회수 241

여러 스레드의 실행 순서 질문 (start 메서드)

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

섹션3. 여러 스레드 만들기 - [1:40] HelloRunnable 스레드 3개 실행하는 부분 앞서 스레드의 start 메서드를 호출할 때 스레드는 스택 공간을 할당 받고 실행 된다고 이해했습니다. 그럼 아래 코드를 실행했을 때 start 메서드를 순서대로 읽어서 순서대로 실행 되어야 하는게 아닌가요?? 왜 각자 동시에 실행 되어서 순서를 보장할 수 없는 것인가요? HelloRunnable runnable = new HelloRunnable(); Thread thread1 = new Thread(runnable); thread1.start(); Thread thread2 = new Thread(runnable); thread2.start(); Thread thread3 = new Thread(runnable); thread3.start();

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
갈 길이 멀다 댓글 1 좋아요 0 조회수 127

16분 7초 뮤텍스 코드 관련해 질문드립니다.

미해결

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

release(m)에서 마지막에 lock = 0 을 해주어야 acquired(m)에서 해당 lock을 사용할 수 있는거 아닌가요..? 또한 a스레드에 의해 락이 획득된 상태에서, block() 함수를 통해 대기상태로 변하고 > 이후 release(m)를 통해 실행대기 상태로 변한 스레드들은 ( 목적이 critical section의 실행 ) do - while 구문을 통해 critical section을 반복적으로 실행할 수 있도록 되는 건가요?? 실행 대기 상태로 돌아왔을 때 어떻게 다시 락 획득 프로세스를 다시 진행할 수 있는 건지 알고 싶습니다.

  • java
  • 동시성
  • multithread
  • synchronisation
hylim 댓글 2 좋아요 0 조회수 191

CAS연산3 강의 중 질문있습니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

incrementAndGet() 메서드에서, 스레드 두개가 들어가고 동시에 실행 됐을때 마지막 스레드가 다시 compareAndSet(getValue, getValue + 1) 이 성공적으로 돌았을때 getValue의 값이 이미 2가 되는것으로 예상되는데 결과는 1이 반환이 되고, return getValue + 1;로 인해 결과값이 2가 어떻게 나오는 지 궁금합니다. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
조우영 댓글 3 좋아요 0 조회수 303

강의자료 관련 질문

해결됨

앨런 Swift Concurrency for Swift 6 (Part-1)

안녕하세요 엘런님 먼저 정말 좋은 강의 제작 해주셔서 감사합니다. 현재 컨커런시 part1을 시작하려고 강의 구매 및 강의 자료를 다운받았는데요 part2 역시 강의가 오픈되면 구매할 생각입니다. 그런데 그 때는 part2 강의자료만 따로 제공되지는 않을까요?? 설명을 보니 묶어서 교제로 판매하신다고 하시는데 part2 강의 자료만 필요한데 교제까지 구매하면 조금 부담이 될 것 같아사요

  • ios
  • swift
  • 동시성
  • async-await
  • concurrency
Hamp 댓글 2 좋아요 0 조회수 324

선생님 감성적이시네요 MBTI 가 뭔가요 궁금합니다

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
Rain D 댓글 1 좋아요 1 조회수 433

스레드 대기 집합에는 대기 목록의 개수 제한이 따로 없나요?

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 스레드 대기 집합에는 대기 목록의 개수는 제한이 따로 없나요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
김근태 댓글 1 좋아요 0 조회수 187

동기화가 보장된다고 하더라도 스레드간 데이터 불일치가 발생할 수 있지 않나요??

미해결

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

강의 잘 듣고 있습니다. 질문 드릴 것이, 동기화가 보장되어서 각 스레드 별로 원자적으로 연산을 한다고 하더라도 CPU 레지스터에서 이루어지는 연산이기 때문에 메모리에 바로 적용되지는 않는거 아닌가요? 동기화 매커니즘과 동시에 atomic 혹은 volatile 을 선언해야 하는 거 아닌가요??

  • java
  • 동시성
  • multithread
  • synchronisation
hylim 댓글 2 좋아요 0 조회수 236

리액티브-part2

해결됨

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

안녕하세요 강의내용과는 다른 질문인데요. part1 다음의 part2 강의도 계획중신건가요?? 만약 part2도 있다면 part2는 어떤 내용애 관한 강의인지 궁금하니다!

  • java
  • 동시성
  • multithread
  • synchronisation
학생2 댓글 2 좋아요 0 조회수 203

예제 코드에서의 volatile 사용에 관하여 질문드립니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

안녕하세요, 영한님. 이번 강의 9분 10초쯤에 flag 와 count 변수에 volatile 키워드를 추가하셨는데, 저는 flag 변수에만 volatile 키워드를 사용해도 예제 코드가 정상적으로 동작할 것으로 예상했습니다. 실제로 flag 변수에만 volatile 키워드를 붙이고 실행해보니 main 스레드에서 가져온 task.count 와 work 스레드에서 가져온 count 의 값이 동일했습니다. 또한 volatile 키워드를 모두 사용하지 않았을 때를 기준으로 flag 변수에만 사용했을 때 약 2배, flag 와 count 변수 모두 사용했을 때 약 5배 정도 성능이 저하되는 것을 확인했습니다. 그럼에도 불구하고 count 에도 volatile 키워드를 사용하신 이유가 있을까요? 제가 생각하지 못한 예외 상황이 있을까요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
yeon 댓글 2 좋아요 1 조회수 400

LockSupport.unpark(thread) vs Interrupt

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

Waiting 상태의 쓰레드를 Runnable 상태로 만들기 위해선 두 가지 방법이 있다고 배웠습니다. LockSupport 기능 인터럽트 발생 2번 방법에 대해서 궁금한 것이 있습니다. 결과적으로 인터럽트를 발생시켜 쓰레드를 대기 상태에서 실행 가능한 상태로 전이시킨다는 것인데 인터럽트 상태가 정상(false)이 아닌 상태가 나오게 되는데 그럼 실무에서 1번 방법을 더 많이 사용하나요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
피곤한개발자 댓글 1 좋아요 0 조회수 198

스레드 풀에 대해 질문 있습니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

톰켓에 있는 스레드 풀도 Executor 인터페이스를 구현해서 생성하는건지 궁금합니다. 스프링 부트를 사용한다면 톰켓에서 자체적으로 스레드 풀을 생성 할텐대 여기에 강의에서 배운것처럼 ExecutorService es = Executors.newFixedThreadPool(3); 이런식으로 직접 스레드 풀을 만들어서 사용해도 되는지 궁금합니다.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 1 좋아요 0 조회수 258

future.get()에 대해 질문 있습니다.

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

main 스레드에서 future.get()을 호출하면 결과값이 올때까지 다음 코드라인을 실행할 수 없는 상태가 된다고 보면 될까요? 앞서 스레드들은 락 대기 집합, 스레드 대기 집합 같은 곳에서 대기를 했는데요 future.get()을 한다면 main 스레드도 대기를 할곳이 필요해 보이는데 저런 대기 집합 장소가 따로 있는지 궁금합니다. 블로킹에 대한 개념을 보면서 동기/비동기, 블로킹/논블로킹에 대한 차이점에 대해 궁금해졌습니다. 구글링을 하면서 자료 조사를 했는데 여전히 헷갈리네요 혹시 간단하게 이 개념들의 차이점에 대해 설명해주실 수 있을까요

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 1 좋아요 0 조회수 307

인기 태그

인프런 TOP Writers

주간 인기글