Java : 레이스 조건 - 여러 줄의 코드를 함께 실행할 수있는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/2222175

  •  19-09-2019
  •  | 
  •  

문제

토큰 광고를받는 등록 페이지가 있으며 매개 변수가 적용되는 경우 사용자를 로그인합니다.

토큰을 확인한 시간, DB에서 토큰을 제거한 시간까지 다른 사용자는 동일한 토큰을 사용하여 로그인 할 수 있습니다. 특정 범위의 코드 라인이 간섭하지 않도록 실행되도록하는 방법이 있습니까? 그래서 레이스 조건 문제가 없습니까?

감사해요

업데이트

두 개의 서버가 있습니다.

  1. Apache Tomcat 6
  2. Red5 V0.9 (무료 Java 기반 플래시 미디어 스트리밍 및 통신 서버)

Facebook 용 게임 응용 프로그램을 작성하고 있습니다.

게임 자체는 Adobe Flash Builder 2로 작성되었습니다.

게임 자체는 RED5 서버를 사용하여 제공됩니다. 문제는 RED5가 요청 및 응답 헤더를받지 못하고 Facebook에서 정보를 가져 오기 위해 사용할 세션 정보를 검색 할 수 없다는 것입니다.

문제를 해결하려면 사용자가 Tomcat 서버에 연결하면 해당 페이지가 Facebook 관련 정보에 대한 세션을 확인하고 Tinyfbclient를 사용하여 Facebook에 연결하고 MySQL DB (사용자 세부 사항)에 정보를 저장하여이를 확인합니다. 동일한 사용자는 Red5에 연결할 사용자입니다.

일단 토큰이 생성되면. Tomcat 페이지에는 관련 SWF 파일 (게임 파일)을 표시하기 위해 객체 HTML 요소가 표시됩니다. Tomcat 페이지는 토큰을 해당 SWF 파일로 전달합니다. SWF 파일이로드되면 토큰이 필요하고이를 사용하여 Red5에 연결하여 사용자 정보를 찾으십시오.

그 설명이 내 필요를 이해하는 데 도움이되기를 바랍니다. 모든 지원에 감사드립니다!

도움이 되었습니까?

해결책

당신은 a를 사용할 수 있습니다 자물쇠 물체.

잠금 물체를 사용하면보다 원시적 인 것보다 이점이 있습니다 동기화 된 블록 및 방법.

다른 팁

한 번에 하나의 스레드 만 실행할 수 있도록 코드 블록을 동기화 할 수 있습니다. 그러나 이것은 응용 프로그램 속도를 늦추기 때문에 아주 좋은 솔루션처럼 보이지 않습니다. 여러 사용자가 동시에 로그인하고 싶습니다.

토큰은 어떻게 만들어 집니까? 사용자 로그인에 응답하여 서버 측에서 생성 된 경우 한 사용자는 다른 사용자의 토큰을 사용할 수 없어야합니다.

동기화 된 메소드 / 블록이 필요한 것 같습니다.

예를 들어 여기를 참조하십시오 (동기화 된 메소드)

http://java.sun.com/docs/books/tutorial/estential/concurrency/syncmeth.html

다른 길을 과도하게 조리하지 않도록주의하십시오! 너무 많은 동기화가 병목 현상으로 이어질 수 있습니다!

로그인을 위해 왜 토큰을 만들고 있는지 잘 모르겠습니다. 귀하의 질문은이 토큰이 메모리가 아닌 데이터베이스에 있다는 것을 암시하는 것 같습니다. 그렇다면 동기화 및 뮤 테스가 실제로 도움이되지 않으므로 "업데이트 선택"으로 데이터베이스 레코드를 잠그는 것입니다.

어쩌면 이것은 많은 관련이없는 복잡성에 빠질 수도 있지만, 왜 로그인을 할 토큰을 만들고 있습니까? 로그인을 할 때마다 화면 또는 수신 양식에서 userID와 비밀번호를 수집하고 데이터베이스에 대해 확인하여 조합이 유효한지 확인하고 사용자에게 맡기면 무엇이 필요합니까?

"DB에서 토큰을 제거"한다고 말합니다. 데이터베이스는 SQL 데이터베이스입니까? 그렇다면 트랜잭션을 사용하여 레이스 조건을 피할 수 있습니다. 다음과 같이 보일 것입니다.

  1. 고유 한 세션 ID를 만듭니다 UUID sessionID = UUID.randomUUID();
  2. 거래를 시작하십시오
  3. 요청의 DB와 일치하는 DB에서 토큰을 삭제하십시오 (예 :
    Tokenid =에서 토큰에서 삭제하십시오 u003Crequested-token>
  4. 영향을받는 행 카운트를 얻으십시오
  5. 영향을받는 행 카운트가 정확히 1이면 토큰이 유효했습니다. 세션을 만듭니다
    세션 값에 삽입 (sessionuuid, userId, logintime, ...)
  6. 거래를 커밋합니다

이제 로그인이 성공한 경우 (즉, 영향을받는 행 카운트는 정확히 1) 고객에게 세션 ID가 포함 된 쿠키를 보내십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top