2012-02-20 2 views
2

저는 Java를 처음 접했을 때 그 사실을 분명히해야합니다. 이 같은"if"항상 메서드를 마칠 때까지 대기합니까?

사용하여 코드 :

public int x; 

public int elaborateX(){ 
    x = 0; 
    setX(); 
    x+=1; 
    return x; 
} 

public void setX(){ 
    //... 
    //some workload here 
    //... 
    x = 5; 
} 

나는 기회가 알고있는 것처럼

elaborateX()가 "1"을 반환 할 것 (방법 setX()가 바로 설정 X보다 더 많은 작업을 수행 특히). 나는 그 스레드 주변의 문제를 찾고 후 알고

는 "버그"를 방지 할 수 있습니다,하지만 내 질문은, 다음은 항상 setX()가 finish 실행을 기다릴 것입니까?

public int x; 

public int elaborateX(){ 
    x = 0; 
    if(setX()){ 
     x+=1; 
    }; 

    return x; 
} 

public boolean setX(){ 
    //... 
    //some workload here 
    //... 
    x = 5; 
    return true; 
} 

이 경우 elaborateX()는 항상 "6"을 반환합니까? 나는 100 % 확신 그렇지 않으면 나는 "적절한 방법"대신이 "속임수"를 사용 할 필요가 있기 때문에

내가 부탁 해요.

감사합니다.

+1

단일 스레드를 가정하면 시간 제한 대기/중단 또는 joining으로 하나가 될 수 elaborateX()는 "1"을 반환합니다. " 부정확하다. –

+0

예, 가능합니다. 위에있는 것과 같은 단일 스레드 응용 프로그램에서는 각 명령어가 다음에 완전히 실행되기 때문에 6이 반환 될 것으로 기대할 수 있습니다. 그것은 결정 론적입니다. – jbranchaud

답변

1

다중 스레드를 사용하지 않는 한 6보다 다른 값을 반환 할 가능성은 없습니다. 스레드가 모든 작업이 하나씩 나사 식에 대해 무엇이다

는 작업의 리오 더링이 없습니다. (적어도 당신이 VM 자체가 미친 최적화의 모든 종류를 할 것입니다,하지만 보이지 않는해야합니다. 볼 수 있습니다 아무것도) 그러나

을, 자바는 무관하지만, 될 수 있습니다 부울 연산자 ||&&short-circuit evaluation 사용 당신이 준비가되지 않은 경우 비슷한 문제.

2

예.

일반 Java 코드는 항상 동기식입니다.

2

두 개의 다른 스레드가 동시에 변수를 변경하는 경우 문제가 발생할 수 있습니다. 귀하의 예는 하나 개의 스레드를 가지고 나타나는

그러나, 안전하게 모든 것이 순서 일 것으로 가정 할 수있다 (즉, setX 항상 후속 지침 전에 완전히 종료하는 메소드).

0

아니요, Java 및 스레드 프로그래밍에서 "동기화 된"것을 볼 수 있습니다. 이미 다른 언어로 쓰레드 프로그래밍에 익숙하십니까?

0

응용 프로그램이 항상 6을 리턴 할 것으로 기대할 수 있습니다 (단일 스레드 프로그램을 가정 할 때).

if 문은 조건부 블록 내에서 프로그램을 올바르게 분기하기 위해 코드를 실행해야합니다. 완전히 실행되지 않는 조건부 아이디어가 어디에서 발생했는지는 확실하지 않지만 프로그램의 결정적 실행에 어떤 문제가 있는지를 알 수 있다고 생각합니다. if 문이 코드없이 조건부로 완전히 실행/평가되는 방식으로 분기하는 방법조차 모르겠습니다.

0

나는 기회가 알고있는 것처럼 (특히 경우 메소드 setX() 그냥 설정 X보다 더 많은 않습니다) elaborateX()가 "1"을 반환 할 것입니다.

당신은 그래서 당신의 elaborateX 실행 스레드는 항상이 경우 "6"를 반환) 1.

윌 elaborateX (로 x을 찾는 것 setX에 새로운 스레드를 생성 할 경우에만 일어날 수 있습니까?

아니오 그리고 열게은 다음 elaborateX 스레드 실행에 당신이 1

당신은 메커니즘을 구현해야 할 x를 계속 찾을 수 setX에 새로운 스레드를 생성하여 implementation.If에 따라 달라집니다 setX가 끝날 때까지 기다렸다가 결과를 얻으십시오. 나는 그 (방법 setX()가 바로 설정 X보다 더 많은 작업을 수행 특히) 기회가 알고있는 것처럼

이 "스레드

관련 문제