Java 다 중 스 레 드(3):Synchronized 상세 설명

사례 는 스스로 코드 를 한 번 실행 해서 출력 결 과 를 봐 야 더욱 깊이 이해 할 수 있다.
Synchronized 방법 잠 금 및 코드 잠 금
  • synchronized 수식 방법 은 방법 으로 잠 금 합 니 다.현재 인 스 턴 스 대상 의 잠 금 스 레 드 를 얻 어야 대상 에 잠 금 을 추가 하 는 방법 을 실행 할 수 있 습 니 다
  • // (1)      -   
    public synchronized void a() {}
    // (2)      -  
    public static synchronized void a() {}
    
  • synchronized 는 코드 블록 도 수식 할 수 있 습 니 다.지정 한 대상(syncObject)잠 금 스 레 드 를 받 아야 잠 금 코드 를 실행 할 수 있 습 니 다
  • // (1)     -   
    public void a() {
        synchronized(syncObject){
            
        }
    }
    // (2)     -  
    public void a() {
        synchronized(XXX.class){
            
        }
    }
    

    Synchronized 대상 잠 금 및 클래스 잠 금
    대상 잠 금
    4.567917.같은 시간 에 하나의 스 레 드 만 인 스 턴 스 대상 잠 금 의 사용권 을 얻 을 수 있 고 이 대상 의 잠 금 방법 을 실행 할 수 있 습 니 다.다른 스 레 드 는 이 스 레 드 가 잠 금 내 방법 을 실행 해 야 대상 잠 금 의 사용권 을 선점 할 수 있 습 니 다
    public class Main {
        public static void main(String[] args) {
            SyncTest s1 = new SyncTest();
            new Thread(()->s1.a()).start();
            new Thread(()->s1.b()).start();
        }
    
        public static class SyncTest {
    
            public synchronized void a() {
                try {
                    System.out.println(Thread.currentThread().getId() + ":--a--start  ,  " + System.currentTimeMillis());
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(Thread.currentThread().getId() + ":--a--end  ,  " + System.currentTimeMillis());
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
    
            public synchronized void b() {
                System.out.println(Thread.currentThread().getId() + ":--b--start  ,  " + System.currentTimeMillis());
            }
            
            public void c() {
                System.out.println(Thread.currentThread().getId() + ":--b--start  ,  " + System.currentTimeMillis());
            }
        }
    }
    

    4
  • 잠 금 을 추가 하지 않 는 방법 은 영향 을 받 지 않 고 다른 스 레 드 는 이 대상 의 다른 잠 금 을 추가 하지 않 은 방법 을 호출 할 수 있 습 니 다
  • SyncTest s1 = new SyncTest();
    new Thread(()->s1.a()).start();
    new Thread(()->s1.c()).start();
    }
    

    4.567917.유형의 서로 다른 사례 대상 간 에 서로 영향 을 주지 않 는 다.
    SyncTest s1 = new SyncTest();
    SyncTest s2 = new SyncTest();
    new Thread(()->s1.a()).start();
    new Thread(()->s2.a()).start();
    

    클래스 잠 금
    4.567917.두 스 레 드 가 서로 다른 대상 의 잠 금 정태 방법 을 동시에 방문 하면 경쟁 을 막 을 수 있다
    public class Main {
        public static void main(String[] args) {
            SyncTest s1 = new SyncTest();
            SyncTest s2 = new SyncTest();
            new Thread(()->s1.a()).start();
            new Thread(()->s2.a()).start();
        }
    
        public static class SyncTest {
    
            public static synchronized void a() {
                try {
                    System.out.println(Thread.currentThread().getId() + ":--a--start  ,  " + System.currentTimeMillis());
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(Thread.currentThread().getId() + ":--a--end  ,  " + System.currentTimeMillis());
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
    
            public synchronized void b() {
                System.out.println(Thread.currentThread().getId() + ":--b--start  ,  " + System.currentTimeMillis());
            }
        }
    }
    

    4.567917.그러나 비 유형 잠 금 방법(즉 대상 잠 금 방법)을 방문 할 때 경쟁 과 차단 이 발생 하지 않 습 니 다
    SyncTest s1 = new SyncTest();
    SyncTest s2 = new SyncTest();
    new Thread(()->s1.a()).start();
    new Thread(()->s2.b()).start();
    

    좋은 웹페이지 즐겨찾기