synchronized 키워드 요약

5769 단어 synchronized
1. synchronized 키워드의 역할 영역은 두 가지가 있다. 1) 특정한 대상의 실례에서synchronized aMethod () {}는 여러 개의 라인이 이 대상에 동시에 접근하는 것을 방지할 수 있는synchronized 방법(한 대상에 여러 개의 synchronized 방법이 있다면 한 라인이 그 중의 하나의synchronized 방법에 접근하기만 하면 다른 라인은 이 대상의 어떤synchronized 방법도 동시에 접근할 수 없다).이때 서로 다른 대상의 실례적인synchronized 방법은 서로 간섭하지 않는다.즉, 다른 라인은 같은 종류의 다른 대상에 동시에 접근할 수 있는 실례의synchronized 방법이다.2) 특정 클래스의 범위입니다.synchronized static a Static Method {} 여러 개의 루트가 이 클래스의synchronized static에 동시에 접근하는 것을 방지하는 방법입니다.그것은 클래스의 모든 대상 실례에 작용할 수 있다.2. 방법 전에synchronized 키워드를 사용한 것을 제외하고synchronized 키워드는 방법 중의 특정한 블록에 사용할 수 있으며 이 블록의 자원에 대해서만 상호 배척 접근을 실행한다는 것을 나타낸다.사용법은:synchronized(this) {/* 블록*/}이고 그 역할역은 현재 대상입니다.3. synchronized 키워드는 계승할 수 없다. 즉, 기본 클래스의 방법인synchronized f() {}는 계승 클래스에서synchronized f() {}가 아니라 f() {}가 된다.계승류는synchronized 방법으로 명시적으로 지정해야 합니다. 
 
 
--------------------------
synchronized 메서드는 클래스 구성원 변수에 대한 액세스를 제어합니다.
  • 모든 클래스 실례는 하나의 자물쇠에 대응한다. 모든synchronized 방법은 이 방법을 호출한 클래스 실례의 자물쇠를 얻어야 실행할 수 있다. 그렇지 않으면 소속 루트가 막힌다. 방법이 실행되면 이 자물쇠를 독점하고 이 방법이 되돌아올 때까지 자물쇠를 풀어야 한다. 이후에 막힌 루트가 이 자물쇠를 얻어 다시 실행 가능한 상태로 들어갈 수 있다.
  • 이런 메커니즘은 같은 시간에 모든 클래스의 실례에 대해synchronized로 성명된 모든 구성원 함수 중 하나만이 실행 가능한 상태임을 확보했다. (많게는 하나의 실례에 대응하는 자물쇠만 있기 때문에) 클래스 구성원 변수의 접근 충돌을 효과적으로 피할 수 있다. (클래스 구성원 변수에 접근할 수 있는 모든 방법이synchronized로 성명되기만 한다면)
  • 자바에서 클래스의 실례뿐만 아니라 모든 클래스에 자물쇠가 대응한다. 그러면 우리는 클래스의 정적 구성원 함수를synchronized로 성명하여 클래스의 정적 구성원 변수에 대한 접근을 제어할 수 있다.

  • -------------------------------
    액세스 클래스 구성원 변수의 코드를 전문적인 방법에 두어synchronized로 설명하고 주 방법에서 호출해서 이 문제를 해결할 수 있지만 자바는 우리에게 더 좋은 해결 방법을 제공했다. 그것이 바로synchronized 블록이다.
     
    synchronized 키워드를 통해synchronized 블록을 설명합니다.구문은 다음과 같습니다.
    synchronized(syncObject) {
    // 
    }

     
    synchronized 블록은 이러한 코드 블록으로 그 중의 코드는 대상인syncObject(전술한 바와 같이 클래스 실례나 클래스일 수 있음)의 자물쇠를 얻어야 실행할 수 있으며 구체적인 메커니즘은 앞에서 말한 것과 같다.임의의 코드 블록을 대상으로 할 수 있고 자물쇠의 대상을 임의로 지정할 수 있기 때문에 유연성이 비교적 높다.
  • 하나, 두 개의 병렬 루틴이 같은 대상object에 있는synchronized(this) 동기화 코드 블록에 접근할 때 한 시간 안에 하나의 루틴만 실행될 수 있다.다른 라인은 현재 라인이 이 코드 블록을 실행한 후에야 이 코드 블록을 실행할 수 있습니다.
  • 2. 그러나 한 라인이object의synchronized(this) 동기화 블록에 접근할 때 다른 라인은object의 비synchronized(this) 동기화 블록에 접근할 수 있다.
  • 셋째, 특히 중요한 것은 한 라인이object의synchronized(this) 동기화 코드 블록에 접근할 때 다른 라인이object의 모든 다른synchronized(this) 동기화 코드 블록에 대한 접근이 막힌다는 것이다.synchronized 방법은요?
  • 넷째, 세 번째 예는 다른 동기화 코드 블록에도 적용된다.즉, 하나의 라인이 Object의synchronized(this) 동기화 코드 블록에 접근할 때 이 Object의 대상 자물쇠를 얻는다.결과적으로, 다른 라인이 이 Object 대상의 모든 동기화 코드 부분에 대한 접근이 잠시 막혔습니다.
  • 5. 이상의 규칙은 기타 대상 자물쇠에도 적용된다.

  • 두 개의 병렬 루틴이 같은 대상object에 있는 이synchronized(this) 동기화 코드 블록에 접근할 때 한 시간 안에 한 개의 루틴만 실행될 수 있다.다른 라인은 현재 라인이 이 코드 블록을 실행한 후에야 이 코드 블록을 실행할 수 있습니다.
    public class Thread1 implements Runnable {
    public void run() {
    synchronized(this) {
    for (int i = 0; i < 5; i++) {
    System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
    }
    }
    }
    public static void main(String[] args) {
    Thread1 t1 = new Thread1();
    Thread ta = new Thread(t1, "A");
    Thread tb = new Thread(t1, "B");
    ta.start();
    tb.start();
    }
    }

     A synchronized loop 0
    A synchronized loop 1A synchronized loop 2A synchronized loop 3A synchronized loop 4B synchronized loop 0B synchronized loop 1B synchronized loop 2B synchronized loop 3B synchronized loop 4
    --------------------------------------------------------------------------------
    그러나 한 라인이 object의synchronized(this) 동기화 블록에 접근할 때 다른 라인은 이object의 비synchronized(this) 동기화 블록에 접근할 수 있다.
    public class Thread2 {
    	public void m4t1() {
    		synchronized (this) {
    			int i = 5;
    			while (i-- > 0) {
    				System.out.println(Thread.currentThread().getName() + " : " + i);
    				try {
    					Thread.sleep(500);
    				} catch (InterruptedException ie) {
    				}
    			}
    		}
    	}
    
    	public void m4t2() {
    		int i = 5;
    		while (i-- > 0) {
    			System.out.println(Thread.currentThread().getName() + " : " + i);
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException ie) {
    			}
    		}
    	}
    
    	public static void main(String[] args) {
    		final Thread2 myt2 = new Thread2();
    		Thread t1 = new Thread(new Runnable() {
    			public void run() {
    				myt2.m4t1();
    			}
    		}, "t1");
    		Thread t2 = new Thread(new Runnable() {
    			public void run() {
    				myt2.m4t2();
    			}
    		}, "t2");
    		t1.start();
    		t2.start();
    	}
    }

     t1 : 4
    t2 : 4t1 : 3t2 : 3t1 : 2t2 : 2t1 : 1t2 : 1t1 : 0t2 : 0
    ----------------------------------------------
    한 라인이 object의synchronized(this) 동기화 코드 블록에 접근할 때 다른 라인이 object의 모든 다른synchronized(this) 동기화 코드 블록에 대한 접근이 막힙니다.
     
    // Thread2.m4t2() :
    
    public void m4t2() {
    synchronized(this) {
    int i = 5;
    while( i-- > 0) {
    System.out.println(Thread.currentThread().getName() + " : " + i);
    try {
    Thread.sleep(500);
    } catch (InterruptedException ie) {
    }
    }
    }
    
    }

    결과:t1:4t1:3t1:2t1:1t1:0t2:4t2:3t2:2t2:1t2:0
     
     
    세 번째 예는 다른 동기화 코드 블록에도 적용된다.즉, 하나의 라인이 Object의synchronized(this) 동기화 코드 블록에 접근할 때 이 Object의 대상 자물쇠를 얻는다.결과적으로, 다른 라인이 이 Object 대상의 모든 동기화 코드 부분에 대한 접근이 잠시 막혔습니다.
     
     
    http://www.blogjava.net/jialisoftwo/archive/2012/10/26/390272.html

    좋은 웹페이지 즐겨찾기