Android/Java synchronized에 대해서
2014. 4. 8. 14:44ㆍPrograming/Android / Java
안드로이드/자바 애플리케이션이 수행되면 서버나 WAS에 프로세스가 생성되고,
하나의 프로세스에는 하나 이상의 Thread(스레드)가 생성되게 된다.
하나의 프로세스에는 하나 이상의 Thread(스레드)가 생성되게 된다.
생성 된 스레드가 단일 스레드일 수 있고, 여러개의 스레드일 수도 있다.
synchronized는 매우 유용하나, 내용을 정확히 알고 써야 하는 중요한 놈이기에 적확히 이해하고 사용하자.
스레드는 같은 프로세스내에서 동일한 데이터를 공유한다.
따라서 하나의 데이터에 대해서 동시에 여러개의 스레드가 접근이 가능하며,
그에 따라 데이터의 일관성에 관한 문제가 생길 수가 있다.
이를 해결하기 위해 툭!! 하고 튀어나온 놈이 바로 synchronized 이다.
synchronized란?
하나의 자원(데이터)에 대해서 여러 스레드가 사용하려고 할때 한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것이다.
synchronized 식별자는 보통 메소드의 선언부에 쓰고 이 키워드가 붙은 메소드는 한번에 하나의 스레드만 접근이 가능하며 메소드가 사용중일 때 다른 스레드가 메소드를 호출하면 앞의 스레드가 종료될때까지 기다려야 한다.
synchronized는 하나의 객체에 여러개의 객체가 동시에 접근해 처리하는것을 막기위해 사용한다.
메소드를 동기화하려면 메소드 선언부에 synchronized 식별자를 쓰고,
synchronized는 하나의 객체에 여러개의 객체가 동시에 접근해 처리하는것을 막기위해 사용한다.
public synchronized void exampleMethod() {
//code
...
...
}
private Object obj = new Object();
public void exampleMethod() {
public void exampleMethod() {
synchronized(obj) {
//code
...
...
}
}
메소드를 동기화하려면 메소드 선언부에 synchronized 식별자를 쓰고,
특정부분을 동기화 하려면 해당 코드 블록에 선언해서 사용하면 된다.
애플리케이션 성능에 있어 이 식별자의 영향력이 막강함에 비해 사용법은 간단하다.
이말은 거꾸로 해석하자면
synchronized를 잘 알고 쓰면 애플리케이션 자원의 안전성에 득이 되지만 제대로 알지못한 상태에서 남용해서 사용하면 오히려 시스템 성능에 치명적인 독이 될수도 있다는 점을 반드시 인지해야 한다.
그렇다면 어떤 때에 synchronized 식별자를 선언해야 할까?
가장 대표적인 경우이다.
이런 상황이 발생했을시에 시스템의 안전성 및 데이터의 일관성에 문제가 생길 수 있는 때는
해당 메소드에 동기화를 부여해야 한다.
어쩌다 한번씩 생길 수 있는 오류라고 해도 개발자라면 항상 참이 될도록 가능한한 튼튼한 구조물을 지어야 하지 않을까...
한마디로 줄이자면,
그렇다면 어떤 때에 synchronized 식별자를 선언해야 할까?
가장 대표적인 경우이다.
* 하나의 객체에 여러개의 스레드가 접근해서 처리하고자 할때
* static으로 선언한 객체에 여러 스레드가 동시에 사용할때
* static으로 선언한 객체에 여러 스레드가 동시에 사용할때
이런 상황이 발생했을시에 시스템의 안전성 및 데이터의 일관성에 문제가 생길 수 있는 때는
해당 메소드에 동기화를 부여해야 한다.
어쩌다 한번씩 생길 수 있는 오류라고 해도 개발자라면 항상 참이 될도록 가능한한 튼튼한 구조물을 지어야 하지 않을까...
한마디로 줄이자면,
synchronized... 꼭 필요한때만 사용하자!
'Programing > Android / Java' 카테고리의 다른 글
How to add system property in Android (안드로이드에서 시스템 프로퍼티 추가 방법) (0) | 2014.04.15 |
---|---|
[유틸리티 추천] 안드로이드 디버깅 툴 추천 (0) | 2014.04.08 |
Android/JAVA - android.Manifest.permission (0) | 2014.04.07 |
Android/JAVA - 안드로이드 바인더(Android Binder)가 탄생하기 까지 (0) | 2014.04.07 |
Android/JAVA - Binder Source Analysis (바인더 소스 분석) (0) | 2014.04.07 |