정렬 된 서버 카운터와 동기화
위의 예제는 빌드하려는 정렬된 서버 카운터입니다. 당신은 버튼을 클릭 할 때:
- 비동기 요청이 서버로 전송됩니다
- 서버는 내부 카운터를 증가시킵니다
- 서버는 현재 카운터 값을 반환합니다
- 클라이언트(웹 페이지)는 위에 표시된 알림에 카운터를 표시합니다.
수신시 숫자의 순서를 유지하는 것이 중요합니다. 그렇다면 요청 순서를 어떻게 동기화 할 수 있습니까? 우리는 네트워크 요청이 비동기적이라는 것을 알고 있습니다. 첫 번째 요청이 두 번째 요청보다 도착하는 데 시간이 오래 걸리거나 두 번째 요청이 세 번째 요청보다 오래 걸리는 등 완전히 가능합니다. 요청의 순서가 도착은 우리의 응용 프로그램에 대한 문제가 될 것입니다.
‘동기화 없음’접근 방식
동기화 구성 없이 이 응용 프로그램을 개발하면 어떻게 될까요? 다음은 동기화가 없는 이 응용 프로그램의 시뮬레이션에 대한 샘플 구현입니다.
서버는processCommmand()
로 시뮬레이션되고 네트워크 지연은serverDelay()
로 시뮬레이션됩니다. 동기화 메커니즘이 없기 때문에”나를 클릭”버튼을 클릭하면 새 요청이 즉시 시작됩니다.
이 구현의 결과입니다.
어 오—숫자는 예상대로,순서가 표시되며,우리는 순서대로 숫자를 표시하는 우리의 응용 프로그램을 만드는 데 실패했습니다.
뮤텍스
에서 순서가 잘못된 문제 극복 문제는 네트워크 요청이 순서가 맞지 않지만 응용 프로그램에서 순서가 일치하기를 원한다는 것입니다. 이 문제를 해결하는 한 가지 방법은 뮤텍스 잠금을 사용하여 한 번에 하나의 요청 만 처리 할 수 있도록하고 다른 요청은 차례가 될 때까지 차단하는 것입니다.
뮤텍스를 사용한 구현은 다음과 같습니다.
뮤텍스 사용 흐름은 다음과 같습니다:
- 라인 23:
clientLock
획득 요청이 시작됩니다. 이 요청은 다른 사람이 이미 잠금을 획득하고 아직 잠금을 해제하지 않은 경우 차단 - 줄 33:서버가 응답 한 후 클라이언트 잠금이 해제되고 토스트가 표시됩니다. 이를 통해 다른 버튼 클릭 이벤트가 이제 잠금을 위해 경쟁하고 서버 네트워크 요청을 시작할 수 있습니다!
이 잠금 메커니즘은 한 번에 하나의 버튼 이벤트 만 처리하여 다른 버튼을 차단하고 대기시킵니다. 우리는 지금 처음에 표시된 우리의 원래 예제의 의도 된 순서 구현을 달성!
눈에 보이는 토스트 수 제한
여러 토스트가 한 번에 화면을 넘칠 수 있다는 점이 마음에 들지 않으면 어떻게해야합니까? 한 번에 표시되는 토스트 수를 제한하기 위해 논리를 확장 할 수 있습니다. 여기서 우리의 동기화 구조는 세마포어가 될 것입니다!
셈파호어를 뮤텍스처럼 생각하지만,여러 비동기 요청이 한 번에 코드 조각을 실행하도록 허용할 수 있습니다. 당신도 최대 수를 구성 할 수 있습니다!
뮤텍스와 세마포를 사용하여 화면의 토스트 수를 한 번에 2 로 제한 할 수있었습니다.
그리고 여기에 위의 예제와 관련된 코드입니다
6 행
셈파호어 구조는 값 2 로 초기화되며,이 값은 한 번에 최대 2 개의 토스트만 표시할 수 있도록 지정합니다.
라인 26-31
우리의 세마포어 논리는 우리가 토스트를 표시 할 때 우리를 도와 온다. 우리는 셈파호어를 획득하려고 합니다. 성공하면 토스트 개체를 만든 다음releaseSemaphore()
을 토스트completeCallback
함수에 전달합니다. 이 콜백은 토스트가 해제 될 때 호출됩니다.