해결된 질문
작성
·
124
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
package network.tcp.v6;
import network.tcp.v5.SessionV5;
import java.util.ArrayList;
import java.util.List;
public class SessionManagerV6 {
private List<SessionV6> sessions = new ArrayList<>();
public synchronized void add(SessionV6 session) {
sessions.add(session);
}
public synchronized void remove(SessionV6 session) {
sessions.remove(session);
}
public synchronized void closeAll() {
for (SessionV6 session : sessions) {
session.close();
}
sessions.clear();
}
}
여기서 closeAll()
에서 스레드가 작업중일때 다른스레드가 remove()
를 호출할 수 없다는 부분이 잘 이해가 안 갑니다.
synchronized
는 메서드 단위로 적용이 된다고 알고 있어서 closeAll()
에 스레드가 작업중이더라도 remove()
같은 다른 메서드랑은 관련 없다고 생각했습니다.
뭔가 흐름을 잘못 이해하고 있는 걸까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 물병97님.
synchronized
키워드는 메서드나 특정 블록에 대해 단일 스레드만 접근할 수 있게 보호합니다. 이를 통해 여러 스레드가 동시에 특정 메서드에 접근하는 것을 방지할 수 있습니다.
SessionManagerV6
클래스에서 add()
, remove()
, closeAll()
메서드 모두 synchronized
키워드가 붙어 있기 때문에, 이 클래스의 인스턴스에 대해 한 번에 하나의 스레드만 이 메서드들 중 하나를 호출할 수 있습니다. 따라서, closeAll()
이 실행되는 동안 다른 스레드가 remove()
나 add()
를 호출하더라도 대기하게 됩니다.
synchronized
는 객체 단위로 동기화를 수행합니다. 즉, 하나의 SessionManagerV6
인스턴스에 대해 동기화된 메서드가 호출 중이라면, 다른 스레드가 같은 인스턴스의 다른 동기화된 메서드를 호출할 때도 대기해야 합니다.
이와 관련된 보다 자세한 설명은 여기에서 확인하실 수 있습니다. 이 게시물에서는 세션 및 동기화 관련 동작에 대해 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
네 맞습니다 🙂
synchronized에 별도의 지정 범위가 없다면 객체 단위로 적용됩니다.
자세한 내용은 자바 고급 1편 6. 동기화 - synchronized를 참고해주세요.
감사합니다.
synchronized
가 결국 객체 단위로 적용이 되어서 그런거라 이해하면 되는걸까요?