자바 의 Thread 동기 코드 블록 synchronized(){}while 와 for 등 순환 에 넣 으 면 바깥 과 차이 가 있 습 니 다.

public class TestThread extends Thread{
	
	private Integer ticketNum = 10;
	
	public void run() {
		synchronized (this) {//           while             
			while(true) {
				if(this.ticketNum > 0) {
					try {
						System.out.println(Thread.currentThread().getName()+":"+this.ticketNum);
						this.ticketNum --;
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}else{
                    break;
                }
			}
		}
	}
	
	public static void main(String[] args) {
		TestThread t = new TestThread();
		new Thread(t, "t1").start();
		new Thread(t, "t2").start();
	}
}

※Runnable 구현 클래스 를 사용 하고 Thread thread=new Thread(Runnable 구현 클래스 대상)방법 으로 스 레 드 를 정의 하 는 것 을 추천 합 니 다.
우리 가 여러 개의 스 레 드 를 정의 할 때 다 중 스 레 드 가 같은 자원 에 대한 방문 과 작업 충돌 문 제 를 해결 하지만 매번 수출 의 결 과 는 같은 스 레 드 가 실행 되 고 있 음 을 발견 할 수 있 습 니 다.근원 을 추적 하면 동기 화 원 리 를 말 해 야 합 니 다.
synchronized 동기 코드 블록 을 예 로 들 면 동기 화 는 다 중 스 레 드 가 공동으로 작 동 할 부분 을 표시 하고 하나의 메 시 지 를 만 드 는 것 입 니 다.여러 스 레 드 가 동기 화 코드 블록 으로 표 시 된 위치 에 실 행 될 때 여러 스 레 드 간 에 메 시 지 를 쟁탈 합 니 다.증표 가 하나 밖 에 없 기 때문에 증표 의 한 스 레 드 는 동기 코드 블록 에 있 는 코드 를 실행 할 수 있 는 권한 을 얻 을 수 있 습 니 다.코드 블록 에 있 는 코드 를 실행 한 후에 증표 물 을 이 동기 코드 블록 에 돌려 주 고 다음 에 이곳 에 실 행 될 때 다른 스 레 드 와 경쟁 하여 누가 증표 를 받 을 수 있 는 지 보고 계속 반복 합 니 다.
이상 은 본인 이 동기 코드 블록 에 대한 조작 입 니 다.그러나 상기 내용 에 따 르 면 우 리 는 하나의 스 레 드 가 코드 블록 에 있 는 코드 를 실행 한 후에 야 우편물 을 돌려 줄 수 있다 는 것 을 알 게 될 것 입 니 다.즉,코드 블록 에 for 순환 이 있 으 면 코드 블록 을 실행 하고 있 는 스 레 드 는 for 순환 이 끝 난 후에 야 메 시 지 를 돌려 주 므 로 처음에 말 한 상황 을 초래 할 수 있 습 니 다.따라서 동기 화 메커니즘 을 사용 할 때 순환 구조 가 있 는 위 치 를 분명히 가 려 야 한다

좋은 웹페이지 즐겨찾기