2011-12-19 3 views
3

저는 현재 작업중인 Android 애플리케이션에서 여러 웹 요청을합니다. 나는이 모든 요청을 도착한 순서대로 한 번에 하나씩 처리하기를 원한다. 내 코드가 그렇게 하는가?대기열 동기화 및 구현에 대한 이해

동기를 읽고 이해하는 방법은 내가 스핀 오프 한 모든 스레드 중 하나입니다. 한 번에 아래의 방법 중 하나만 사용할 수 있습니다. 예를 들어 사용자가 하나의 스레드에서 postPhoto를 시도한 다음 다른 스레드에서 즉시 getData를 시도하면 getData 스레드는 postPhoto 스레드가 완료 될 때까지 대기하여 데이터를 가져 오기 시작합니다. 모든 웹 요청이이 클래스를 거치고 모든 메소드가 동기화되므로, 그것은 본질적으로 정확한 큐에 있다는 것을 의미합니까?

편집
public class Controller { 

public synchronized static String getData(String url, String limit) { ... } 

public synchronized static String postPhoto(String filepath, int server_id) { ... } 

public synchronized static InputStream getPhoto(String thumbnailPath) { ... } 

public synchronized static String createIncident(String name, String description) { ... } 

public synchronized static String updatePerson() { ... } 

synchronized static boolean verifyConnection(String response) { ... } 
} 

: 아마 위의 방법 중 일부는 createIncident 또는 updatePerson라고하더라도 언급해야
, 그들 모두 만 httprequests을하기 위해선, 모든 메소드 내부의 코드는 일반적으로 동일 중요한 사소한 차이는 제외. 내 코드의 다른 부분에서는 스레드를 사용하여 이러한 메서드를 호출합니다. 그 부분은 내가 요구 한 부분입니다. 이러한 스레드는 이러한 메서드를 호출하므로 getData를 호출하는 스레드 B는 스레드 A가 postPhoto의 일부가 될 때까지 기다려야합니다.

+1

대부분의 대기열 뒤에있는 아이디어는 생산자와 소비자 작업을 동시에 허용하는 것입니다. 이 경우 요청을 직렬화하지만 "생산자"는 "소비자"가 바쁠 때 차단됩니다. –

+0

@ 피터 (Peter)가 말한 바를 명확히하기 위해서 : 코드는 기본적으로 멀티 스레드가 아니며, 이는 아마도 당신이 원하는 것이 아닙니다. 확실히 안전하게 동기화되지만 멀티 코어 하드웨어의 단일 코어에 해당하는 성능 만 가질 수 있습니다. – toto2

+0

나는 분명히 할 것입니다. 나는 원래의 질문에서 중요한 정보를 남겼다고 생각한다. – Josh

답변

1

구현에 따라 다릅니다. 컨트롤러가 싱글 톤입니까, 아니면 인스턴스가 스레드입니까? 메서드에서 공유 객체를 사용합니까?

개체를 공유하는 싱글 톤 및 메서드 인 경우 순차적으로 호출하더라도 thread1이 postPhoto를 실행하고 getData를 즉시 실행할 수 있다고 보장 할 수 없습니다. 다른 스레드는 차례를 따라 스레드 2 사이에서 실행되는 두 메서드를 호출 할 수 있습니다.

동기화 키워드는 클래스 자체를 잠급니다. 따라서 언제든지 하나의 메소드 만 실행됩니다. 동시에 2 개의 동기화 된 메소드가 실행되지 않습니다.

+0

모든 메서드는 정적이므로 singleton인지 여부는 중요하지 않습니다. – toto2

+0

예, 우리는 모든 정적을 볼 수 있지만 일부 인스턴스 메소드도있을 수 있습니다. 우리는 전체 코드를 보지 못합니다. – fmucar

+0

그래, 그것은 싱글 톤이 아니며 모든 방법은 정적이다. 당신의 대답의 마지막 부분은 내가 생각했던 것입니다. 그것들은 정적이고 동기화 된 클래스 잠금이기 때문에 언제든지 오직 하나의 메소드 만 실행될 것입니다. 나는 명령이 시행되지 않을 것이라는 것을 안다, 그러나 나는 그것으로 괜찮다. 한 번에 하나씩 이니까 – Josh

1

네, 맞습니다. synchronizedstatic의 조합은 원하는 것을 보장합니다.