수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

쓰레드 공부하다가 ^^

다온

2023.04.01

안녕하세여;;;;;; 너무 궁금한게 하나있어서여;;;;;;;
쓰레드 Guarded Suspention 패턴을 공부하다가 궁금한게 생겨서요.
예제는 쓰레드부분에서 단골로나오는 예제인데여.
생산자랑 소비자 클래스가있어서
생산자가 바구니에 빵을 하나라도 가져다놓으면 소비자가 빵을
가져가구,혹시 바구니에 빵이 없으면 wait하는 예제거든요.
일단 메소드를 보시면요....
class A{
LinkedList pueue = new LinkedList();public synchronized void getBread(){ // 소비자가 빵을 가지고오려한다
while(queue.size()=0){ // 바구니에 빵이하나도 없는지 확인한다
try{
wait(); // 빵이 하나도없다면 wait셋에 빠진다
}catch(Exception e){}
}
queue.removeFirst(); //바구닝 ㅔ빵이 있다면 하나를 가져오고queue의 싸이즈를 -1 한다.
System.out.println(빵을 가져왔습니다);
}
그런데 이상한게..책을 보니까...이런질문이 있더라고요.

동기화메소드안의 바구니에 빵이있나없나 체크하는부분에서 while대신
if를 쓰면 문제점이 있을까요 없을까요?? 전 없을거라고 생각했는데 있다고 하네여 -_-??
책에는 다음과 같이 설명이 되어있는데요.
복수의 쓰레드가 wait하고 있을때 생산자가 빵을 바구니에 하나 넣어놓고 notifyAll()을 호출했다고 합시다.이떄 복수의 쓰레드는 모두 동작하기 시작합니다. 만일 이때 queue.size()의 값이 1이라고 하면 움직이기 시작한 처음의 쓰레드가 queue.removeFirst()를 호출한 결과 queue.size()의 값이 0이 됩니다. 그 결과 움직이기 시작한 두번째의 쓰레드는 queue.size()의 값이 0인데도 queue.removeFirst()를 호출해버리게 됩니다. 때문에 안전성을 잃어버릴 우려가 있습니다.

wait 하고있던 쓰레드는 움직이기 시작하기 전에 조건을 다시한번 체크해야합니다.
따라서 if가 아닌 while을 사용해야합니다라고 나와있는데 이해가 안가네요.

어차피 첫번째 스레드가 동기화메소드에 들어갔다면
두번째 쓰레드는 자연스럽게 블록상태로 될것이고,
첫번째 쓰레드가 빵을 가지고와서 락을 해제하고 나오면 바구니가 0이 되겠죠.
그러면 두번째 쓰레드가 락을 얻어서 동기화메소드로 들어가서 바구니에 빵이 하나이상 들어있나 체크할테고...
0개니까 wait셋 으로 갈것가튼데..
책에서 이야기하는바가 무엇인지 알수없네요..

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 한울

    질문입니다.. 그럼 synchronized 키워드는 뭐땜에 쓰는거죠? B 나 C중에 한넘만 검색을 할수 있게되는게 아닌가요?

  • YourWay

    \첫번째 스레드가 동기화메소드에 들어갔다면 두번째 쓰레드는 자연스럽게 블록상태로 될것이고,\ 는 맞을수도 있지만 틀릴수도 있죠.

    생산자 A가 있고,
    B가 빵을 요청하고 , C가 또 빵을 요청한다면,
    A가 빵을 넣기전에 B와 C는 wait 하고 있겠죠.
    그런데 A가 빵을 넣고나서
    과연 누가 빵을 가져 가야 할까요? B 일까요? C 일까요?

    즉,
    \복수의 쓰레드가 wait하고 있을때
    생산자(A)가 빵을 바구니에 하나 넣어놓고 notifyA

번호 제 목 글쓴이 날짜
2695814 [질문] PDA에서 애플릿이 가능한가요? (1) 봄시내 2025-05-24
2695785 웹 설정 도와줄분 화이트캣 2025-05-23
2695730 갑자기 기억이 안나는데 accesskey 속성.. 빛나라 2025-05-23
2695702 [질문] Java 버전 차이에 의한 오류?!! (2) 검사 2025-05-23
2695672 자바 임베디드 쪽으로 배우고 싶은데요..질문이요.. (1) 뽀그리 2025-05-22
2695647 헉! 이클립스(v3.1)에서 발생되는 널포인트 익셉션? ;;; (3) 아빠몬 2025-05-22
2695586 IFRAME 캐싱 질문 봄나비 2025-05-22
2695498 [질문]실행가능한 jar파일.. 정말 이해가 안가네요... ㅡㅜ;; 터1프한렩 2025-05-21
2695468 자바랑 이클립스에서요.. 스킬 2025-05-21
2695375 Mysql 연동하는 자바 질문있습니다. 아리솔 2025-05-20
2695319 파워포인트 파일을 저장할 수 있을까요? 시윤 2025-05-19
2695289 [질문]Tween 값의 정도를 알고 싶습니다. 타마 2025-05-19
2695238 c 와 c++의 시작 (10) ChocoHoilc 2025-05-18
2695215 탑메뉴의 repeat-x .배경이 두가지에요ㅠ ㅠ 널위해 2025-05-18
2695187 자바스크립트와 자바의 import에 관해서 질문드려요 (1) 무슬 2025-05-18
2695116 테마 문의 (해당 사이트와 같은 테마 혹은 플러그인) Sweet 2025-05-17
2695084 [질문] starDrag()와 같은 함수 만들기 민구 2025-05-17
2695055 폰트 질문드립니다. 할인사이트에 많이 쓰는 굵은 숫자폰트.. (2) 일본녀 2025-05-17
2695025 [개발툴]Jcreator 에 관해서... (5) 에녹 2025-05-16
2695006 BitmapData ..무비클립에 적용 할수 있을까요? (1) 날위해 2025-05-16
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com