javasynchronized 동기화 정적 방법과 동기화 비정적 방법의 공통점

4519 단어 javasynchronized
javasynchronized 상세 정보
synchronized 키워드는 두 가지 용법이 있습니다. 하나는 방법의 정의에만 사용되고, 다른 하나는synchronized 블록입니다. 우리는synchronized를 사용하여 대상 변수를 동기화할 수 있을 뿐만 아니라,synchronizedl를 통해 동기화 클래스의 정적 방법과 비정적 방법을 동기화할 수 있습니다.
synchronized 블록의 구문은 다음과 같습니다.

public void method() 
{ 
  synchronized( ) 
   { 
   } 
 
} 


public void method() 
{ 
  synchronized( ) 
   { 
   } 
 
} 
첫 번째: 비정적 방법의 동기화
자바 관련 문법에서 알 수 있듯이synchronized 키워드를 사용하여 방법을 정의하면 클래스에서synchroniezd 키워드로 정의한 정적 방법과 비정적 방법을 잠그지만 이것은 이해하기 어렵다. 만약synchronized 블록을 사용하여 이런 효과를 얻으려면 왜 이런 효과가 발생했는지 이해하기 어렵지 않다. 만약synchronized를 사용하여 클래스의 모든 동기화 비정적 방법을 잠그면synchronized 블록의 매개 변수로 synchronized 블록에 전송하기만 하면 코드는 다음과 같습니다.
synchronized 블록을 통해 비정상적인 방법을 동기화합니다
위의 코드에 있는method1은synchronized 블록을 사용하고,method2 방법은synchronized 키워드로 방법을 정의합니다. 만약에 같은 테스트 실례를 사용할 때 이 두 가지 방법은 하나만 실행하면 다른 방법은 동기화 자물쇠를 얻지 못해 막힙니다.this를 synchronized 블록의 매개 변수로 사용하는 것 외에 Test도 사용할 수 있습니다.this는synchronized 블록의 매개 변수로 같은 효과를 냅니다.

public class Test 
{ 
 public void method1() 
 { 
  synchronized(this) 
   { 
 
   } 
 } 
 
 public synchronized void method2() 
 { 
 
 } 
} 

public class Test 
{ 
 public void method1() 
 { 
  synchronized(this) 
   { 
 
   } 
 } 
 
 public synchronized void method2() 
 { 
 
 } 
} 
내부 클래스에서synchronized 블록을 사용하는데,this는 내부 클래스만 표시하고, 외부 클래스(OuterClass)와 관계가 없습니다.그러나 내류 중의 비정태 방법과 외류의 비정태 방법도 동기화할 수 있다.이 클래스에 메서드 method3를 추가하면 Test의 두 메서드와 동기화할 수 있습니다. 코드는 다음과 같습니다.

public class Test 
{ 
 class InnerClass 
 { 
  public void method3() 
   { 
    synchronized(Test.this){ 
 
    } 
   } 
  } 
} 

public class Test 
{ 
 class InnerClass 
 { 
  public void method3() 
   { 
    synchronized(Test.this){ 
 
    } 
   } 
  } 
} 
위 InnerClass의 method3 방법은 Test의 method1과 method2 방법과 같은 시간에 한 방법만 실행할 수 있습니다.
synchronized 블록이 정확하게 실행되었든지, 프로그램 오류로 인해synchronized 블록이 종료되었든지, 현재synchronized 블록이 가지고 있는 동기화 자물쇠는 자동으로 방출되기 때문에synchronized 블록을 사용할 때 동기화 자물쇠를 걱정할 필요가 없습니다.
2. 정적 방법의 동기화
정적 방법을 호출할 때 대상의 실례가 반드시 만들어지지 않기 때문에,this를 사용하여 정적 방법을 동기화할 수 없고, 클래스 대상을 사용하여 정적 방법을 동기화해야 한다.코드는 다음과 같습니다.

public class Test{ 
 
 pubic static void method1(){ 
  synchronized(Test.class){ 
  } 
 } 
 public static synchronized void method2(){ 
 
  } 
} 

public class Test{ 
 
 pubic static void method1(){ 
  synchronized(Test.class){ 
  } 
 } 
 public static synchronized void method2(){ 
 
  } 
} 
정적 방법을 동기화할 때 클래스의 정적 필드 class를 사용하여 class 대상을 얻을 수 있습니다. 전례에서 method1과 method2 방법은 하나의 방법만 실행할 수 있습니다. class 필드를 사용하면 class 대상을 얻을 수 있고 실례적인 getClass () 방법을 통해 class 대상을 얻을 수 있습니다. 코드는 다음과 같습니다.

public class Test{ 
 public static Test test; 
 public Test(){ 
 test=this; 
 } 
 public static void method1(){ 
 synchronized(test.getClass()){ 
 } 
 } 
} 

public class Test{ 
 public static Test test; 
 public Test(){ 
 test=this; 
 } 
 public static void method1(){ 
 synchronized(test.getClass()){ 
 } 
 } 
} 
위의 코드에서, 우리는public의 정적 대상을 통해 Test의 실례를 얻고, 이 실례의 getClass 방법을 통해class 대상을 얻는다. (한 종류의 모든 실례가 getClass 방법을 통해 얻은 것은 같은 Class 대상이라는 것을 주의하라.)우리도 class를 통해 다른 종류의 정적 방법을 동기화할 수 있다. 코드는 다음과 같다.
Test 클래스의 방법과 Test1 클래스의 방법이 동기화됩니다.

public class Test1{ 
 public static void method1(){ 
 synchronized(Test.class){ 
  } 
 } 
} 

public class Test1{ 
 public static void method1(){ 
 synchronized(Test.class){ 
  } 
 } 
} 
주의:synchronized 블록을 사용하여 동기화 방법을 사용할 때 비정적 방법은this를 통해 동기화할 수 있고, 정적 방법은class 대상을 사용하여 동기화해야 하지만, 비정적 방법도class를 사용하여 정적 방법을 동기화할 수 있습니다.그러나 정적 방법에서this를 사용하여 비정적 방법을 동기화할 수 없습니다.이것은synchronized 블록을 사용하는 데 주의해야 합니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기