이 기사는 주로 은행 사용자가 돈을 인출하는 예를 통해 다이바 프로그래밍 다중 스레드 동시 처리 시나리오를 보여줍니다.
예에서 시작하십시오. 은행 계좌 철수 시나리오의 예제 코드를 구현하십시오.
첫 번째 수업 : Account.java
계정 카테고리 :
PACKED CN.EDU.BYR.TEST; 공개 클래스 계정 {private String Acc double getBalance () {return this.balance;} public void setBalance (double balance) {this.balance = balance;} public boolean equals (object obj) {if (this == obj) 반환 true; if (obj! = null && obj.getClass () == Acc target.getAccountno (). Equals (AccountNo);} return false;}} 두 번째 클래스 : DrawThread.java
돈 철수 스레드 클래스 :
package cn.edu.byr.test; public class drawThread는 스레드 {private 계정; private double drawamount; public drawThread (문자열 이름, 계정 계정, Double DrawAmount) {super (name); this.account = convers; this.drawamount;} public void run () {// synchronized (계정) {if (get.getbalance) DrawAmount) {System.out.println (getName () + "성공적으로 돈을 얻고 자금을 뱉어 내십시오 :" + drawAmount); // try {// thread.sleep (1); //} // catch (InterruptedException e) {// e.printstacktrace (); //} account.setBalance (ac System.out.println ( "/t 균형은" + ac DrawThread ( "A", Acct, 800) .start (); New DrawThread ( "B", Acct, 800) .start ();}} 위의 코드에서 주석을 달린 부분 : (1) 동기화 동기화 코드 블록 (2) 스레드 최대 절전 모드. (1) 및 (2) 인 경우 실행 결과에 대한 많은 가능성이 있습니다. 가능성 중 하나 (확률은 작음) 정상 논리를 준수합니다.
B는 돈을 성공적으로 철회하고 돈을 뱉어냅니다 : 800.0
균형은 : 200.0입니다
철수 실패와 잔액이 충분하지 않았습니다!
B는 먼저 돈 철수 자원을 찾아서 A가 사용자 잔액을 판단하기 시작하기 전에 잔액을 올바르게 수정해야합니다. 이 확률은 매우 작으며 대부분의 작업은 다음 상황과 유사합니다.
성공적으로 돈을 철수하고 돈을 뱉어냅니다 : 800.0
B는 돈을 성공적으로 철회하고 돈을 뱉어냅니다 : 800.0
균형은 : -600.0입니다
균형은 : 200.0입니다
이것은 분명히 비논리적입니다. 실행 결과에서, 우리는 A가 먼저 자원을 압수하고 금액을 인출한다고 추측 할 수 있지만, 잔액을 수정하기 전에 자원은 b에 의해 압수된다. 잔액이 수정되지 않았기 때문에 B는 균형이 여전히 800이고 B는 여전히 금액을 인출합니다. 첫 번째는 수정 균형을 실행하지만 인쇄하지 않으면 자원을 빼냅니다. B는 균형을 수정하고 균형을 -600으로 인쇄합니다. 균형을 인쇄합니다.
(2) 스레드가 잠을 자면 AR 또는 B가 금액을 가져온 후 수면으로 인해 CPU 리소스를 방출하고 JVM은 준비된 상태에서 다른 프로세스를 호출하기 때문에 오류 조건이어야합니다. 두 번째는 돈을 철회하고 균형이 잘못되어야한다고 판단하는 것입니다.
(1) 동기화 된 동기화 된 코드 블록이 추가되면 계정은 스레드 실행 메소드 본문에 잠겨 있습니다. 그러면 실행 로직은 매번 정상이 될 것입니다.
성공적으로 돈을 철수하고 돈을 뱉어냅니다 : 800.0
균형은 : 200.0입니다
B는 돈을 인출하지 못했고 잔액은 충분하지 않았습니다!
실행 프로세스를 상상할 수 있습니다.
첫 번째는 리소스를 선점하고 처음에는 Run Method Body에서 계정 클래스를 잠그는 것입니다. 그런 다음 동기 코드 블록을 실행하기 시작합니다. 중간의 특정 링크로 실행되면 CPU 리소스는 B에 의해 선점됩니다. B는 실행을 시작하고 처음에 계정 클래스를 잠그십시오. 그러나 잠금을 추가 할 때 계정이 A에 의해 점유되었으며 차단 상태로 조정되어 A가 리소스를 해제 할 때까지 기다립니다. A가 동기 코드 블록을 실행하면 계정 잠금이 릴리스되고 B는 계속 실행됩니다. 실행 중 B에서 보이는 잔액은 A에 의해 수정되며 올바른 논리에 따라 정상적으로 실행됩니다.
요약
위의 내용은 Java 프로그래밍의 다중 스레드 동시 처리 인스턴스 분석에 대한이 기사의 모든 내용이며 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!