[JAVA] 멀티 쓰레드의 동기화(synchronization): 메서드, 메서드 내 블록에 synchronized 키워드를 붙이자!

2023. 9. 10. 10:00· JAVA
목차
  1. 💋 동기화 문제 발생
  2. 💋 동기화 문제 해결
  3. ✔ 메서드에 synchronized 키워드 추가
  4. ✔ 메서드 내부 블록에 synchronized 키워드 추가
  5. 💋 참고자료
반응형

 

 

💋 동기화 문제 발생

 

class SynchronizationTest {

    @Test
    void testSynchronized() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        SynchronizedMethods summation = new SynchronizedMethods();

        IntStream.range(0, 1000)
                .forEach(count -> executorService.submit(summation::calculate));
        executorService.awaitTermination(500, TimeUnit.MILLISECONDS);

        assertThat(summation.getSum()).isEqualTo(1000);
    }

    private static final class SynchronizedMethods {

        private int sum = 0;

        public void calculate() {
            setSum(getSum() + 1);
        }

        public int getSum() {
            return sum;
        }

        public void setSum(int sum) {
            this.sum = sum;
        }
    }
}

 

  • 1000개의 쓰레드를 만들어, 각 쓰레드가 동일한 SynchronizedMethods 인스턴스의 sum 변수에 접근해 1씩 더하는 상황
  • 예상대로라면 1000번 더하게 되므로, 결과가 1000이 나와야 하는데...!

  • 이 테스트가 실패하는 이유는 SynchronizedMethods 클래스의 calculate() 메서드에서 여러 쓰레드가 동시에 접근하여 sum 변수를 수정하고 있는데, 이 때문에 동시에 수정하는 경우가 발생할 수 있기 때문
    • 동시에 수정하면, 같은 값에 +1을 하는 경우가 발생할 수 있다. 
    • 여러 쓰레드가 동시에 calculate() 메서드에 접근하여 getSum() 메서드를 호출하고, 각각의 결과에 1을 더한 값을 setSum() 메서드를 통해 sum 변수에 저장하려고 할 때, 동시에 접근하는 경우에는 한 쓰레드의 계산 결과가 다른 쓰레드에 의해 덮어씌워질 수 있다. 
  • 따라서 동기화를 적용하여 한 번에 하나의 쓰레드만 접근하도록 해야 한다!!!

 

💋 동기화 문제 해결

✔ 메서드에 synchronized 키워드 추가

 

        public synchronized void calculate() {
            setSum(getSum() + 1);
        }

 

이렇게 하면, 이 메서드는 이제 한 번에 한 쓰레드만 접근할 수 있다. 

 

참고로, static 메서드에도 해당 키워드를 추가할 수는 있는데! 

static 메서드는 JVM에서 진짜 딱 1개만 관리하기 때문에, 딱 1개만의 쓰레드가 static synchronized 메서드에 접근할 수 있게 되므로, 이 부분이 병목이 되지 않도록 특히 주의해야 한다. 

 

 

✔ 메서드 내부 블록에 synchronized 키워드 추가

        public void calculate() {
            synchronized (this) {
                setSum(getSum() + 1);
            }
        }

 

메서드 전체에 한 번에 딱 1개의 쓰레드가 접근하도록 하는건 부담스러울 수도 있다. 

이렇게 블록으로 일부만 synchronized되도록 만들 수 있다! 

 

이건 나의 개인적으로 궁금했던 점

더보기

 

💋 참고자료

  • https://www.youtube.com/watch?v=vp0Gckz3z64
  • https://www.baeldung.com/java-synchronized
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'JAVA' 카테고리의 다른 글

[JAVA] Reflection API: 개념, 사용법, 예시 코드  (0) 2023.09.28
[JAVA] Java Reflection API에서 클래스 이름 가져오기: getName() vs getCanonicalName()  (0) 2023.09.12
[JAVA] 쓰레드 풀(Thread Pool): 개념, 장점, 사용 방법, 코드 예시 (feat. Baeldung)  (1) 2023.09.09
[JAVA] 프로세스와 스레드: 개념, Java의 쓰레드 구현, I/O Blocking  (0) 2023.09.08
[JAVA] 좋은 객체 지향 설계의 5가지 원칙 (SOLID)  (0) 2023.05.01
  1. 💋 동기화 문제 발생
  2. 💋 동기화 문제 해결
  3. ✔ 메서드에 synchronized 키워드 추가
  4. ✔ 메서드 내부 블록에 synchronized 키워드 추가
  5. 💋 참고자료
'JAVA' 카테고리의 다른 글
  • [JAVA] Reflection API: 개념, 사용법, 예시 코드
  • [JAVA] Java Reflection API에서 클래스 이름 가져오기: getName() vs getCanonicalName()
  • [JAVA] 쓰레드 풀(Thread Pool): 개념, 장점, 사용 방법, 코드 예시 (feat. Baeldung)
  • [JAVA] 프로세스와 스레드: 개념, Java의 쓰레드 구현, I/O Blocking
깃짱
깃짱
연새데학교 컴퓨터과학과 & 우아한테크코스 5기 백엔드 스타라이토 깃짱
반응형
깃짱
깃짱코딩
깃짱
전체
오늘
어제
  • 분류 전체보기
    • About. 깃짱
    • Weekly Momentum
      • 2024
    • PROJECT
      • AIGOYA LABS
      • Stamp Crush
      • Sunny Braille
    • 우아한테크코스5기
    • 회고+후기
    • Computer Science
      • Operating System
      • Computer Architecture
      • Network
      • Data Structure
      • Database
      • Algorithm
      • Automata
      • Data Privacy
      • Graphics
      • ETC
    • WEB
      • HTTP
      • Application
    • C, C++
    • JAVA
    • Spring
      • JPA
      • MVC
    • AI
    • MySQL
    • PostgreSQL
    • DevOps
      • AWS
      • 대규모 시스템 설계
    • frontend
      • HTML+CSS
    • NextJS
    • TEST
    • Industrial Engineering
    • Soft Skill
    • TIL
      • 2023
      • 2024
    • Linux
    • Git
    • IntelliJ
    • ETC
      • 日本語

블로그 메뉴

  • 홈
  • 깃허브

인기 글

최근 글

태그

  • 람다
  • 우테코
  • 상속과조합
  • 함수형프로그래밍
  • 레벨로그
  • 스트림
  • Stream
  • Java
  • 상속
  • 우아한테크코스
  • 우테코5기
  • 예외
  • 우아한테크코스5기
  • TDD
  • Composition
  • OOP
  • 조합
  • 람다와스트림
  • 컴포지션
  • lamda
hELLO · Designed By 정상우.v4.2.0
깃짱
[JAVA] 멀티 쓰레드의 동기화(synchronization): 메서드, 메서드 내 블록에 synchronized 키워드를 붙이자!
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.