[꼭대기]자바 동시 다발 동기 화 방안 총화
실현:각 대상 의 내부 자 물 쇠 를 이용 하여 동기 화 합 니 다.
사용 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>
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 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.