공부

[JAVA] Thread Quiz

Lucy Loop 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 객체를 잡아서 동기화 하면 해결~