synchronized(this) 버드나무 어둡고 꽃 밝은 또 다른 마을
4867 단어 synchronized
괴상한 것들.
package com.hp.thread.chapter04;
public class WaitAndNotify {
private Object obj = new Object();
public static void testPureWait(){
new Thread(new Runnable(){
public void run() {
synchronized (this) {
try {
System.out.println("thread 0");
wait();
System.out.println("thread 0 waited...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable(){
public void run() {
synchronized (this) {
try {
System.out.println("thread 1");
wait(1000);
System.out.println("thread 1 waited...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public void testWait1000(){
new Thread(new Runnable(){
public void run() {
System.out.println("thread 0 " + this);
synchronized (obj) {
while(true){
try {
System.out.println("thread 0 running...");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
new Thread(new Runnable(){
public void run() {
System.out.println("thread 1 " + this);
synchronized (obj) {
try {
while(true){
wait(1000);
System.out.println("thread 1 waited...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
// this, 2 , ?
// this , new Thread(new Runnable(){}).start()
// , , this new Thread() WaitAndNotify
public void testWait1000_2(){
new Thread(new Runnable(){
public void run() {
synchronized (this) {
while(true){
try {
System.out.println("thread 0");
System.out.println("thread 0 running...");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
new Thread(new Runnable(){
public void run() {
synchronized (this) {
try {
while(true){
System.out.println("thread 1");
wait(1000);
System.out.println("thread 1 waited...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public static void testWait(){
new Thread(new Runnable(){
public void run() {
while(true){
synchronized (this) {
try {
System.out.println("...");
wait();
System.out.println("waited...");
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
new Thread(new Runnable(){
public void run() {
while(true){
synchronized (this) {
try {
notifyAll();
System.out.println("notify...");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
/**
* @param args
*/
public static void main(String[] args) {
// testPureWait();
// testWait();
new WaitAndNotify().testWait1000();
}
}
TestWait1000 호출2 방법이 얻은 결과는 내가 기대한 것이 아니다. (라인 0은 시종 운행하고 있고 라인 1은 운행하지 않는다) 그러나 세계의 결과는 정반대이다. 좋은 일은 두 라인이 상관없다. 테스트 결과는 다음과 같다.
thread 0
thread 0 running...
thread 1
thread 1 waited...
thread 0
thread 0 running...
thread 1
thread 0
thread 0 running...
thread 1 waited...
thread 1
그러나testWait1000을 실행하는 것은 마침 내가 원하는 결과였다. 처음에는 백 번 생각해도 풀리지 않았는데, 나중에this를 인쇄하여 mystery를 발견하였다.
thread 0 com.hp.thread.chapter04.WaitAndNotify$3@525483cd
thread 0 running...
thread 1 com.hp.thread.chapter04.WaitAndNotify$4@67f1fba0
thread 0 running...
thread 0 running...
thread 0 running...
thread 0 running...
두 this의 주소가 완전히 다르다는 것을 발견하고 곰곰이 생각해 보니 명랑해졌다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
javasynchronized 동기화 정적 방법과 동기화 비정적 방법의 공통점우리는synchronized를 사용하여 대상 변수를 동기화할 수 있을 뿐만 아니라,synchronizedl를 통해 동기화 클래스의 정적 방법과 비정적 방법을 동기화할 수 있습니다. 자바 관련 문법에서 알 수 있듯이s...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.