동시에 들어오는 요청 처리방법 중 하나입니다.
Synchronized의 방법으로는 4가지가 있습니다.
- synchronized method
- synchronized block
- static synchronized method
- static synchronized block
4가지 방식의 차이는 lock이 적용되는 범위입니다.
(※ lock = 트랜잭션 실행시 사용되는 자원이라고 봅시다.)
1. synchronized method

main에서 [Thread1 와 Thread2] 두개의 쓰레드가 a객체의 run메서드를 실행합니다.
이때 A클래스의 run메서드는 아래와 같이 되어있습니다.

이미지를 보면
(메서드 ⇒ 인스턴스)에 synchronized가 걸려있는 것을 확인할 수 있습니다.
해당 상태에서 main에서 실행되는 결과로는

순서대로 lock을 획득하고 반납을 합니다.
두 쓰레드가 하나의 a.run()을 공유하는 단계라서 순차적으로 진행이 됩니다.
만약 하나의 a객체가 아니라
a1 객체 / a2 객체로 따로 존재할 경우

실행을 하면

쓰레드 1의 a1이 끝나기를 기다리지 않고
쓰레드 2의 a2.run()이 실행되고 개별로 작업이 끝나는 것을 볼 수 있습니다.
⇒ 서로 다른 객체 || lock자원을 공유하지 않음 == 동기화 발생 X
2. static synchronized method
static이 포함된 synchronized method 방식
⇒ 일반적인 static 성질을 가지고 있습니다.
- 클래스 단위로 lock이 발생한다..

1번 방식에서는
두 객체가 있을 때 lock자원을 공유하지 않았지만…

static method로 synchronized가 걸려있을때는
⇒ 두 객체가 같은 run메서드를 공유하고 있기때문에

순차적으로 thread1에서 [lock]을 반환하고
thread2가 사용을 합니다.
synchronized method 와 static synchronized method는 lock을 공유할까??

print 메서드는 static이 아닙니다!!
run 메서드는 static 입니다!!!
서로 자원들을 공유할까??

결과: 공유 X
공유되지 않는 것을 볼 수 있습니다.
이것으로 인스턴스 단위의 lock과 클래스 단위의 lock은 공유되지 않은 것을 볼 수 있습니다…
정리
static synchronized method == 클래스 단위로 lock을 건다…
synchronized method == 인스턴스 단위로 lockd을 건다….
- lock을 공유하지는 않는다
3. synchronized block
인스턴스의 block 단위로 lock을 겁니다.
lock 객체를 지정해줘야합니다.

run메서드의 block을 지정한 모습…
this == A객체
위 이미지에서는 block이 메서드 전체에 적용 ⇒ method 단위로 lock을 건 것과 같다.

로직이 섞여있을때 필요한 부분만 block쳐서
lock을 건 형태

<결과>

A객체가 2개일 때



결과
synchronized method와 동일하다..
서로 다른 객체 || lock자원을 공유하지 않음 == 동기화 발생 X
3. static synchronized block
※static synchronized method 방식과의 차이점※
lock객체 지정, block으로 범위 한정지을 수 있다.
- 공통점
클래스 단위로 lock을 공유

lock 객체를 A클래스로 지정한 모습이다.

위 상태에서 실행이 되었을 때 결과로..

lock이 공유가 되어서 쓰레드1,2가 순차적으로 사용하고 반환하는 모습을 볼 수 있다.
synchronized가 동기화 순서를 보장하나요?? (중요★★)

실행 결과.

순서를 보장하지 않는 것을 볼 수 있습니다.
syncroniezed를 걸 때
본인이
클래스 단위로 거는지
인스턴스 단위로 거는지 체킹이 중요합니다.
또한
제일 마지막의 동기화 순서를 보장하지 않는다는 점을 통해
저희가 하는 경매시스템에는 적절하지 않다고 보아서
사용하지 않았습니다.
(경매 시스템에는 입찰 금액이 들어온 순서대로 처리하는 것이 중요하다)
참조 블로그
Share article