Collection 중에는, SynchronizedMap이 있습니다. 대충 Synchronizedxxx라고 해 보겠습니다. 이것들은 어떠한 구조로 되어 있을까요? 먼저 Collcetions.Synchronizedxxx로 호출하는 것을 보아서는, 내부 class로 선언이 되어 있는 것을 알 수 있습니다. 이들은, Map 꼴의 맵 객체와, Object 객체인 mutex를 가지고 있습니다. 생성자 안에는, 인자로 넘겨받은 Map을 대입하는 부분이 있습니다. HashMap도 있고, TreeMap도 있을 텐데. 이렇게 해도 문제가 없나요? 고양이는 동물이고, 개도 동물이잖아요. 그러니 이들을 동물이라고 하는 것은 크게 무리는 없습니다. 다만, 넘겨받은 객체를 가지고 bark를 호출할 때에는 이야기가 달라지는데요...
동기화 검색 결과
hashMap은 동기화가 된 클래스가 아닙니다. 그렇기 때문에, 두 Thread에서 같은 hashMap에 동시에 접근했을 때, 문제가 발생할 수 있습니다. 둘 다 write 연산을 수행할 때에도 문제가 발생할 겁니다. 그런데, 왜 문제가 될까요? 문제가 되는 시나리오가 없을까요? 그 시나리오는, 당황하면 쉽게 생각할 수 없습니다. 두 Thread가 있습니다. 이 Thread들은, 서로 다른 값의 Integer인, 6개의 Key 값을 넣습니다. 그러면 put 메서드를 실행을 하게 될 건데요. 어떠한 일이 벌어질까요? 저는, 12보다 작아질 수 있다고 답변했습니다. 그 말이 맞을까요? 먼저 hashmap을 간단하게 보도록 하겠습니다. 3개의 static 변수만 봅시다. DEFAULT_INITIAL_CAPAC..
임계 영역이 무엇일까요? 이것은 둘 이상의 쓰레드 (worker)가 동시에 접근하면 안 되는, 공유 영역에 접근하는 코드를 말합니다. 다시 말해, 둘 이상의 worker가 동시에 접근하면 문제를 일으킬 수 있는 코드들을 말합니다. 예제 하나를 보면서, 같이 분석해 보도록 하겠습니다. 먼저 ACCOUNT 클래스입니다. remain이라는 필드가 있어요. 이것은 남은 돈을 의미합니다. 이 클래스에는, put_money, 그러니까 입금하는 메서드와 get_money, 출금하는 메서드가 있어요. 이들은 각각 x만큼 넣고 빼는 일을 합니다. 그리고 우리는 Worker의 w1과, Worker2의 w2를 동시에 실행합니다. 이들은 start 메소드가 있는 걸로 보아서는 Thread를 상속했을 거 같네요. run() 메..
오랫만에 스레드 포스팅을 올립니다. Java에는, synchronized 키워드가 있는데요. 이것은 특정한 대상에 lock을 걸어서, lock이 풀릴 때 까지 다른 쓰레드가 실행을 하지 못하게 합니다. static 메소드에 붙일 때와, 일반 메소드에 붙일 때, 어디에 락을 거는지가 다른데요. 그에 대해서 간단하게 짚고 넘어가 보도록 하겠습니다. 먼저, 일반 메소드에 synchronized를 붙였습니다. 그러면 어떻게 락을 걸까요? 간단하게 프로그램을 만들어서 실험해 봅시다. 예제 1번입니다. 먼저 코드부터 보여드리겠습니다. 먼저 foo와 bar는, static 메서드가 아니지만, synchronized가 붙어있습니다. 이들을 동기화 메소드라고 이야기 합시다. 그리고 Thread를 상속받은 worker와 ..
최근댓글