[꼭대기]자바 동시 다발 동기 화 방안 총화

동기 화 키워드:
실현:각 대상 의 내부 자 물 쇠 를 이용 하여 동기 화 합 니 다.
사용 1:(아래 await 와 notify All 있 으 나 마 나)
public synchronized void myMethod(){
         if(!(ok to process))
        await();
        //add your code here
       notifyAll();
}

사용 2:(아래 await 와 notify All 있 으 나 마 나)
Object obj = new Object();
public synchronized void myMethod(){
         syschronized(obj){
                if(!(ok to process))
                obj.await();
                //add your code here
               obj.notifyAll();
        }
}

ReentrantLock 클래스:
사용:
Lock mlock = new ReentrantLock();

public void myMethod(){
    mlock.lock();
    try{  
      //add your code here
    }
    finally{
      mlock.unlock();
    }
}

주의:
    자 물 쇠 는 다시 들 어 갈 수 있 습 니 다.한 스 레 드 는 이미 가지 고 있 는 자 물 쇠 를 반복 해서 얻 을 수 있 습 니 다.
ReentrantReadWriteLock 클래스:
    많은 스 레 드 가 데이터 구조 에서 데 이 터 를 읽 고 적은 스 레 드 로 데 이 터 를 수정 하 는 데 적 용 됩 니 다.
사용:
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
//               ,       
Lock readLock = rwl.readLock();
//                
Lock writeLock = rwl.writeLock();

public int getNumber(){
    readLock.lock();
    try{
        //add your code here
    }
    finally{
        readLock.unlock();
    }
}
public void setNumber(){
    writeLock.lock();
    try{
        //add your code here
    }
    finally{
        writeLock.unlock();
    }
}

Condition 조건:(ReentrantLock 과 세트 로 사용)
사용:
Lock mlock = new ReentrantLock();
Condition mCondition = mlock.newCondition();

public void myMethod(){
  mlock.lock();
  try{  
    if(!(ok to process))
        mConditon.await();
    //add your code here
    mConditon.signalAll();
  }
  finally{
    mlock.unlock();
  }
}

동기 화 장치:
Semaphore(신 호 량):
신 호 량 은 하나의 계 수 를 유지 하고 허 가 된 수량 은 고정 되 어 통 과 된 스 레 드 수량 을 제한 합 니 다.
스 레 드 는 acquire 를 호출 하여 허 가 를 요청 하고 release()를 통 해 허 가 를 방출 합 니 다.
허 가 는 반드시 그 라인 에서 방출 되 어야 하 는 것 이 아니 라,모든 라인 에서 임의의 수량의 허 가 를 방출 할 수 있다.

CountDownlatch(카운트다운 도 어 핀):
계수기 가 0 으로 변 할 때 까지 스 레 드 집합 을 기다 리 게 합 니 다.
카운트다운 도 어 핀 은 일회 성 이 므 로 0 으로 계산 하면 다시 사용 할 수 없다.
countDown 을 호출 하면 1 을 줄 입 니 다.

CyclicBarrier(울타리):
지정 한 수량의 스 레 드 가 해당 하 는 작업 을 마 친 후에 바리케이드 에 도착 하면 이때 바리케이드 가 자동 으로 취소 되 고 스 레 드 는 계속 운행 할 수 있 습 니 다.
사용 1
<pre name="code" class="java">        static int data=0;
	static int nthreads = 10;
	static CyclicBarrier barrier = new CyclicBarrier(nthreads);
	public static void main(String[] args)  {	
		for(int ii=0;ii<nthreads;ii++){
			Runnable myAction = new Runnable(){
				public void run(){
					//add pre-action				
					data++;
					try {
						barrier.await();
						System.out.println(data);
						//add post-action
					} catch (InterruptedException e) {
						e.printStackTrace();
					} catch (BrokenBarrierException e) {			
						e.printStackTrace();
					}
				}
			};		
			new Thread(myAction).start();		
		}
		
	}<span style="font-family:     ; widows: auto;">//     10 10;        await     </span>
 
  • 使用2:
  •         static int data=0;
    	static int nthreads = 10;
    	static Runnable barrierAction = new Runnable(){
    		@Override
    		public void run() {
    			//add post-action
    			System.out.println(data);
    		}
    	};
    	static CyclicBarrier barrier = new CyclicBarrier(nthreads,barrierAction);
    	public static void main(String[] args)  {	
    		for(int ii=0;ii<nthreads;ii++){
    			Runnable myAction = new Runnable(){
    				public void run(){
    					//add pre-action				
    					data++;
    					try {
    						barrier.await();
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					} catch (BrokenBarrierException e) {			
    						e.printStackTrace();
    					}
    				}
    			};		
    			new Thread(myAction).start();		
    		}
    		
    	}//     1 10<span style="font-family:     ; widows: auto;">;       <span style="widows: auto;">barrierAction run  ,  </span>  await     </span>


  • Exchange(교환기):
    두 스 레 드 는 같은 버퍼 의 두 인 스 턴 스 에서 작 동 합 니 다.
    버퍼 에 쓰 면 버퍼 에서 읽 기;
    각자 의 작업 을 마 친 후에 버퍼 를 교환 합 니 다.

    SynchronousQueue(동기 화 대기 열):
    BlockingQueue 인터페이스 실현
    그러나 그것 의 size 는 영원히 0 이다.
    put 방법 을 호출 할 때 계속 막 히 고 다른 스 레 드 가 take 방법 을 호출 할 때 까지 알 수 있 습 니 다.

    Volatile 필드:
    읽 은 값 이 현재 최신 임 을 보증 합 니 다.이 키워드 로 설명 하 는 변 수 는 가시 성 을 가지 고 있 습 니 다.
    차단 대기 열:
    java.util.concurrent 패키지 아래 에 다음 과 같은 차단 대기 열 이 있 습 니 다.
    링크 드 BlockingQueue:용량 이 상한 선 이 없고 최대 용량 도 지정 할 수 있 습 니 다.양 끝 버 전 입 니 다.
    Array BlockingQueue:구조 시 지정 용량 Priority BlockingQueue:우선 순위 대기 열 메모:put 방법 으로 요 소 를 추가 하고 take 방법 으로 요 소 를 얻 습 니 다.이 두 가지 방법 은 막 힌 입 니 다.
    스 레 드 안전 집합:
    java.util.concurrent 패키지
    ConcurrentHashMap
    ConcurrentSkipListMap
    ConcurrentSkipListSet
    ConcurrentLinkedQueue
    CopyOnWriteArrayList
    CopyOnWriteArraySet
    Vector
    HashTable:key/value 가 지원 되 지 않 습 니 다.null 입 니 다.

    좋은 웹페이지 즐겨찾기