이 기사는 Java가 참조를 위해 Red Envelope Grab 함수를 구현할 수있는 특정 코드를 공유합니다. 특정 내용은 다음과 같습니다
주요 아이디어 :
1. 빨간 봉투를 잡는 데 여러 사람의 동시 작업이 포함되며, 다중 스레드 작업 결과가 올바른지 확인하려면 동기화가 필요합니다.
2. 성능의 관점에서 동시에 온라인으로 많은 사람들이 많은 사람들로 인해 플레이어는 빨간 봉투 요청을 보내기 위해 적시에 응답 할 필요가 없지만 서버는 빨간 봉투 대기열을 정기적으로 실행합니다.
다음은 기본 코드 및 구현 로직 설명입니다.
1. 빨간 봉투의 엔티티 개념을 나타내는 클래스를 만듭니다. 원자 변수를 직접 사용하여 증가 및 감소의 동기화를 보장합니다. Java의 원자 변수는보다 세밀한 동기화 메커니즘입니다. 경쟁이 치열한 상황에서 잠금의 성능은 원자 변수의 성능을 초과하지만보다 현실적인 경쟁 상황에서는 원자 변수가 더 나은 성능을 누립니다.
공개 클래스 SpringGift {개인 문자열 역할; 개인 inomicinteger 선물; 공개 문자열 getrole () {반환 역할; } public void setrole (문자열 역할) {this.role = 역할; } public atomicinteger getGift () {반환 선물; } public void setGift (atomicinteger Gift) {this.gift = 선물; } public int getRemainCount () {return this.gift.get (); }} 2. 멀티 스레딩 시뮬레이션을 사용하여 동시에 빨간 봉투를 잡습니다. 서버는 플레이어가 대기열에서 보낸 빨간 봉투를 저장 한 다음 작업을 사용하여 레드 엔벨로프 정보를 플레이어에게 정기적으로 밀어 넣습니다. 각 플레이어 배치에 대한 레드 엔벨로프 횡단 요청은 실제로 대기열에서 팝업 된 첫 번째 빨간 봉투 요소에 의해 작동되지만 현재의 빨간 봉투 수가 비어 있으면 다음 빨간 봉투가 자동으로 팝업됩니다 (있는 경우).
공개 클래스 테스트 {공개 정적 동시에 린드 퀴크 <SpringGift> 대기열; 공개 정적 Springgift Currgift; public static atomicinteger count = new atomicinteger (); 정적 클래스 신화는 runnable {public void run () {handleEvent (); }} public static void main (string [] args)은 예외를 던집니다. for (int i = 0; i <3; i ++) {SpringGift Gift = New SpringGift (); Gift.setrole ( "역할"+i); Gift.SetGift (New Atomicinteger (50)); queue.add (선물); } mythread mythread = new Mythread (); for (int i = 0; i <1000; i ++) {새 스레드 (Mythread) .start (); } system.err.println ( "총 수신"+count.get ()); } private static springgift getGift () {// 여러 스레드가 동시에 큐를 튀어 나오는 것을 방지합니다 (큐) {// 잠금이 없으면 인쇄 된 총 수가 올바르지 않습니다! ! ! ! if (currgift == null || currgift.getRemainCount () <= 0) {currgift = queue.poll (); }} return currgift; } public static void handleEvent () {try {springgift obj = getGift (); if (obj == null || obj.getRemainCount () <= 0) {System.err.println ( "not"); 반품 ; } if (obj! = null && obj.getGift (). getAndDeCrement ()> 0) {System.err.println ( "빨간색 봉투 받기"); count.getAndIncrement (); } stride.sleep (500); // 기타 작업 시뮬레이션 및 처리} catch (예외 e) {e.printstacktrace (); }}}실행 결과의 스크린 샷은 다음과 같습니다
getGift () 메소드가 헤더 요소를 자동으로 팝업하므로 동기화 메커니즘을 수행해야합니다. 그렇지 않으면, 여러 요청이 동시에 특정 빨간 봉투의 마지막 남은 부분을 작동하면 총 빨간 봉투 수가 잘못됩니다.
(잠긴 코드에 댓글을 달면 인쇄 된 총 수가 잘못 될 수 있습니다!)
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.