Java 동기화에 대해 SO에 대한 질문이 나타날 때마다 일부 사람들은 synchronized(this)
피해야 할 점을 지적하기를 간절히 원합니다. 대신, 그들은 개인 참조에 대한 잠금이 바람직하다고 주장합니다.
주어진 이유 중 일부는 다음과 같습니다.
- 일부 악의적 인 코드 가 잠금을 훔칠 수 있습니다 (매우 인기있는이 코드 에는 "실수로"변형 된 코드가 있음)
- 동일한 클래스 내의 모든 동기화 된 메소드는 정확히 동일한 잠금을 사용하여 처리량을 줄입니다.
- 너는 (불필요하게) 너무 많은 정보를 노출하고있다
저를 포함한 다른 사람들 synchronized(this)
은 Java 라이브러리에서도 많이 사용되는 관용구가 안전하고 잘 이해되고 있다고 주장합니다 . 버그가 있고 멀티 스레드 프로그램에서 무슨 일이 일어나고 있는지에 대한 단서가 없기 때문에 피해서는 안됩니다. 즉, 해당되는 경우 사용하십시오.
나는 일을 this
할 때 잠금을 피하는 것이 선호되는 실제 예제 (foobar 내용 없음)를 보는 데 관심 synchronized(this)
이 있습니다.
따라서 항상 synchronized(this)
개인 참조의 잠금으로 피하고 교체해야합니까?
추가 정보 (답변이 주어지면 업데이트 됨) :
- 우리는 인스턴스 동기화에 대해 이야기하고 있습니다.
- 암시 적 (
synchronized
메소드) 및 명시 적 형식이synchronized(this)
모두 고려됩니다. - 주제에 대한 Bloch 또는 기타 권한을 인용하는 경우, 원하지 않는 부분을 제외하지 마십시오 (예 : 효과적인 Java, 스레드 안전성의 항목 : 일반적으로 인스턴스 자체의 잠금이지만 예외가 있습니다).
synchronized(this)
제공하는 것 이외의 잠금 장치에서 세분성이 필요한 경우synchronized(this)
해당 사항이 없으므로 문제가 아닙니다.