synchronized란?
java ·synchronized는 자바 예약어로 동기화를 위해 사용한다.
동기화하는 이유는 스레드의 동시성 문제와 가시성 문제를 해결하기 위해서다.
동시성 문제는 스레드가 동시에 값을 수정할때 생기는 문제고, 가시성 문제는 실제 메모리에 있는 값과 캐싱해온 값이 각각의 스레드마다 다를때 생기는 문제다
synchronized를 이용해 쉽게 동기화 할 수 있다. synchronized는 해당 메소드나 블록은 lock이 걸리게 되고 하나의 스레드만 접근 가능하게 즉 동기화 시켜준다.
하지만 동기화한 부분은 하나의 스레드가 처리하는 동안 다른 스레드들은 대기를 해야함으로 성능하락및 자원낭비가 심해진다.
가시성 문제는 volatile를 사용해 해결할 수 있다. volatile은 항상 메인메모리에서 값을 조회하는 예약어다. 자바는 기본적으로 한번 가져온 데이터는 캐시메모리에 저장하기 때문이다.
추가 내용
모든 객체에는 lock이 있고, 스레드에서 lock을 획득하면 해당 스레드에서 객체를 접근할 수 있는 방식이다.
이때 한번 lock을 획득한 스레드는 계속해서 lock을 획득할 수 있는데 이를 재진입성이라고 한다