묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
CoreApplication 실행시 AppConfig, AutoAppConfig순서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]CoreApplication 실행 시에 @SpringBootApplication어노테이션 안에 @ComponentScan 이 있어서 @Configuration이 써진 AppConfig와 AutoAppConfig가 스캔되는 대상인 것은 알겠습니다. CoreApplication 실행시 AppConfig의 로그가 찍히는데 1.AppConfig와 AutoAppConfig가 둘다 작동됐는데 AppConfig가 뒤에 작동 된건지 순서가 궁금합니다. 2.AutoAppConfig에서 필터로 AppConfig는 스캔되지 않게 해줬는데 이것과 무관하게 CoreApplication 의 어노테이션으로 인해 AppConfig파일도 스캔된건지 궁금합니다.@Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { }CoreApplication 실행 시에 스프링 컨테이너를 설정 안해줬는데 왜 AppConfig의 로그가 도는지... 궁금합니다
-
미해결스프링 핵심 원리 - 기본편
안녕하십니까 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]강의 내 나오는 클래스 다이어그램 혹시 어떤 프로그램 사용해서 그리시나요? DrawIO는 아닌 것같은데 저도 선생님처럼 설계시 다이어그램을 그려보고 싶어서 문의드립니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
비공정 모드가 공정 모드가 빠른 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]비공정 모드가 공정 모드가 빠른 이유가 뭔지 자세히 궁금합니다. 비공정 모드에서도 어느 정도 대기큐가 있다고 하셨는데 그 걸 제외하고 공정 모드에서는 대기큐를 사용하면 어떤 스레드가 다음 락을 가져야할 지 알기 때문에 좀 더 빠르지 않나? 라는 생각이 들어서요.. 그리고 비공정 모드에서는 반대로 대기큐를 사용하지 않았기 때문에 공정 모드보다 락 얻기 위한 경합이 일어나서 좀 더 느릴 수 있는거 아닌가..? 싶어서 여쭤봅니다..시스템 상황에서 어떻게 비공정 모드가 공정 모드보다 빠른지 이해가 가지 않네요..ㅠㅠ
-
미해결김영한의 실전 자바 - 중급 1편
혹시 중급1에서 완벽히 이해가 안됬다고 느끼면 중급1편을 다시 재수강하고 중급2로 넘어가는게 좋을까요? 아니면 우선 순차적으로 모두 수강후에 재수강하는것이 좋을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]혹시 중급1에서 완벽히 이해가 안됬다고 느끼면 중급1편을 다시 재수강하고 중급2로 넘어가는게 좋을까요? 아니면 우선 순차적으로 모두 수강후에 재수강하는것이 좋을까요?
-
미해결스프링 핵심 원리 - 기본편
스프링부트 질문이 있습니다
제가 현재 자바와 스프링 부트를 함께 배우는 비전공자 부트 캠프를 다니는 중인데부트캠프에서 자세한 내용은 배우기 시간이 촉박한 관계로 강사님이 자세한 설명은 스킵합니다. 이로 인해 비전공자임에도 개발자의 꿈을 꾸는 저는 추가로 강의를 들어서 보충학습을 하고자하는데현재 제가 강의로 배우고 있는 내용은 스프링으로 심화적인 스프링부트의 이해를 위해서 필요한지 아니면 스킵하고 바로 스프링 부트쪽으로 넘어갈지 고민이되서 질문드립니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
실무에서 excutor service사용
안녕하세요. 실무에서 시간이 오래소요되는 3개의 delete쿼리를 excutor service를 사용하여 멀티스레드형식으로 1개의 스레드가 1개의 쿼리를 수행하도록 구현해보고 싶습니다. 그런데 멀티스레드를 사용했을때 트랜잭션은 보통 어떻게 처리하시나요.. ? 저는 @transactional 을 선언해서 사용하고 있는데 이는 스레드1개당 트랙잭션이 생성되는거라 제가 의도한데로 롤백이 제대로 안될거라고 하더라구요.. 3개의 쿼리가 모두 성공했을때 커밋되고 그렇지않으면 롤백시키고싶은데 이부분에 대한 지식도 혹시 알수있을까요? 추가로 혹시 해당 질문 관련 강의를 개설해놓으신게 있다면 알려주시면 감사하겠습니다!
-
미해결김영한의 실전 자바 - 중급 2편
제가 작성한 코드 출력 결과에 의문이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]< 사전 설명 >Rectangle 객체에서 hashCode()와 equals() 둘중 equals()만 오버라이드 하였습니다. 이후 public class RectangleTest { public static void main(String[] args) { Set<Rectangle> rectangleSet = new HashSet<>(); for (int i = 0; i < 13; i++) { rectangleSet.add(new Rectangle(20, 20)); } System.out.println(rectangleSet.size()); for (Rectangle rectangle : rectangleSet) { System.out.println("rectangle = " + rectangle); } } }위와 같은 코드를 작성했을때System.out.println(rectangleSet.size()); 출력 결과가 13이 나오고for문의 출력 결과도 같은 결과가 13번 나옵니다. < 질문 >hashCode()를 오버라이드 하지 않음으로써 해시인덱스가 랜덤으로 배정되는 것으로 알고있습니다.그래서 논리적으로 같은 객체가 들어오더라도 다른 해시인덱스에 할당 되는것이 문제가 됩니다. 하지만 제가 작성한 코드와 같이 많은 for문을 돌게 될면 새로 만들어진 Rectangle 객체가 언젠가 최소 한번쯤은 해시인덱스에서 중복된 객체를 만나게되고, 중복되는 해시 인덱스의 버킷에서 equals() 메서드가 실행되어 저장이 취소될것이라고 예상했습니다.그래서 rectangleSet.size()는 13 미만이 될거라 생각했지만 아니었습니다. 오버라이드된 equals() 메서드가 실행되지 않는 이유가 무엇일까요?
-
미해결김영한의 실전 자바 - 기본편
Student student1 = new Student();일때 Student 타입질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. new를 통해 클래스를 기반으로 인스턴스를 생성하면 참조값을 반환한다고 하셨습니다. 그렇다면 맨앞의 Student 타입이라면 참조값의 타입이라고 이해하면 될까요?16진수라면 다른 타입을 써도 되나요? double이나 long?
-
미해결스프링 핵심 원리 - 기본편
AllBeanTest 시 discountPrice 값 0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]AllBeanTest 클래스의 findAllBean 테스트하는데 자꾸 실패하네요. 1000원이 아닌 0원으로 나오는데, member.getGrade()를 해보면 VIP가 아닌 null로 나옵니다..package hello.core.autowired; import hello.core.AutoAppConfig; import hello.core.discount.DiscountPolicy; import hello.core.member.Grade; import hello.core.member.Member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; import java.util.Map; public class AllBeanTest { @Test void findAllBean(){ ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member(1L, "userA", Grade.VIP); int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy"); Assertions.assertThat(discountPrice).isEqualTo(1000); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); } } }
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
코드 작성 시 SOLID 원칙을 처음부터 준수해가며 작성하시는지, 아니면 개발 후 리팩토링을 통해 점진적으로 변경해 나가시는 편인지 궁금합니다.
안녕하세요, 강사님.강의 정말 유익하게 잘 듣고 있습니다. 강의를 보면서 기존에 작성된 로직에서 SOLID 원칙을 위반하는 코드들을 점진적으로 개선해 나가시는걸 보고 한가지 궁금한게 생겼는데요. 강사님께서는 코드를 작성할 때 위 원칙들을 처음부터 준수해 가시면서 작성을 하시는 편인지, 아니면 기능 구현에 우선 초점을 맞춰 코드를 작성하신 뒤 강의처럼 점진적으로 리팩토링을 해나가시는 편인지 궁금합니다. 이 원칙들을 준수해가면서 코드를 작성하는 버릇이 생기게 되면 전자의 방식이 가능해지는건가요? 지금 당장 생각했을 때는 아무리 원칙을 잘 이해한다고 하더라도 쉽지는 않을 것 같아서요. ㅜ 그리고 혹시 다음 강의 계획하고 계신게 있으신가요? ㅎㅎ
-
해결됨김영한의 실전 자바 - 중급 1편
익명 클래스 활용2 - 리펙토링 문제 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 익명 클래스 활용2 - 코드조각을 혼자서 리펙토링 하라는 말을 듣고, 생각이 안 나다가, 커뮤니티에 있는 if문을 보게 되었고(리펙토링이 어떤지 코드 리뷰를 해달라는 질문이었습니다.),이것을 보고 이렇게 풀게 되엇고,전부다 보지는 못하였지만 강사님의 풀이를 그냥 대충 넘기며 ('10-20분도 안 됬는데 그냥 커뮤니티를 보게 되니 2-3일 후에 기억에 없어질것 같으니 그때 다시 풀까?'라는 생각을 하게됨) 보는데, 다형성의 맨 마지막 pay 문제가 생각 이 나더라고요.이럴 때에는, 객체지향의 맨 마지막 문제 및 객체지향의 ocp원칙을 설명하는 영상을 보고 오는 게 나을까요? 아니면 지금 강사님의 영상(익명클래스 활용2 만 보기)으로 충분할까요?답변 부탁 드립니다.
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
질문있습니다,.
package Practice; import java.util.Scanner; public class class13 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int maxCount = 10; String[] productNames = new String[maxCount]; int[] productPrice = new int[maxCount]; int productCount = 0; while (true) { System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료\n메뉴룰 선택하세요:"); int menu = scanner.nextInt(); scanner.nextLine(); if (menu == 1) { if (productCount >= maxCount) { System.out.println("더 이상 상품을 등록할 수 없습니다."); continue; } System.out.print("상품 이름을 입력하세요:"); productNames[productCount] =scanner.nextLine(); System.out.print("상품 가격을 입력하세요:"); productPrice[productCount] = scanner.nextInt(); productCount++; } else if (menu == 2) { if (productCount == 0) { System.out.println("등록된 상품이 없습니다."); continue; } for (int i = 0; i < productCount; i++) { System.out.println(productNames[i] + ": " + productPrice[i] + "원"); } } else if (menu == 3) { System.out.println("프로그램을 종료합니다"); break; } else { System.out.println("잘못된 메뉴를 선택하셨습니다"); } } } }요 코드에서 맨 마지막 else문에 continue; 는 없어도 되나요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
자바의 특징
OS에 구애받지 않고 자바가 설치된 곳에서는 다 실행이 된다고 해주셨는데 대부분의 설치가 필요한 언어들도 비슷하다고 생각하면 될까요?자바만이 가진 특징인건지 궁금합니다.
-
해결됨오브젝트 - 기초편
객체 협력, 클래스구조와 런타임, 컴파일타임의 관계
안녕하세요. 신입으로 취업준비하면서 공부중인데 응용을 못하던 차에 너무 필요한 강의를 만난것 같습니다! 제가 궁금한 부분은'객체 협력(런타임)에서 클래스 구조(컴파일타임)의 순서로 진행'에서 런타임과 컴파일타임이 어떻게 연결되는 개념인지 입니다. 제가 해당 챕터에서 이 내용을 이해하기로는 아래와 같습니다. 변경에 용이하기 위해 과한 의존성을 피하여 파급효과를 줄여야 한다는점.이를 위해서 통제된 문맥을 갖는것이 중요하고, 이에 따라 행동을 먼저 결정하고 상태를 결정한다는 점.그런데 순서상 객체안의 데이터는 객체가 정의되어야 객체의 데이터도 결정되기 때문에 필연적으로 순서상 객체의 협력을 먼저 고려하여 객체를 드러낸 뒤, 클래스를 설계해야 한다는 의미로 이해했습니다. 단순히 런타임은 실행시점, 컴파일타임은 컴파일 시점인 것이라고 생각하고 있는데, 어떤 맥락에서 이런 표현들이 연결되는 것인지 잘 모르겠습니다. 사실 다른 책에서도 갑자기 '런타임 시점에', '컴파일 시점에'라는 말들이 가끔 나오는데 매번 잘 이해했다고 생각하다가 저런 말들이 갑자기 나오면 불편해졌던 기억이 납니다. ㅠ 제가 잘못 강의를 이해한것인지, 아니면 해당 맥락에서 반드시 이해해야 할 기본 배경지식을 놓치고 있는것은 아닌지 모르겠습니다.
-
미해결김영한의 실전 자바 - 중급 2편
comparable, comparator
얼핏 봤을때에는 comparable 과 comparator 차이가 크게 없어 보이는데, 만약 String ID 알파벳 순이라 아니라String Id 의 length 순으로 정렬해서 배열을 만들고 싶다고 했을때에는 comparable 은 기본적인 자연적인 배열 순서로 정의를 해주기 때문에 comparator 를 쓰는게 올바른 것인가요 ?
-
미해결김영한의 실전 자바 - 중급 2편
comparable, comparator
강의를 보면 ID 를 통한 Array 배열을 정렬할때IdComparator 를 만드셨는데, 사실 comparable 에서도 충분히 정의할 수 있는 것 아닌가요 ?단순히 Comparator 를 통해서도 할 수 있다라는 것을 보여주기 위함인가요 ?또한 언제 comparable 을 쓰는 게 낫고 언제 comparator 를 쓰는게 나은가요 ?
-
미해결스프링 핵심 원리 - 기본편
Prototype스코프
section5 싱글톤 부분에서 설명하신 스프링을 적용하지 않은 DI컨테이너는 1개의 인스턴스가 아니라 요청이 올 때마다 여러 개의 인스턴스를 생성한다고 하셨는데 section9 빈 스코프 부분에서 말씀하신 프로토타입같은 경우와 동일하다고 보면되나요? 다만 프로토타입은 생성과 DI후 컨테이너에서 관리하지 않아 위의 경우와 다르게 메모리 낭비를 줄일 수 있다고 이해해도될까요?
-
해결됨김영한의 실전 자바 - 중급 1편
지역 클래스 안에 지역 클래스?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. "지역클래스의-시작에서" 영한님이 말한 복선이 뭘까? 라는 생각을 하는 도중에, '지역 클래스안에 지역클래스를 넣어볼까?'라는 생각을 하게 되었습니다.그래서 어찌 저찌 하다가 코드가사진을 보시는 봐와 같이 이런 코드가 되었습니다.그러면서 이 코드를 만들면서, 현업 에서도 이렇게 지역 클래스 안에 지역 클래스 를 넣는 경우도 있을 것 같더라고요.그래서 질문이현업 에서 지역 클래스 안에, 지역 클래스 넣어서 만드는 경우가 흔한가 아니면 특이한 경우인가? 그게 궁금합니다.답변 부탁 드립니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
unlock()에 synchronized를 걸면 왜 무한루프를 도는지가 이해가 안됩니다..ㅠㅠ
synchronized를 unlock에 걸 필요가 없다는건 이해를 했는데 이것 저것 실험(?)을 해보다가 unlock()에 synchronized를 걸면 무한 대기 상태가 지속되는지 이해가 안됩니다..ㅠㅠ제가 계속 고민을 한 로직으로는 Thread-1이 비즈니스 로직을 실행한 후 finally를 실행해서 락을 반납해 Thread-2가 어느 정도 시간이 지난 후에 락을 받아서 실행이 될 것이라고 생각을 했는데 아니라서 많은 고민 끝에 질문을 남겨봅니다..ㅠㅠ 답변 기다리겠습니다..!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
future.get()
public static void main(String[] args) throws InterruptedException, ExecutionException { SumTask task1 = new SumTask(1, 50); SumTask task2 = new SumTask(51, 100); ExecutorService es = Executors.newFixedThreadPool(2); Future<Integer> future1 = es.submit(task1); Future<Integer> future2 = es.submit(task2); log("작업 시작"); long st = System.currentTimeMillis(); Integer sum1 = future1.get(); long end = System.currentTimeMillis(); log(end - st + "ms"); Integer sum2 = future2.get(); log("task1.result = " + sum1); log("task2.result = " + sum2); int sumAll = sum1 + sum2; log("task1 + task2 = " + sumAll); es.close(); }02:45:32.785 [ main] 작업 시작 02:45:32.785 [pool-1-thread-1] 작업 시작 02:45:32.785 [pool-1-thread-2] 작업 시작 02:45:34.794 [pool-1-thread-1] 작업 완료 result = 1275 02:45:34.794 [pool-1-thread-2] 작업 완료 result = 3775 02:45:34.797 [ main] 2007ms 02:45:34.797 [ main] task1.result = 1275 02:45:34.797 [ main] task2.result = 3775 02:45:34.797 [ main] task1 + task2 = 5050 맨 위 코드를 실행했을 때 위와 같은 출력이 나왔습니다.main 메서드는 BlockingQueue에 등록된 future를 스레드 풀에서 가용 가능한 스레드 만큼 모두 실행 시킨 후에 WAITING 상태로 변경된다고 이해하면 될까요?