Java 언어 키워드를 사용하여 메소드 또는 코드 블록을 수정하면 최대 한 스레드가 동시에 코드를 실행하도록 할 수 있습니다.
1. 반환 유형 선언 (공개 등) 후에 메소드를 선언 할 때 사용하십시오. 한 번에 메소드를 입력 하고이 방법을 호출하려면 현재 스레드 (즉, 동기화 된 메소드 내부의 스레드)가 다른 스레드를 실행 한 후에 만 기다릴 수 있습니다. 입력 할 수 있습니다.
예를 들어:
public synchronized void synmethod () {// method body}2. 동기화 된 브래킷을 사용하면 변수 가이 방식으로 하나의 스레드가 코드 블록에 포함됩니다.
public int synmethod (int a1) {synchronized (a1) {// 한 번에 하나의 스레드 만 입력 할 수 있습니다}} 3.이 시점에서 객체가 동기화 된 후 객체가 있습니다.
공개 클래스 신화를 구현할 수 있습니다. 스레드 t3 = 새로운 스레드 (mt); "T4"; t6 "); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); t6.start ();} public void run () {synchronized (this ) {system.out.println (thread.currentthread (). getName ())};3의 경우 스레드가 들어가면 현재 객체 잠금을 가져 오면 클래스의 모든 객체에서 다른 스레드의 작업은 객체 레벨에서 잠금을 사용하여 일반적으로 비교적 거친 방법입니다. 다른 스레드가 공유 리소스에 액세스하기 위해 다른 스레드가 객체의 다른 동기화 방법을 간단히 사용하도록 허용하지 않고 전체 객체를 잠그는 이유는 무엇입니까? 객체에 여러 자원이있는 경우 스레드가 일부 리소스를 사용하도록하기 위해 모든 스레드를 외부로 잠글 필요는 없습니다. 각 객체에는 잠금 장치가 있으므로 가상 객체를 사용하여 다음과 같이 잠글 수 있습니다.
Class FinegrainLock {MyMemberClass X, y; XLOCK = ylock = new Object () {Synchronized (xlock) {access x} // 공유 리소스를 동기화 (ylock) {// access y here}} public void bar () {synchronized (this) {// x와 y에 모두 액세스하기} // 여기에서 someth -in -but sared resources를 사용하지 마십시오}} }4. 클래스는 동기화 된 후 괄호 안에 있습니다.
ClassWithLockorder {private long lock_order; / 잠금 번호에 1을 추가하십시오. lock_order = num_locks; }} public lond lockorder () {return lock_order; ; int size = a1.array (). 길이; if == a2.array (). 길이) {if (a1.lockorder ()> a2.lockorder ()) // 객체의 잠금을 결정하고 설정합니다. // 주문하다. 첫 번째 = a2; last = a1} 동기화 (첫 번째) {// 객체를 올바른 순서로 잠그십시오. 동기화 된 (last) {int [] arrray () int [] arrray (int i = 0; i <size; i ++) value += arr2 [ i];}} return value} public void run () {//}}4의 경우 스레드가 들어가면 정적 변수와 정적 변수를 포함하는 코드 블록의 동기화를 포함하여 클래스에서 스레드의 모든 작업을 수행 할 수 없습니다.
추신 : 동기화 된 사용량 요약
Synchronized는 다른 장소를 사용하여 코드에 영향을 미칩니다.
1. 동기화 된 키워드 수정 방법
P1과 P2가 동일한 클래스의 다른 객체라고 가정하면,이 클래스는 다음 상황에서 동기화 블록 또는 동기화 방법을 정의하고 P1 및 P2를 호출 할 수 있습니다.
public synchronized void method () {//}이 시점에서 동기화 된 방법은 동기화 메소드 객체를 잠금합니다. 즉, 객체 P1이 다른 스레드 에서이 동기화 메소드를 실행할 때 동기화의 효과를 달성하기 위해 상호 배제를 형성합니다. 동시에, 객체에 여러 개의 동기화 메소드가있는 경우 스레드가 객체에서 동기화 된 메소드를 실행할 때 객체의 다른 동기화 메소드는 다른 스레드에 의해 실행할 수 없습니다. 그러나이 객체가 속한 클래스별로 생성 된 다른 객체 P2는 동기화 된 키워드가 추가 된 상태 에서이 메소드를 임의로 호출 할 수 있습니다.
위의 예제 코드는 다음 코드와 같습니다.
public void method () {synchronized (this) {// ..}}이번에는 P1 객체 잠금 장치가 P1 동기화 방법을 호출 할 수있는 경우에만 P1 객체 잠금 장치입니다. . 동기화 메커니즘의 제어를 제거하고 데이터 혼동을 유발하십시오.
2. 블록 동기화, 샘플 코드는 다음과 같습니다.
public void method () {synchronized (this) {// ..}}현재 잠금 장치는 SO 객체이며 각 객체는 고유 잠금에 해당하므로 스레드는이 객체 잠금을받는 사람이 컨트롤하는 코드를 실행할 수 있습니다. 잠금 장치로 명확한 객체가 있으면 이와 같은 프로그램을 작성할 수 있지만 잠금 장치로 명확한 객체가 없으면 동기화 할 코드 조각 만 원하면 특수 인스턴스 변수를 만들 수 있습니다 (해야합니다. 객체) 자물쇠 역할을하는 것 :
개인 바이트 [] 잠금 = 새로운 바이트 [0];
참고 : 제로 길이의 바이트 배열 객체는 컴파일 된 바이트 코드보다 더 경제적입니다.
3. 정적 함수에 동기화 된 사용 예제 코드는 다음과 같습니다.
클래스 foo {public synchronized static void method1 () {//} public void method2 () {synchronized //}} 두 동기 메소드는이 메소드의 객체가 속한 클래스의 클래스 잠금을 호출합니다 (클래스, 더 이상이 클래스에서 생성 된 특정 객체가 아닙니다).
클래스가 동기화 된 정적 함수 A를 정의하고 동기화 된 인스턴스 함수 B를 정의하면이 클래스의 동일한 객체 OBJ가 여러 스레드에서 두 메소드 A와 B에 액세스 할 때 각각 메소드 A와 B를 구성하지 않는 것으로 추론 할 수 있습니다. 자물쇠가 다르기 때문에 동기화됩니다. 방법 A의 잠금은 OBJ가 속한 클래스이고 B의 잠금은 OBJ가 속한 대상입니다.