-
[JAVA] Thread Quiz공부 2024. 6. 20. 20:59
문제
/** * Thread Quiz * 벡터는 동기화 된 콜렉션인데 왜 에러가 발생할까? 에러를 수정해보자! */ public class VectorTest { private static Vector<Integer> vector = new Vector<Integer>(); public static void main(String[] args) { while (true) { for (int i = 0; i < 10; i++) { vector.add(i); } Thread removeThread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < vector.size(); i++) { try { Thread.sleep(1000); } catch(Exception e){} vector.remove(i); } } }); Thread printThread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < vector.size(); i++) { try { Thread.sleep(1000); } catch (Exception e) { } System.out.println((vector.get(i))); } } }); removeThread.start(); printThread.start(); while (Thread.activeCount() > 20) ; } } }
풀이
문제 현상 :
없는 것을 remove()하거나 get()한다
문제 원인 :
size()와 get() 사이에 sleep()이 있기 때문에 그 시간에 remove()가 들어와버리는 문제
Vector의 동기화는 메소드 단위로 되어 있기 때문에
size()메소드는 동기화 되어 있고 get()메서드는 동기화 되어 있지만
size()과 get()이 통째로 동기화 되어 있지는 않아서 문제가 생김
해결 방법:
size()와 get() / size()와 remove()를 묶어서 vector 객체를 잡아서 동기화 하면 해결~
'공부' 카테고리의 다른 글
DB 고민: PK, 정규화와 역정규화 (1) 2024.07.01 [JAVA] final (0) 2024.06.22 [JAVA]참조 유형의 4단계 / [운영체제] Locality of Reference (0) 2024.06.19 [SQL] (프로그래머스) '서울에 위치한 식당 목록 출력하기' 문제 풀기 (0) 2024.06.19