자바:synchronized 와 Lock 대상 을 사용 하여 대상 잠 금 가 져 오기
동시 다발 환경 에서 공유 자원 충돌 문 제 를 해결 할 때 잠 금 체 제 를 사용 하 는 것 을 고려 할 수 있다.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()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.