제 생각에는 동기화되지 않은 비 정적 메서드 내에서 호출되는 경우 static 메서드를 synchronized로 설정해야합니까?동기화 된 비 정적 메서드 내에서 호출되는 경우 정적 메서드를 동기화 된 것으로 만들어야합니까?
class Test
{
public static void m2()
{
}
public synchronized void m1()
{
Test.m2();
----
----
}
위의 경우 경쟁 조건을 피하기 위해 m2를 동기화 된 상태로 유지해야합니다. 그렇지 않으면 그대로 유지해야합니다.
마지막 단락에 약간의 문제가 있습니다. 정적에서 참조 할 수있는 코드 변경 객체는 일반적으로 수행되지 않아야하지만 스레드로부터 안전해야합니다. 거의 모든 정적 메서드는 정적을 변경하면 안되며 스레드로부터 안전 할 필요는 없습니다. 예를 들어'Collections.sort'를 스레드로부터 안전하게 만들지는 않을 것입니다. –
@Tom : Collections.sort *는 다른 스레드에서 관찰되는 컬렉션을 전달하지 않는다고 가정하면 자동으로 스레드로부터 안전하다고 말할 수 있습니다. 정적 메서드가 전역 상태를 변경하지 않으면 스레드로 넘겨지는 것과 마찬가지로 스레드로부터 안전합니다. 만약 * 전역 상태를 돌연변이 (또는 잠재적으로 그냥 관찰)한다면, 스레드 안전을 위해 필요한 모든 잠금을 적용해야합니다. –
'static '메소드를 언급하는 것이 더 취약합니다. – fastcodejava