synchronized 및 Lock의 차이점

제목:synchronized와 Lock은 어떤 차이가 있습니까?새로운 락을 쓰면 뭐가 좋아요?예를 들어 말해봐.

1. 원시 구성


synchronized는 키워드가 JVM 차원에 속하고 모니터(밑바닥은 모니터 대상을 통해 완성되며 사실wait/notify 등 방법도 모니터 대상에 의존하여 동기화 블록이나 방법에서만 wait/notify 등 방법을 호출할 수 있다) Lock은 구체적인 클래스(java.util.concurrent.locks.Lock)는api 차원의 자물쇠이다

2. 사용 방법


synchronized는 사용자가 수동으로 자물쇠를 풀 필요가 없습니다. synchronized 코드가 실행된 후 시스템은 자동으로 자물쇠에 대한 점용Reentrant Lock을 방출합니다. 사용자가 수동으로 자물쇠를 방출해야 합니다. 만약 주동적으로 자물쇠를 방출하지 않으면 자물쇠가 사라질 수 있습니다. lock () 와 unlock () 방법은try/finally 문장 블록에 맞추어 완성해야 합니다.

3. 대기 중 중단 가능 여부


synchronized는 중단할 수 없습니다. 이상을 던지거나 ReentrantLock을 정상적으로 실행하지 않으면 중단할 수 없습니다.제한 시간 설정 방법tryLock(long timeout, Time Unit unit) 2.lockInterruptibly () 네모난 코드 블록에서interrupt () 방법을 호출하면 중단할 수 있습니다

4. 잠금이 공평한지 여부


synchronized 비공평 자물쇠 Reentrant Lock 둘 다 가능합니다. 기본 비공평 자물쇠는 구조 방법으로boolean 값을 전송할 수 있고true는 공평합니다.

5, 잠금 바인딩 여러 조건 Condition


synchronized는Reentrant Lock이 없습니다. 그룹을 나누어 깨워야 할 라인을 깨우는 데 사용되지 않습니다. synchronized처럼 랜덤으로 한 라인을 깨우거나 모든 라인을 깨우는 것이 아니라 정확하게 깨울 수 있습니다.
Condition 예제 코드 사용
/**
 * @author shihangqi
 * @date 2019/10/29 - 10:43
 *
 *
 *  : , A->B->C , :
 * AA 5 ,BB 10 ,CC 15 
 *  
 * AA 5 ,BB 10 ,CC 15 
 * ...
 *  10 
 */


class ShareResource{
     
    private int number = 1; //A:1 B:2 C:3
    private Lock lock = new ReentrantLock();
    private Condition c1 = lock.newCondition();
    private Condition c2 = lock.newCondition();
    private Condition c3 = lock.newCondition();

    
    public void print5(){
     
        lock.lock();
        try{
     
            //1  
            while (number!=1){
     
                c1.await();
            }
            // 
            for (int i = 0; i < 5; i++) {
     
                System.out.println(Thread.currentThread().getName()+"\t "+i);
            }
            // 
            number = 2;
            c2.signal();

        }catch(Exception e){
     
            e.printStackTrace();
        }finally{
     
            lock.unlock();
        }
    }

    public void print10(){
     
        lock.lock();
        try{
     
            //1  
            while (number!=2){
     
                c1.await();
            }
            // 
            for (int i = 0; i < 10; i++) {
     
                System.out.println(Thread.currentThread().getName()+"\t "+i);
            }
            // 
            number = 3;
            c3.signal();

        }catch(Exception e){
     
            e.printStackTrace();
        }finally{
     
            lock.unlock();
        }
    }

    public void print15(){
     
        lock.lock();
        try{
     
            //1  
            while (number!=3){
     
                c1.await();
            }
            // 
            for (int i = 0; i < 15; i++) {
     
                System.out.println(Thread.currentThread().getName()+"\t "+i);
            }
            // 
            number = 1;
            c1.signal();

        }catch(Exception e){
     
            e.printStackTrace();
        }finally{
     
            lock.unlock();
        }
    }



}

public class SyncAndReentrantLockDemo {
     

    public static void main(String[] args) {
     
        ShareResource shareResource = new ShareResource();

        for(int i = 1; i <= 10; i++){
     
            new Thread(()->{
     
                shareResource.print5();
            },"A").start();
        }
        for(int i = 1; i <= 10; i++){
     
            new Thread(()->{
     
                shareResource.print10();
            },"B").start();
        }
        for(int i = 1; i <= 10; i++){
     
            new Thread(()->{
     
                shareResource.print15();
            },"B").start();
        }

    }
}

좋은 웹페이지 즐겨찾기