Thread 상세 3(고성능 동기화)

4686 단어
1,java.util.concurrent.locks
Lock 객체는 스텔스 잠금 synchronized 역할과 유사합니다.하긴 같은 시간에 한 라인만 자물쇠를 받을 수 있어.Lock 객체는 Condition 객체를 통해 wait/notify 메커니즘을 지원합니다.
Lock과 스텔스 자물쇠의 가장 큰 장점은 자물쇠를 다시 시도할 수 있을 때 바로 되돌아오는 것이다.tryLock 방법.다른 스레드가 자물쇠를 가져오기 전에interrupt를 보내면lockInterruptibly 방법이 종료됩니다.더 자세한 설명은http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html
Reentrant Lock은 Lock의 실현 클래스입니다. 응용할 때 반드시finally에서 자물쇠를 풀어야 합니다.
				
Lock lock = new ReentrantLock();
lock.lock();
try { 
  // update object state
}
finally {
  lock.unlock(); 
}
    

언제 synchronized 대신 Reentrant Lock을 선택했습니까? 그렇다면 우리는 언제 Reentrant Lock을 사용해야 합니까?답은 간단하다. 시간 잠금 대기, 중단 잠금 대기, 블록 구조 잠금, 여러 조건 변수, 투표 잠금 등이 필요할 때.Reentrant Lock은 신축성 있는 장점도 가지고 있기 때문에 고도의 사용 경쟁 상황에서 사용해야 하지만, 대부분의synchronized 블록은 거의 사용이 나타나지 않았기 때문에 고도의 사용을 한쪽에 놓을 수 있다는 것을 기억하십시오.나는 synchronized가 적합하지 않다는 것을 확실히 증명할 때까지 synchronized로 개발할 것을 건의합니다. 단지 Reentrant Lock을 사용하면 '성능이 더 좋을 것' 이라고 가정하지 마십시오.
2, 병발 용기류
BlockingQueue, 이 대기열의 특수한 역할은 대기열에 가득 차거나 빈 대기열에서 가져올 때 Block이나 시간 초과 작업을 제공하는 것이다. 전형적인 예는 생산자와 소비자의 문제 같다.
ConcurrentMap, 이java.util.Map의 하위 인터페이스는 라인이 안전하다는 유용한 원자 조작을 정의했다.putIfAbsent,remove,replace를 포함하여 총괄적으로 말하면 집합에 이 값이 없을 때 추가할 수 있고 집합에 이 값이 있을 때 바꾸거나 삭제할 수 있다.예를 들어 remove는 다음과 같습니다.
if (map.containsKey(key) && map.get(key).equals(value)) {
   map.remove(key);
   return true;
}
return false;

3, 원자 변수(효율 향상)
잠금 및 대기 알고리즘이 없습니다. 만약에 모든 스레드가 다른 스레드에서 임의로 지연되거나 심지어 실패할 때 계속 조작을 한다면 이 알고리즘은 대기 알고리즘이 없다고 할 수 있습니다.이와 대비되는 것은 잠금 알고리즘이 없으면 한 라인만 항상 조작을 해야 한다는 것이다.(대기 없는 또 다른 정의는 모든 스레드가 제한된 단계에서 자신의 조작을 정확하게 계산하고 다른 스레드의 조작, 시간, 교차, 속도에 관계없이 모든 스레드를 정확하게 계산하는 것이다. 이 제한은 시스템의 스레드 수 함수일 수 있다. 예를 들어 10개의 스레드가 있으면, 스레드마다 CasCounter.increment () 조작을 한 번씩 실행하고, 최악의 경우, 스레드마다 최대 9번을 다시 시도해야 증가를 완성할 수 있다.)다시 지난 15년 동안 사람들은 기다림이 없고 잠금이 없는 알고리즘(무저항 알고리즘이라고도 부른다)에 대해 대량의 연구를 진행했고 많은 사람들이 통용하는 데이터 구조에서 무저항 알고리즘을 발견했다.스레드 및 프로세스 스케줄링과 같은 작업을 수행하는 OS 및 JVM 레벨에서 무차단 알고리즘이 널리 사용됩니다.그들의 실현은 비교적 복잡하지만 잠금 기반의 예비 알고리즘에 비해 많은 장점이 있다. 우선순위 역치와 잠금 사라짐 등 위험을 피할 수 있고 경쟁이 비교적 싸며 더욱 세밀한 입도 단계에서 조화롭게 발생하고 더 높은 정도의 병행 메커니즘을 허용할 수 있다.
모든 원자 변수 클래스는 원어를 공개적으로 비교하고 설정합니다(비교 및 교환과 유사). 이런 원어는 플랫폼에서 사용할 수 있는 가장 빠른 본체 구조(비교 및 교환, 링크/조건 저장, 최악의 경우 회전 자물쇠)를 사용하여 실현됩니다.java.util.concurrent.아토믹 패키지에는 원자 변수의 9가지 스타일(Atomic Integer, Atomic Long, Atomic Reference, Atomic Boolean, 원자 정형, 장형, 인용, 원자 표기 인용과 스탬프 인용 클래스의 배열 형식이 제공되어 원자적으로 한 쌍의 값을 업데이트한다.원자 변수 클래스는volatile 변수의 범화로 볼 수 있으며, 가변 변수의 개념을 확장하여 원자 조건의 비교와 업데이트 설정을 지원한다.읽기와 쓰기 원자 변수는 읽기와 쓰기가 가변 변수에 대한 접근과 같은 접근 의미를 가진다.원자 변수 클래스의 표면은 명세서 1의 Synchronized Counter의 예와 같지만, 비슷함은 표면에 불과하다.표면적으로 원자 변수의 조작은 플랫폼에서 제공하는 병렬 접근에 사용되는 하드웨어 원어(프로세서가 직접 지원하는 명령어)로 변한다. 예를 들어 비교하고 교환하는 것이다.
더 세밀한 입도는 경쟁을 가진 병발 응용 프로그램의 신축성을 더욱 가볍게 조정하는 것을 의미한다. 일반적인 기술은 사용하는 잠금 대상의 입도를 낮추고 더 많은 잠금 요청이 경쟁에서 비경쟁으로 바뀌기를 바란다.잠금에서 원자 변수로 전환하면 같은 결과를 얻을 수 있고 더욱 세밀한 입도의 조율 메커니즘으로 전환함으로써 경쟁의 조작이 더욱 적고 물동량을 높일 수 있다.
java.util.concurrent의 원자 변수는 직접적이든 간접적이든 거의 자바입니다.util.concurrent 패키지의 모든 종류는 동기화를 사용하지 않고 원자 변수를 사용합니다.ConcurrentLinkedQueue와 같은 클래스도 원자 변수를 사용하여 대기 알고리즘을 직접 실현하고, ConcurrentHashMap과 같은 클래스는 ReentrantLock을 사용하여 필요할 때 잠금합니다.그리고 ReentrantLock은 잠긴 스레드 대기열을 유지하기 위해 원자 변수를 사용합니다.
동기화와 원자 변수를 사용하여 라인 안전을 실현하다
4
        
public class PseudoRandomUsingSynch implements PseudoRandom {
    private int seed;
    public PseudoRandomUsingSynch(int s) { seed = s; }
    public synchronized int nextInt(int n) {
        int s = seed;
        seed = Util.calculateNext(seed);
        return s % n;
    }
}
public class PseudoRandomUsingAtomic implements PseudoRandom {
    private final AtomicInteger seed;
    public PseudoRandomUsingAtomic(int s) {
        seed = new AtomicInteger(s);
    }
    public int nextInt(int n) {
        for (;;) {
            int s = seed.get();
            int nexts = Util.calculateNext(s);
            if (seed.compareAndSet(s, nexts))
                return s % n;
        }
    }
}
      
효과도에서 자세히 볼 수 있는 링크.http://www.ibm.com/developerworks/cn/java/j-jtp11234/index.html
대부분의 사용자들은 원자 변수를 사용하여 스스로 막힘이 없는 알고리즘을 개발할 수 없다. 그들은 자바를 더욱 사용할 수 있다.util.concurrent에서 제공하는 버전입니다. 예를 들어 ConcurrentLinkedQueue.그러나 만약에 이전 JDK의 유사한 기능과 비교하면 이러한 종류의 성능이 어떻게 개선되었는지 알고 싶다면 원자 변수 클래스를 통해 공개된 세립도, 하드웨어 등급의 병발 원어를 사용할 수 있다.개발자는 원자 변수를 공유 계수기, 번호 생성기, 그리고 다른 독립된 공유 변수의 고성능 대체로 직접 사용할 수 있다. 그렇지 않으면 동기화를 통해 이 변수를 보호해야 한다.    
4, Executors, 스레드를 생성하고 관리하는 기능을 봉인합니다.
이러한 주요 응용 프로그램은 온라인 스레드 탱크 중에서 다음 편에서 다시 자세하게 설명한다.
참조:http://docs.oracle.com/javase/tutorial/essential/concurrency/highlevel.html

좋은 웹페이지 즐겨찾기