source

프로그래밍에서 "원자"는 무엇을 의미합니까?

goodcode 2022. 8. 20. 19:01
반응형

프로그래밍에서 "원자"는 무엇을 의미합니까?

효과적인 Java 책에는 다음과 같이 기술되어 있습니다.

언어 사양은 변수가 유형이 아닌 한 변수의 읽기 또는 쓰기가 원자임을 보증합니다.long또는double[JLS, 17.4.7]

자바 프로그래밍, 즉 일반적인 프로그래밍의 맥락에서 "원자성"은 무엇을 의미합니까?

다음은 예를 제시하겠습니다.가정하다foo유형의 변수입니다.long다음 동작은 (Java에서는) 원자적인 동작이 아닙니다.

foo = 65465498L;

실제로 변수는 첫 번째 32비트를 쓰는 연산과 마지막 32비트를 쓰는 연산 두 번째 연산 두 가지를 사용하여 작성됩니다.즉, 다른 스레드가 다음 값을 읽을 수 있습니다.foo중간 상태를 참조해 주세요.

조작을 atomic하게 하는 것은, 다른 스레드로부터 조작이 단일의 atomic(부분으로 분할할 수 없는) 조작으로 보여지는 것을 확실히 하기 위해서, 동기 메카니즘을 사용하는 것으로 이루어진다.즉, 다른 스레드는 일단 동작이 원자적으로 이루어지면 다음 값을 볼 수 있습니다.foo할당 전 또는 할당 후.하지만 중간값은 절대 안됩니다.

이를 위한 간단한 방법은 변수를 휘발성 있게 만드는 것입니다.

private volatile long foo;

또는 변수에 대한 모든 액세스를 동기화하려면:

public synchronized void setFoo(long value) {
    this.foo = value;
}

public synchronized long getFoo() {
    return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized

또는 다음과 같이 치환합니다.

private AtomicLong foo;

"원자 연산"은 다른 모든 스레드의 관점에서 순간적으로 보이는 연산을 의미한다.보증이 적용되면 부분적인 완성에 대해 걱정할 필요가 없습니다.

이는 "다른 시스템에서 즉시 발생할 수 있는" 것으로, 컴퓨팅 프로세스의 선형성 범주에 속합니다.링크된 기사를 더 인용하려면:

원자성은 동시 프로세스로부터의 분리를 보증하는 것입니다.또한 일반적으로 원자적 운영에는 성공 또는 실패의 정의가 있습니다. 즉, 시스템 상태를 성공적으로 변경하거나 뚜렷한 효과가 없습니다.

따라서 예를 들어 데이터베이스 시스템의 컨텍스트에서는 '원자적 커밋'을 가질 수 있습니다.즉, 관계형 데이터베이스에 업데이트의 변경 세트를 푸시할 수 있으며, 이러한 변경은 모두 제출되거나 장애가 발생했을 때 전혀 제출되지 않습니다.이러한 방법으로 데이터가 파손되지 않고 잠금 및/또는 큐의 결과가 됩니다.permission은 다른 쓰기 또는 읽기가 됩니다.다만, 그 가 됩니다.변수와 스레드의 맥락에서 이것은 메모리에 적용되는 것과 거의 동일합니다.

견적서에 따르면 모든 경우에서 이러한 동작이 예상될 필요는 없습니다.

방금 Atomic vs.라는 게시물을 찾았습니다. 비원자력 작전이 내게 큰 도움이 될 거야

「공유 메모리에 작용하는 조작은, 다른 스레드에 대해서, 1개의 스텝으로 완료하면, 원자성이 됩니다.

공유 메모리에서 원자 저장소가 실행되는 경우 다른 스레드는 반쯤 완료된 수정을 관찰할 수 없습니다.

공유 변수에 원자 부하를 가하면 한 순간에 나타난 값 전체를 읽습니다."

다음 코드에서 메서드 m1과 m2를 실행하는 스레드가 여러 개 있는 경우:

class SomeClass {
    private int i = 0;

    public void m1() { i = 5; }
    public int m2() { return i; }
}

「」를 호출하는 모든 됩니다.m2 5을 5로 .

이서 「」는, 「」( 「」)는 「」( 「」)입니다.i★★★★★★★★★★★★★★★★?

class SomeClass {
    private long i = 0;

    public void m1() { i = 1234567890L; }
    public long m2() { return i; }
}

하는 m2 0, 1234567890L 의 이므로, 0, 그 수 .i = 1234567890L.long를 쓸 수는 이를 감시할 수 ).i( 간 ( )

자바 읽기 및 쓰기 필드에서는 long 및 double을 제외한 모든 유형이 원자적으로 발생하며, 필드가 휘발성 수식자로 선언되면 long 및 double도 원자적으로 읽고 쓴다.즉, 우리는 거기서 무슨 일이 일어났는지 100% 알 수 있으며 변수에 중간 결과가 있을 수도 없습니다.

언급URL : https://stackoverflow.com/questions/15054086/what-does-atomic-mean-in-programming

반응형