synchronized 키워드 요약
5769 단어 synchronized
--------------------------
synchronized 메서드는 클래스 구성원 변수에 대한 액세스를 제어합니다.
-------------------------------
액세스 클래스 구성원 변수의 코드를 전문적인 방법에 두어synchronized로 설명하고 주 방법에서 호출해서 이 문제를 해결할 수 있지만 자바는 우리에게 더 좋은 해결 방법을 제공했다. 그것이 바로synchronized 블록이다.
synchronized 키워드를 통해synchronized 블록을 설명합니다.구문은 다음과 같습니다.
synchronized(syncObject) {
//
}
synchronized 블록은 이러한 코드 블록으로 그 중의 코드는 대상인syncObject(전술한 바와 같이 클래스 실례나 클래스일 수 있음)의 자물쇠를 얻어야 실행할 수 있으며 구체적인 메커니즘은 앞에서 말한 것과 같다.임의의 코드 블록을 대상으로 할 수 있고 자물쇠의 대상을 임의로 지정할 수 있기 때문에 유연성이 비교적 높다.
두 개의 병렬 루틴이 같은 대상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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
javasynchronized 동기화 정적 방법과 동기화 비정적 방법의 공통점우리는synchronized를 사용하여 대상 변수를 동기화할 수 있을 뿐만 아니라,synchronizedl를 통해 동기화 클래스의 정적 방법과 비정적 방법을 동기화할 수 있습니다. 자바 관련 문법에서 알 수 있듯이s...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.