1. 왜 데이터에 대한 액세스를 동기화?
두 개 이상의 스레드가 동일한 데이터에 대한 액세스를 공유해야하는 경우, 공유 데이터 손상이 발생할 수 있습니다.
2. 동기화 방법을 달성하기 위해,
2.1 ReentrantLock와 类
학교 클래스 :
클래스 학교 { 개인 INT의 stuNum; 개인 잠금 잠금; 개인 조건 조건 ; 공공 학교 ( INT stuNum) { 이 .stuNum = stuNum; 잠금 = 새 ) (ReentrantLock와 단계; 조건 = lock.newCondition (); } ... ...
오브젝트 잠금 장치가 잠겨있어서, 조건은 객체의 상태이며,
사용법 :
공개 공극 stuNums1 () { lock.lock () ; 시도 { 동안 (stuNum <20 ) { 에서 System.out.println (stuNum + "<20等待数量变为20" ); condition.await () ; } stuNum - = 5 ; 에서 System.out.println (.는 Thread.currentThread의 toString () () + ":"+ stuNum); } 캐치 (예외 : InterruptedException 전자) { e.printStackTrace (); } 마지막으로 { lock.unlock () ; } } 공공 무효 stuNums2 () { Lock.lock () ; 은 try { stuNum + = 1. ; 에서 System.out.println (는 Thread.currentThread의 toString () (). + ":"+ stuNum); IF (stuNum> = 20이다 {)가 에서 System.out.println이 (stuNum이 + '> (20)가 설정 기다리고 웨이크 업 스레드의 시작입니다 " ); condition.signalAll () ; } } 최종적으로 { lock.unlock () ; } }
다른 스레드 () 메소드와 동일한 조건에서 signalAll를 호출 할 때까지 대기 세트로 현재 스레드가 차단되는 경우 상태 객체 호출 () 메소드를 기다릴 때.