자바 에서 Thread 에 대한 깊 은 이해(4)

1 낙관적 자물쇠 와 비관 적 자물쇠
간 소:
비관 적 자 물 쇠 는 동시 업데이트 충돌 이 발생 할 것 이 라 고 가정 하기 때문에 충돌 이 실제로 발생 하 든 안 하 든 자물쇠 체 제 를 사용한다.비관 적 인 자물쇠 에 비해 데이터 베 이 스 는 비관 적 인 자 물 쇠 를 사용 하 는데 비관 적 인 자 물 쇠 는 바로 자 물 쇠 를 잠 그 는 것 이 고 동기 화 방법 은 비관 적 인 자물쇠 에 속한다.
낙관적 인 잠 금 체 제 는 더욱 느슨 한 잠 금 체 제 를 채택 하고 낙관적 인 잠 금 은 상황 을 판단 하여 잠 금 여 부 를 결정 한다.
/**
 *     
 * Created by 51422 on 2017/9/6.
 */
public class MiaoSha {

    public static int goods=10;

    /**
     *      
     * @return -1          
     * @throws InterruptedException
     */
    public int getGoods() throws InterruptedException {
        //todo            
        Thread.sleep(100);//    100ms
        return -1;
    }
}

/**
 *     
 */
public void testMiaoSha(){
    final MiaoSha miaoSha=new MiaoSha();
    long st=System.currentTimeMillis();
    ScheduledExecutorService service = Executors.newScheduledThreadPool(500);
    for(int i=0;i<50000;i++){
        service.execute(new Runnable() {
            public void run() {
                try {
                    int good=miaoSha.getGoods();
                    if(good>0){
                        System.out.println("     "+good);
                    };
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    service.shutdown();
    try {
        service.awaitTermination(2, TimeUnit.DAYS);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("  "+(System.currentTimeMillis()-st)+"ms");
}


1.1 비관 적 잠 금 처리 방식
이런 방식 은 화물 이 초과 발송 되 지 않 을 것 이 라 고 보장 할 수 있 지만 운행 속도 가 모든 스 레 드 가 동기 화 되 고 처리 시간 이 길 어 질 것 이 라 고 보장 할 수 없다.
/**
 *     
 * Created by 51422 on 2017/9/6.
 */
public class MiaoSha {

    public static int goods=10;

    /**
     *      
     * @return -1          
     * @throws InterruptedException
     */
    public int getGoods() throws InterruptedException {
        //todo            
        synchronized(this){
            if(goods>0){
                int no=goods;
                goods--;
                Thread.sleep(100);//    100ms
                return no;
            }
            Thread.sleep(100);//    100ms
            return -1;
        }
    }
}

1.2 낙관적 잠 금 처리 방식
version 변 수 를 추가 하면 현재 화물 버 전 을 표시 합 니 다.스 레 드 가 들 어 갈 때 version 을 가 져 옵 니 다.현재 version 과 비교 하면 잠 금 경쟁 에 참가 합 니 다.경쟁 에서 잠 금 을 얻 은 후에 version 이 만 료 되 는 것 을 방지 합 니 다.만약 에 version 이 아직도 통 증 이 있 으 면 현재 버 전 번호 가 같 으 면 주문 서 를 받 습 니 다.그러면 버 전 번호 가 같은 스 레 드 만 줄 을 서서 속 도 를 확보 하 는 동시에 화물 이 초과 발송 되 지 않도록 보장 할 수 있 습 니 다.
/**
 *     
 * Created by 51422 on 2017/9/6.
 */
public class MiaoSha {

    public static int goods=10;
    public static int version=0;

    /**
     *      
     * @return -1          
     * @throws InterruptedException
     */
    public int getGoods() throws InterruptedException {
        //todo            
        int v=-1;
        if(goods>0&&(v=version)>0){
            if(v==version){
                synchronized(this){
                    if(v==version){
                        version++;
                        int no=goods;
                        goods--;
                        Thread.sleep(100);//    100ms
                        return no;
                    }
                }
            }
        }
        Thread.sleep(100);//    100ms
        return -1;
    }
}

2.신 호 량 Semaphore
잠 금 은 하나의 스 레 드 만 자원 을 사용 할 수 있 고 지정 한 스 레 드 가 자원 에 동시에 접근 하지 못 하 게 할 수 있 습 니 다.이 럴 때 신 호 량 이 필요 합 니 다.지정 한 스 레 드 가 자원 에 접근 하 는 것 을 확보 할 수 있 습 니 다.예 를 들 어 2 개의 클 라 이언 트 만 서버 에 연결 하여 사용 할 수 있 습 니 다.
public static void SamephoreTest(){
    Semaphore samephore=new Semaphore(2);
    for(int i=0;i<3;i++){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    samephore.acquire();
                    System.out.println("    !");
                    Thread.sleep(5000);//  5s
                    samephore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

  • acquire 가 허 가 를 받 는 것 은 차단 하 는 방법 이다
  • 석방 허가
    acquire 와 release 는 쌍 을 이 루어 나타 나 야 합 니 다.그렇지 않 으 면 자원 잠 금 이 발생 합 니 다

    좋은 웹페이지 즐겨찾기