자바:synchronized 와 Lock 대상 을 사용 하여 대상 잠 금 가 져 오기

14710 단어 자바jvmthreadF#Blog
다음으로 이동:http://zhangjunhd.blog.51cto.com/113473/70300
 
 
동시 다발 환경 에서 공유 자원 충돌 문 제 를 해결 할 때 잠 금 체 제 를 사용 하 는 것 을 고려 할 수 있다.1.대상 의 자 물 쇠 는 모든 대상 이 자동 으로 단일 자 물 쇠 를 포함 합 니 다.JVM 은 추적 대상 이 잠 긴 횟수 를 책임 집 니 다.대상 이 잠 겨 있 으 면 0 으로 계산 합 니 다.작업(스 레 드)이 처음으로 대상 에 게 자 물 쇠 를 채 울 때 계수 가 1 로 변 합 니 다.이 같은 작업(스 레 드)이 대상 에서 자 물 쇠 를 얻 을 때마다 계수 가 증가 합 니 다.먼저 자 물 쇠 를 얻 는 작업(스 레 드)만 이 대상 의 여러 자 물 쇠 를 계속 가 져 올 수 있 습 니 다.작업 이 synchronized 방법 에서 벗 어 날 때마다 계수 가 점점 줄 어 들 고 0 일 때 잠 금 이 완전히 풀 리 면 다른 작업 은 이 자원 을 사용 할 수 있 습 니 다.2.synchronized 동기 화 블록 2.1 은 단일 대상 잠 금 에 동기 화 되 었 습 니 다.동기 화 블록 을 사용 할 때 방법 아래 의 동기 화 블록 이 한 대상 의 잠 금 에 동기 화 되면 모든 작업(스 레 드)은 서로 배척 하여 이 동기 화 블록 에 들 어 갈 수 밖 에 없습니다.resource 1.자바 는 세 개의 스 레 드(main 스 레 드 포함)가 특정한 세 가지 서로 다른 방법의 동기 화 블록 에 들 어 가 려 고 시도 하 는 것 을 보 여 주 었 습 니 다.이 동기 화 블록 들 은 서로 다른 방법 에 있 지만 같은 대상(현재 대상 synchronized(this)으로 동기 화 되 기 때문에 이들 의 방법 은 여전히 서로 배척 합 니 다.
 
Resource1.java
 
package com.zj.lock;
import java.util.concurrent.TimeUnit;
 
public class Resource1 {
    public void f() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in f()");
       synchronized (this) {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in f()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       }
    }
 
    public void g() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in g()");
       synchronized (this) {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in g()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       }
    }
 
    public void h() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in h()");
       synchronized (this) {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in h()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       }
    }
 
    public static void main(String[] args) {
       final Resource1 rs = new Resource1();
 
       new Thread() {
           public void run() {
              rs.f();
           }
       }.start();
 
       new Thread() {
           public void run() {
              rs.g();
           }
       }.start();
 
       rs.h();
    }
} 

 
결과:Thread-0:not synchronized in f()Thread-0:synchronized in f()main:not synchronized in h()Thread-1:not synchronized in g()Thread-0:synchronized in f()main:not synchronized in h()Thread-1:not synchronized in g()Thread-0:synchronized in f()Thread-1:synchronized in g()Thread-1:synchronized in g() Thread-1:synchronized in g() main:synchronized in h() main:synchronized in h() main:synchronized in h() main:synchronized in h() main:synchronized in h()
 
 
2.2 여러 개의 대상 잠 금 리 소스 1.자바 에 동기 화 되 어 세 개의 스 레 드(main 스 레 드 포함)가 특정한 유형의 세 가지 다른 방법 으로 들 어 가 려 는 동기 화 블록 에 있 습 니 다.이 동기 화 블록 들 은 서로 다른 방법 에 있 고 세 개의 서로 다른 대상(synchronized(this),synchronized(syncObject 1),synchronized(syncObject 2)에 동기 화 되 어 있 습 니 다.그래서 이들 의 방법 중 임계 자원 에 대한 접근 은 독립 적 이다.
 
Resource2.java
 
package com.zj.lock;
import java.util.concurrent.TimeUnit;
 
public class Resource2 {
    private Object syncObject1 = new Object();
    private Object syncObject2 = new Object();
 
    public void f() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in f()");
       synchronized (this) {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in f()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       }
    }
 
    public void g() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in g()");
       synchronized (syncObject1) {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in g()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       }
    }
 
    public void h() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in h()");
       synchronized (syncObject2) {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in h()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       }
    }
 
    public static void main(String[] args) {
       final Resource2 rs = new Resource2();
 
       new Thread() {
           public void run() {
              rs.f();
           }
       }.start();
 
       new Thread() {
           public void run() {
              rs.g();
           }
       }.start();
 
       rs.h();
    }
} 

 
 
결과:Thread-0:not synchronized in f()Thread-0:synchronized in f()main:not synchronized in h()main:not synchronized in h()Thread-1:not synchronized in g()Thread-1:synchronized in g()main:synchronized in f()main:synchronized in f()main:synchronized in h()메 인:h()에 동기 화 된 Thread-1:synchronized in g()chronized in g()Thread-0:synchronized in f()main:synchronized in h()Thread-1:synchronized in g()Thread-0:synchronized in f()main:synchronized in h()Thread-1:synchronized in g()3.Lock 대상 자 물 쇠 는 synchronized 를 사용 하 는 것 외 에 도 Lock 대상 을 사용 하여 임계 구역 을 만 들 수 있 습 니 다.리 소스 3.자바 의 프 리 젠 테 이 션 효 과 는 리 소스 1.자바 와 같 습 니 다.리 소스 4.자바 의 프 리 젠 테 이 션 효 과 는 리 소스 2.자바 와 같 습 니 다.
 
Resource3.java
 
package com.zj.lock;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class Resource3 {
    private Lock lock = new ReentrantLock();
 
    public void f() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in f()");
       lock.lock();
       try {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in f()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       } finally {
           lock.unlock();
       }
    }
 
    public void g() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in g()");
       lock.lock();
       try {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in g()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       } finally {
           lock.unlock();
       }
    }
 
    public void h() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in h()");
       lock.lock();
       try {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in h()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       } finally {
           lock.unlock();
       }
    }
 
    public static void main(String[] args) {
       final Resource3 rs = new Resource3();
 
       new Thread() {
           public void run() {
              rs.f();
           }
       }.start();
 
       new Thread() {
           public void run() {
              rs.g();
           }
       }.start();
 
       rs.h();
    }
} 

 
 
결과:Thread-0:not synchronized in f()Thread-0:synchronized in f()main:not synchronized in h()Thread-1:not synchronized in g()Thread-0:synchronized in f()main:not synchronized in f()main:not synchronized in h()Main:synchronized in h()main:synchronized in h()main:synchronized in h()main:synchronized in h()main:synchronized in h()main:synchronized innized in h() main:synchronized in h() Thread-1:synchronized in g() Thread-1:synchronized in g() Thread-1:synchronized in g() Thread-1:synchronized in g() Thread-1:synchronized in g()
 
Resource4.java
package com.zj.lock;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class Resource4 {
    private Lock lock1 = new ReentrantLock();
    private Lock lock2 = new ReentrantLock();
    private Lock lock3 = new ReentrantLock();
 
    public void f() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in f()");
       lock1.lock();
       try {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in f()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       } finally {
           lock1.unlock();
       }
    }
 
    public void g() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in g()");
       lock2.lock();
       try {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in g()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       } finally {
           lock2.unlock();
       }
    }
 
    public void h() {
       // other operations should not be locked...
       System.out.println(Thread.currentThread().getName()
              + ":not synchronized in h()");
       lock3.lock();
       try {
           for (int i = 0; i < 5; i++) {
              System.out.println(Thread.currentThread().getName()
                     + ":synchronized in h()");
              try {
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
           }
       } finally {
           lock3.unlock();
       }
    }
 
    public static void main(String[] args) {
       final Resource4 rs = new Resource4();
 
       new Thread() {
           public void run() {
              rs.f();
           }
       }.start();
 
       new Thread() {
           public void run() {
              rs.g();
           }
       }.start();
 
       rs.h();
    }
} 

 
결과:Thread-0:not synchronized in f()Thread-0:synchronized in f()main:not synchronized in h()main:not synchronized in h()Thread-1:not synchronized in g()Thread-1:synchronized in g()main:synchronized in f()main:synchronized in f()main:synchronized in h()메 인:h()에 동기 화 된 Thread-1:synchronized in g()chronized in g() Thread-0:synchronized in f() main:synchronized in h() Thread-1:synchronized in g() Thread-0:synchronized in f() main:synchronized in h() Thread-1:synchronized in g()
 
 

좋은 웹페이지 즐겨찾기