필기를 병발하다.

2176 단어
1. 안전하지 않은 점증 조작
높은 병발 상황에서 다음 코드를 실행하면 문제가 발생하기 쉽다.

...
private int value = 0;
public int next(){
++value; //Danger point here
++value;
return value;
}
...
한 작업은 다른 작업이value 증가 작업을 수행하고 있는 후에 발생할 수 있지만, 두 번째 작업을 수행하기 전에next () 방법을 호출했다.그러면 프로그램에 오류가 발생할 것이다.
또 하나 주의해야 할 것은 점증 프로그램 자체도 여러 가지 절차가 필요하고 (즉++조작) 점증 과정에서 루틴 메커니즘에 걸릴 수 있다는 것이다. 다시 말하면 자바에서 점증은 원자적인 조작이 아니라 보호하지 않으면 단일한 점증도 루틴이 안전하지 않다는 것이다.
2. 공유 자원 경쟁 해결
공유 자원 경쟁이란 여러 개의 라인이 같은 자원을 동시에 조작하는 것을 말한다. 만약에 이 공유 자원을 특수 처리하지 않으면 다른 라인이 이미 효력을 잃은 데이터를 가져와 임무를 수행하는 혼란과 집행 결과의 실패를 초래하기 쉽다.공유 자원 충돌을 방지하는 방법은 자원이 한 작업에 사용될 때 그 위에 자물쇠를 채우는 것이다.공유 자원에 접근한 첫 번째 작업은 이 자원을 잠가야 하며, 다른 작업은 잠기기 전에 접근할 수 없습니다.
기본적으로 모든 병렬 모드는 루트 충돌 문제를 해결할 때 공유 자원에 대한 서열화된 접근 방안을 사용한다. 이것은 주어진 시간에 하나의 작업만 공유 자원에 접근할 수 있음을 의미한다.
Java는 키워드 synchronized를 제공하는 형식으로 자원 충돌을 방지하기 위해 내장 지원을 제공합니다.synchronized에 의해 보호된 코드 세션을 실행하려면 자물쇠가 사용할 수 있는지 확인한 다음 자물쇠 실행 코드를 가져와 자물쇠를 풀어 줍니다.
주의해야 할 것은 한 임무가 여러 번 대상의 자물쇠를 얻을 수 있다는 것이다. 만약에 한 방법이 같은 대상에서 두 번째 방법을 사용하고 후자가 같은 대상에서 다른 방법을 사용하면 이런 상황이 발생할 수 있다.
JVM은 객체가 속박된 횟수를 추적합니다. 객체가 잠금 해제되면 잠금이 완전히 풀리며 그 수는 0입니다.임무가 처음으로 대상에게 자물쇠를 채울 때 계수는 1이 된다.
3.언제 동기화해야 할까
만약 당신이 변수를 쓰고 있다면, 그것은 다음에 다른 라인에서 읽히거나, 지난번에 다른 라인에서 쓴 변수를 읽고 있을 때 동기화를 사용해야 합니다.
만약 당신의 클래스에서 임계 데이터를 처리하는 방법이 하나 이상 있다면, 모든 관련 방법을 동기화해야 합니다.
4.volatile와synchronizedvolatile는 더 가볍고synchronized는 비용이 더 많이 들며 라인에서 오후에 전환하는 작업을 증가시켰다.volatile 키워드는 응용 프로그램의 가시성을 확보합니다. 만약 한 필드가volatile로 명시된다면, 이 필드에 쓰기 작업이 발생하면 모든 읽기 작업이 이 수정을 볼 수 있습니다.로컬 캐시를 사용하더라도, 상황이 그렇습니다.volatile는 바로 메모리에 기록되고, 읽기 동작은 메모리에 발생합니다.
5. 표시된 lock 객체 사용
Java SE5에는 표시되는 상호 배타적 메커니즘이 정의되어 있습니다.Lock 객체가 작성, 잠금 및 해제되어야 합니다.synchronized의 내장 자물쇠에 비해 코드가 우아하지 않다.그러나 어떤 문제를 해결하는 데 있어서 그는 더욱 유연하다.코드는 다음과 같습니다.

...
private int value = 0;
private Lock lock = new ReentrantLock(); //
public int next(){
lock.lock();//
try{
++value; //Danger point here
++value;
return value;
}finally{
lock.unlock;//finally
}
}
...
참고서
《Java 프로그래밍 사상》 제21장 병발

좋은 웹페이지 즐겨찾기