java 병발 (7) 라인 안전 및 불가변성

2533 단어 java 병발
여러 라인이 같은 자원에 동시에 접근하고 그 중 하나 또는 여러 라인이 이 자원에 대해 쓰기 작업을 해야만 경쟁 조건이 생길 수 있다.여러 라인이 같은 자원을 동시에 읽으면 경쟁 조건이 생기지 않는다.
우리는 변할 수 없는 공유 대상을 만들어서 대상이 온라인 스레드에서 공유될 때 수정되지 않도록 함으로써 스레드 안전을 실현할 수 있다.다음 예는 다음과 같습니다.
public class ImmutableValue{
    private int value = 0;
    public ImmutableValue(int value){
        this.value = value;
    }
    public int getValue(){
        return this.value;
    }
}

ImmutableValue 클래스의 구성원 변수value는 구조 함수를 통해 값을 부여하고 클래스에 set 방법이 없습니다.이것은 ImmutableValue 실례가 생성되면value 변수는 더 이상 수정할 수 없다는 것을 의미합니다. 이것은 불가변성입니다.하지만 getValue () 방법으로 이 변수의 값을 읽을 수 있습니다.
(역자 참고: 변경되지 않음(Immutable)과 읽기 전용(Read Only)은 다릅니다.하나의 변수가 '읽기만' 일 때 변수의 값은 직접적으로 바꿀 수 없지만, 다른 변수가 바뀔 때 바꿀 수 있다.예를 들어 한 사람의 생년월일은'변하지 않는'속성이고 한 사람의 나이는'읽기만 하는'속성이지만'변하지 않는'속성이 아니다.시간의 변화에 따라 한 사람의 나이는 따라서 변화하지만, 한 사람의 생년월일은 변하지 않는다.이것이 바로'변하지 않는다'와'읽기만 한다'의 차이이다.(Java 및 모드 34장에서 발췌)
ImmutableValue 클래스의 예를 사용하려면value 변수를 얻은 후 새로운 실례를 만들어서 실행할 수 있습니다.value 변수에 대한 덧셈 작업의 예는 다음과 같습니다.
public class ImmutableValue{
    private int value = 0;
    public ImmutableValue(int value){
        this.value = value;
    }
    public int getValue(){
        return this.value;
    }
    public ImmutableValue add(int valueToAdd){
        return new ImmutableValue(this.value + valueToAdd);
    }
}

dd () 방법은 덧셈 작업의 결과를 새로운 ImmutableValue 클래스의 실례로 되돌려주는 것이지, 자신의value 변수를 직접 조작하는 것이 아닙니다.
인용은 라인이 안전하지 않습니다!
중요한 것은 한 대상이 라인이 안전한 불가변 대상일지라도 이 대상을 가리키는 인용은 라인이 안전하지 않을 수 있다는 것을 기억해야 한다.이 예를 보십시오.
public void Calculator{
    private ImmutableValue currentValue = null;
    public ImmutableValue getValue(){
        return currentValue;
    }
    public void setValue(ImmutableValue newValue){
        this.currentValue = newValue;
    }
    public void add(int newValue){
        this.currentValue = this.currentValue.add(newValue);
    }
}

Calculator 클래스는 ImmutableValue 인스턴스에 대한 참조를 가지고 있습니다.setValue () 방법과dd () 방법으로 이 인용을 바꿀 수 있음을 주의하십시오.따라서 Calculator 클래스 내부에 변할 수 없는 대상을 사용하더라도 Calculator 클래스 자체는 변할 수 있기 때문에 Calculator 클래스는 라인이 안전하지 않다.다시 말하면 ImmutableValue 클래스는 라인이 안전하지만, 클래스를 사용하는 것은 아닙니다.불가변성을 통해 라인의 안전을 얻으려고 시도할 때, 이 점은 명심해야 한다.
Calculator 클래스가 라인 안전을 실현하려면 getValue (), setValue (),dd () 방법을 동기화 방법으로 설명하면 됩니다.

좋은 웹페이지 즐겨찾기