이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 193519|회답: 11

[출처] .net/c# 사용자 다중 스레드 동시성 lock(string){...} 상세 설명

[링크 복사]
게시됨 2019. 7. 3. 오후 3:25:19 | | | |
일반적인 오용 사례: 사용자가 결제 버튼을 여러 번 실수로 클릭해 중복 결제를 방지하기 위해, 주문 조작을 할 수 있도록 주문 번호 락(lock)을 사용해 한 스레드만 처리할 수 있도록 합니다.

이 아이디어는 적어도 lock(처리 클래스용 사비 정적 객체)보다는 낫습니다. 왜냐하면 명령 번호를 잠그면 현재 1 명령의 연산만 잠기고, 만약 고정 변수를 잠그면, 즉 모든 명령을 잠그면 모든 명령이 대기열에 들어가게 되는데, 이는 명백히 비합리적입니다.

그렇다면 이 글 처음에 언급한 락(주문 번호) 방법이 원하는 효과를 낼 수 있을까요? 먼저 사용 시나리오를 복원하는 코드를 사용해 보겠습니다.

사용자 정보와 기타 검증을 무시하면, 코드는 대체로 다음과 같습니다:
lock 키워드에 대해서는, MSDN에 Baidu에서 찾을 수 있는 정보가 포함되어 있고, lock(string) 사용은 권장되지 않는 것 같으며, 그 이유는 같습니다. 다음 구절은 MSDN의 자물쇠 줄에 관한 조언에서 발췌한 것입니다:

lock("myLock") 문제는 프로세스에서 같은 문자열을 사용하는 다른 코드가 동일한 락을 공유하기 때문에 발생합니다.
이 문장은 거대한 메커니즘, 즉 "같은 끈"을 숨기고 있습니다.

"같은 줄"이란 무엇인가요? 코드를 확인하세요:


STR1과 STR2가 위의 문자열 중 같은 문자열인가요? 답은 '예'입니다.

다시 보기:


str1과 str2 위도 여전히 같은 줄인가요? 대답은 안 된다야.

좋아요, 주문 결제 문제로 돌아가죠. 우리 코드인 lock(orderNumber)에서, 사용자가 손을 스와이프한 후 실수로 몇 번 더 클릭했을 때, orderNumber가 매번 같은 문자열로 이 동작을 입력하나요? 대답은 안 된다야. 즉,

위 주문을 처리하는 코드는 실제로 잠금장치 역할을 하지 않습니다.

사실, 문자열 비교에는 두 가지 유형이 있으며, 코드를 참고하세요:


위 코드의 첫 번째 줄은 True를, 두 번째 줄은 False를 출력합니다. 제 설명 없이도 MSDN이 말하는 '같은 문자열'이 무슨 뜻인지 이해하실 거라 생각합니다.

최선의 해결책

최적의 잠금 현 해법:





데모 코드:




웹사이트에서는 때때로 전역 변수를 사용할 수 있는데, 이 전역 변수는 여러 사용자가 동시에 접근할 때 비정상적으로 보일 수 있습니다. 이 시점에는 전역 잠금을 설정하지만, 단점은 모든 접근이 차례로 대기한다는 점입니다.

예를 들어, 같은 사용자가 15초 이내에 단 한 번만 댓글을 달 수 있는 경우, 글로벌 락을 사용하면 사용자 수가 급증할 때 댓글 처리 속도가 매우 느려져 사용자 경험에 큰 영향을 미칩니다.

이 시점에서,각 사용자별로 lock(string){...}을 설정할 수 있고, 락의 이름은 다음과 같이 정의할 수 있습니다:메서드 이름 + 사용자 ID이렇게 하면 각 사용자는 독립적인 잠금을 가지며, 댓글 간격을 판단할 때 다른 사용자의 댓글에는 영향을 주지 않습니다.

(끝)




이전의:MFC의 LPSTR 타자 쓰기
다음:OpenSSL은 분명히 업데이트되었고, Apache는 여전히 이전 버전을 프롬프트하나요?
게시됨 2022. 5. 13. 오후 2:27:17 |
그렇다면 이 글 처음에 언급한 락(주문 번호) 방법이 원하는 효과를 낼 수 있을까요? 먼저 사용 시나리오를 복원하는 코드를 사용해 보겠습니다.
 집주인| 게시됨 2023. 8. 12. 오후 7:48:15 |
.NET/C# 잠금 원칙 모니터가 심층적인 설명을 제공합니다
https://www.itsvse.com/thread-9633-1-1.html
게시됨 2023. 1. 7. 오전 11:22:02 |
저도 업무 실습에서 이 문제를 접했는데, 이 기술 기사를 제공해 주신 저자에게 감사드립니다
게시됨 2019. 7. 3. 오후 8:02:32 |
좋은 내용이에요
게시됨 2021. 6. 18. 오후 2:24:43 |
페이지에 표시된 것은 코드를 볼 수 없다는 점입니다
게시됨 2021. 6. 29. 오전 12:21:16 |
코드를 봐
게시됨 2021. 6. 29. 오전 12:54:24 |
코드가 안 보여요
게시됨 2022. 5. 14. 오전 10:06:46 |
배우기 위해 배우세요
게시됨 2022. 5. 28. 오후 10:03:59 |
아주 좋아, 배웠어
게시됨 2022. 11. 28. 오후 9:46:47 |
asp.net 사용할 수 있나요?
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com