관련 이론 및 문법

(synchronized 참고)

http://kkikkodev.tistory.com/143


문제 의도

다음 보기 중 참인 것을 고르는 문제입니다.


답안

E


풀이 방법

주어진 소스코드를 살펴보면, TestSeven 클래스가 있고 이는 Thread 클래스를 상속하고 있습니다. 멤버 변수로는 static int 형 x 를 가지고 있고, doThings 메소드는 synchronized 되어 있습니다. 또한 run 메소드에서는 doThings 메소드를 호출하고 있습니다. doThings 메소드를 자세히 보면, current 지역 변수에 x 라는 static 멤버 변수를 가져와서 대입하고 current 변수를 1 증가시키고 다시 그 current 값을 x 에 대입하고 있습니다.


이런 코드의 형태는 완벽히 동기화가 안 된 경우입니다. 왜냐하면, doThings 메소드에서 static 변수인 x 를 접근하고 있는데, doThings 메소드가 static 메소드가 아니므로 각 TestSeven 형 객체마다 호출할 수 있게되기 때문입니다. 따라서, synchronized 의 효과를 보려면, doThings 메소드 또한 static 으로 변경을 해야만 TestSeven 형 객체가 아닌, 모든 TestSeven 형의 객체들에 의해서 공유되기 때문에, 동시에 doThings 메소드를 호출할 수 있는 TestSeven 객체는 한 개만 되게 됩니다.


코드 자체가 컴파일 오류나 예외가 발생하지는 않으므로 보기 A, B 는 답안 후보에서 제외합니다.


run 메소드를 synchronizing 하더라도 class thread-safe 하게 만들 수 없으므로 보기 C 는 답안 후보에서 제외합니다.


변수 x 의 데이터는 병행 접근 문제로부터 보호된다고 한 보기 D 또한 답안 후보에서 제외합니다.


doThings 메소드 안의 내용을 synchronized(new Object()){} 구문으로 감싸더라도 class thread-safe 하게 만ㄷ르 수 없으므로 보기 F 도 답안 후보에서 제외합니다.


따라서, doThings 메소드를 static 으로 변경해야 class thread-safe 하게 된다고 설명한 보기 E 가 답안이 됩니다.


by kkikkodev 2016. 11. 14. 20:15