동시 프로그래밍 (1) - 기본

병렬 및 동시

병렬 : 여러 작업의 동시 실행을. 예를 들어, 두 개의 병렬 작업 CPU 코어의 양이 2 개이다.

동시성 : 단위 시간당 수행 할 수있는 작업의 수. CPU가 하나의 코어 인 경우, 상기 단위 시간은 1 초는 일초 CPU에 의해 실행 말합 동시 작업의 수이다. 싱글 코어 CPU가 동시에 스레드에서 실행할 수 있습니다. 1 초 즉 교번 스레드 (100)을 수행 할 수있다. 즉 동시성은 100입니다.

높은 동시성 혜택

(1)는, CPU 자원을 최대한 활용

2, 응답 시간을 개선하기 위해

도 3에서, 코드 모듈, 비동기 및 단순화 할 수있다

고려 멀티 스레딩

1, 스레드 안전

2, 교착 상태

전환합니다 3, 너무 많은 스레드도 다운 타임 서버 자원을 소모하고,

자바 멀티 스레드

자바 스레드 정보 인쇄 실행 :

public class Test {
    public static void main(String[] args) {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        // 打印线程信息
        System.out.println("打印结果:");
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println(threadInfo.getThreadId() + ":" + threadInfo.getThreadName());
        }
    }
}

/*
 * 打印结果:
 * [6] Monitor Ctrl-Break
 * [5] Attach Listener
 * [4] Signal Dispatcher
 * [3] Finalizer
 * [2] Reference Handler
 * [1] main
*/

자바는 스레드를 만드는 두 가지 방법이 있습니다

클래스 상속 스레드, 다음 구동 가능한 스레드 실행을 구현하는

스레드는 스레드 작업의 Runnable를 단지 추상의 추상화입니다.

설명 스레드

관련 방법 스레드

스타트()

스레드를 시작합니다. 할당 CPU, 호출 실현 () 메서드를 한 후 실행하도록 할당 된 CPU를 기다리고 준비 큐에 스레드를 보자. 시작 () 메소드가 반복보고 [달리] java.lang.IllegalThreadStateException 예외라고 할 수 없다.

운영()

논리 방법의 주요 스레드

수율()

현재 스레드가 CPU의 소지를 산출, 시간이 설정 될 수 없습니다 그래서, 그것은 잠금 리소스를 해제하지 않습니다, 그것은 잠금을 보유하지 않을 수 있습니다. 당신은 항복 방법 자료를 자원 한 후 잠금을 호출 할 수 있습니다. 수율을 실행하는 모든 스레드 () 운영 체제가 다시 즉시 실행 확인됩니다 후 준비 상태에 들어갈 가능성이 높다.

자다()

잠금 리소스를 해제하지 않습니다, 지정된 수면 시간을 스레드.

붙다()

현재 스레드에 추가 지정된 스레드가 교대로 수행 개의 스레드 실행 순서로 결합 될 수있다. 예를 들어, 호출 스레드 B는 A를 () 메소드 가입 스레드, 스레드 A까지 완료된 후, 스레드 B를 실행하는 것

일시 정지()

로고 중단 스레드 isInterrupted () 기본은 통화가 중단 스레드로, 거짓 () 메서드가 다음 상태가 인터럽트가 true로 설정되어 있는지 isInterrupted () 식별을 결정함으로써 진정한 스레드로 설정하고, 만약 그렇다면, 인터럽트 스레드된다. Thread.interrupted () 메소드는 또한 인터럽트 플래그는 거짓으로 리셋된다 결국, 인터럽트 플래그가 true로 설정되어 있는지 여부를 판별 할 수있다.

기다림()

대기 상태로 스레드,만큼의 통지 또는 중단에 대한 다른 스레드의 대기는 반환하지 않습니다.

|) (통지 가는 notifyAll ()

통지서 [|]이 객체의 스레드에 대한 모든 대기는 스레드가 락 객체를 가져옵니다에 전제가 반환됩니다, wait 메소드로부터 돌아갑니다. 나는 스레드가 대기 상태를 다시 입력 잠글하지 않았다.

스레드 교착 상태를 중단 할 수 없습니다.

스레드 간의 공유 및 협력

내장 동기화 잠금

재진입 잠금.

이것은, 동시에 다수의 스레드가 하나의 스레드가 메소드 나 블록 동기 보장이라고도 시인성 변수 액세스 전용 스레드를 보장 내장 고정기구.

개체 잠금 및 잠금 클래스 :

객체가 객체 인스턴스 방법이다 잠금 또는 클래스의 객체 인스턴스 클래스 객체에 로크 또는 클래스 정적 메소드의 클래스이다. 클래스의 개체 인스턴스는 많이 가질 수 있지만 각 클래스는 하나의 클래스 객체를 다른 객체 인스턴스가 서로 간섭 객체 잠금을 가지고 있지만 각 클래스는 하나의 클래스 잠금 장치가 있습니다.

휘발성 물질

다른 스레드 변수 작업의 가시성을 확인합니다. 스레드는 변수의 값을 변경하면, 다른 스레드에 대한 새로운 값을 즉시 볼 수있다.

해당 장면 : 스레드 쓰기, 다중 스레드를 읽고

// volatile多线程写不安全示例
public class TestVolatileSafe {
    private volatile Integer count = 0;

    public void add() {
        count++;
    }

    public static void main(String[] args) throws Exception{
        TestVolatileSafe testVolatileSafe = new TestVolatileSafe();

        new ThreadClass(testVolatileSafe).start();
        new ThreadClass(testVolatileSafe).start();

        Thread.sleep(5000);

        System.out.println(testVolatileSafe.count);// 每个线程对count加1万次,最终结果不是2万
    }
}

class ThreadClass extends Thread {
    private TestVolatileSafe testVolatileSafe;

    public ThreadClass(TestVolatileSafe testVolatileSafe){
        this.testVolatileSafe = testVolatileSafe;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            testVolatileSafe.add();
        }
    }
}

ThreadLocal를

방문을 한 번에 각 스레드 따라서 데이터 공유를위한 데이터의 다중 스레드를 분리, 같은 객체되지 않도록 각 스레드의 ThreadLocal 변수의 사본을 제공합니다.

즉, 각각의 스레드 데이터베이스 접속 대상물의 멀티 스레드를 방지하는 스프링의 ThreadLocal 트랜잭션 타입의 수단에 의해 수정된다.

의 ThreadLocal 방법 :

보이드 세트 (개체 값);

객체의 get ();

삭제 공극 ();

보호 된 객체로 초기 ();

명백하게 서브 커버 디자인을 허용하기 위해, 보호 방법이 thread 로컬 변수의 초기 값으로 복귀한다. 실행이 처음 스레드, 한 번만 수행 할 때이 방법은 지연 호출, 통화의 get () 또는 설정 (객체)에 대한 방법입니다. 직접 반환의 기본 ThreadLocal를 널.

설명 :

ThreadLocal를 ThreadLocalMap의 정적 내부 클래스의 ThreadLocal 내부 정적 내부 클래스는 항목, 항목 정적 내부 클래스 상속을

WeakReference[弱引用]。

ThreadLocalMap 각 스레드에 고유 한, ThreadLocalMap있어 ThreadLocal 자체의 키는 키의 엔트리는 스레드 자체이다.

메모리 누수 트리거의 ThreadLocal :

강한 참조 : 유사 "개체 O = 새 개체 ();"만큼 여전히 강한 참조가 있기 때문에, 가비지 컬렉터는 참조 개체 인스턴스를 회복되지 떨어지지 않습니다.

소프트 참조 :하지만뿐만 아니라 필요한 객체와 같은 일부를 설명하는 데 사용됩니다. 객체와 관련된 소프트 참조는 시스템 메모리 오버 플로우 예외 발생시 일어날 대한 두 번째 재생 회수의 이러한 개체는 범위 내에서 예로서 나열 될 것이다. 복구가 충분한 메모리가있는 경우, 메모리 오버 플로우 예외가 발생됩니다. JDK1.2 후에는 소프트 참조를 구현하는 SoftReference 클래스를 제공합니다.

약한 참조 : 객체를 설명하는 데 중요하지 않은,하지만 그 강도가 소프트 참조보다 약하게 다음에 가비지 콜렉션이 발생할 때까지 만 살아남을 수있는 객체 인스턴스와 연관된 인용되는 약하다. 가비지 컬렉터 작업에 관계없이 만 손실 개체 인스턴스를 회복 현재 메모리의 적절성의 약한 참조와 연관됩니다. JDK 1.2 이후, 약한 구현하는 WeakReference를 클래스를 제공했다.

가상 참조 : 유령 팬텀은 참고 문헌으로 알려진, 그것은 가장 약한 하나 개의 참조 관계이다. 객체 인스턴스의 존재는 그 수명을 해치지 않을 팬텀 참조 객체 인스턴스에 의해 달성 될 수없는 가상의 기준이다. 가상 참조 대상을 설정하는 목적은 객체 인스턴스는 컬렉터가 회수 될 때 통지를 수신하기위한 시스템과 관련된다. JDK 1.2 이후, 가상 참조를 구현하는 PhantomReference 클래스를 제공했다.

분석 :

    각각 ThreadLocalMap을 유지 스레드, 키 매핑 테이블의 ThreadLocal 인스턴스 자체입니다,의 ThreadLocal 자체가 값을 저장하지 않는 말을하는 것입니다 객체의 값을 저장하는 진짜 필요가 그냥 스레드가 ThreadLocalMap에서 값을 가져옵니다 있도록 키로입니다이다. 주의 깊은 관찰 ThreadLocalMap이 맵 오브젝트는 약한 참조는 GC에 회수, ThreadLocal를 약한 키 혼입 사용된다. 따라서,의 ThreadLocal 변수가 null로 설정된 경우, 임의의 ThreadLocal 강한 인스턴스에 대한 참조는, 그것이 없을 것이다 ThreadLocal를 GC 회수. 현재의 thread가 여전히 끝, 항상 존재하는 것입니다 null 값의 항목에 대해 다음 키를 지연하는 경우 그 결과, ThreadLocalMap 키가 null 항목에 나타납니다, 액세스 값의 널 (null) 항목에 키 방법은 없다 참조 강한 쇄 : 스레드 참조 - "스레드 -> ThreaLocalMap -> 입력 -> 값은이 값에 액세스되지 않을 것이고, 그래서가 메모리 누수.

해결 방법 :

    만 현재의 thread의 종료 후, 현재의 thread가, 강한 참조가 분리 현재 스레드,지도 값이 모든 GC 복구됩니다 스택에 존재하지 않을 것입니다. 가장 좋은 방법은의 ThreadLocal 변수의 사용은 데이터를 제거하기 위해 제거 () 메서드를 호출하는 필요로하지 않는 것입니다 후.

대기 / 알림 메커니즘

nofity ()

    스레드는 wait 메소드에서 반환하는 객체를 기다리고 있지만, 스레드가 락 객체를 가져옵니다에 전제가 반환 통지 스레드를 다시 입력 대기 상태로 잠금을하지 않습니다.

nodifyAll ()

    이 객체의 스레드에서 모든 대기 통보

기다림()

    이 방법은 다른 스레드 나 인터럽트 통지를 반환하지 않습니다 기다릴, 대기 상태로 스레드라고합니다. 대기 () 메서드 호출 후 객체의 잠금을 해제합니다.

(긴) 대기

    매개 변수가 돌아갈 시간 종료 통지가없는 경우이며, n 개의 밀리 초 동안 대기하는 시간 (밀리 초)이며, 제한 시간을 대기.

대기 (긴, INT)

    더 세밀하게 제어 타임 아웃의 경우 나노초를 얻을 수 있습니다.

패러다임 대기 / 알림

    파티 기다립니다 :

        객체 잠금을 획득

        조건이 충족되지 않는 경우, 통지 아직 확인 조건 인 후 객체의 대기 () 메소드를 호출

        논리 상태를 대응하는 실행 만족

    파티 통보 :

        객체 잠금을 얻으려면

        변경 조건

        대상 스레드에 대한 모든 대기 통보

출시 다섯 개 원래 기사 · 원의 칭찬 0 · 조회수 119

추천

출처blog.csdn.net/u010636239/article/details/105131012