동기화 사용 - 1

"안녕, 아미고!"

"네, 여기 있어요, 여기 있어요."

"오늘은 실제로 동기화를 사용하는 방법에 대해 알려 드리겠습니다 ."

"프로그램에 많은 개체와 스레드가 있는 경우 여러 스레드가 동일한 개체에 대해 동시에 작업하는 경우가 종종 있습니다. 그렇게 하면 스레드가 서로 간섭합니다."

"예, 이미 알고 있습니다."

"그래서 여러 스레드에서 개체에 액세스하고 있다고 가정해 보겠습니다. 문제를 피하기 위해 두 가지를 할 수 있습니다."

"첫 번째는 동기화된 블록을 사용하여 개체가 액세스되는 모든 위치를 래핑하는 것입니다. 그러나 일부 프로그래머가 동기화된 블록 없이 개체에 직접 액세스하는 코드를 작성하는 경우 이 접근 방식이 작동하지 않을 수 있습니다."

"따라서 개체를 스레드로부터 안전하게 만드는 두 번째 접근 방식이 대부분 사용됩니다." "즉, 동기화된 메커니즘은 개체 자체에 내장되어 있습니다. 동기화된 메서드를 선언하거나 메서드 내부의 코드를 동기화된 블록으로 래핑합니다."

"그래서 내가 여러 스레드에서 사용할 수 있는 개체는 프로그램의 거의 모든 개체이므로 스레드로부터 안전하게 만들어야 합니까?"

"일반적으로 그렇습니다. 실제로 프로그램의 모든 개체가 다른 스레드에서 사용되는 것은 아니지만 일반적으로 많이 있습니다. 따라서 스레드에 대한 코드 작성을 시작하고 스레드에서 다양한 개체에 액세스한 다음 각 메서드 호출과 함께 "이 통화는 안전한가요?"

"안전한?"

"Thread-safe, 이는 여러 스레드에서 안전하게 호출할 수 있음을 의미합니다."

"여기 몇 가지 예가 있습니다. 다른 스레드에서 액세스되는 String 개체가 있다고 가정합니다. 이미 기억하고 있듯이 String은 다른 모든 기본 유형과 마찬가지로 변경할 없습니다. 즉, 개체가 생성된 후 변경되지 않습니다. . 이것은 그러한 객체를 «파괴»하는 것이 불가능하다는 것을 의미합니다. 모든 불변 객체는 스레드로부터 안전합니다."

"글쎄요, 그러면 일이 더 쉬워집니다."

"이제 변경 가능한 문자열이 필요하다고 가정해 보겠습니다."

"예, 기억합니다. 이러한 문자열에는 StringBuffer와 StringBuilder의 두 가지 종류가 있습니다. StringBuffer는 StringBuilder와 비슷하지만 모든 메서드가 동기화됩니다. 스레드로부터 안전한가요?"

"예. 여러 스레드에서 StringBuilder 개체에 액세스해야 하는 경우 StringBuffer로 교체해야 합니다. 그렇지 않으면 조만간 스레드가 동시에 변경하여 «중단»합니다."

"다른 스레드에서 액세스되는 개체가 내 클래스의 개체이면 어떻게 됩니까? 이 경우에도 메서드에 synchronized를 추가해야 합니까?"

"예. 이 규칙을 따르는 것이 가장 좋습니다. 다른 스레드에서 액세스할 모든 개체는 스레드로부터 안전해야 합니다."

"그렇구나. 모든 것이 그렇게 심각하다고 생각하지 않았어. 고마워, 엘리."

"천만에요. 디에고가 몇 가지 쉬운 작업을 알려줄 때 이 팁이 도움이 되었으면 합니다. ☺"