2013-10-12 1 views
-1

다른 클래스에 변수를 전달하려고하는데 getter가 초기화 한 값을 보내는 변수의 업데이트 된 값을 보내지 않습니다.getter가 업데이트 된 변수를 제공하지 않습니다.

Main 클래스 :

OtherClass otherclass = new OtherClass(new Main()); 
    private boolean updateVar = true 
    private int timer = 0; 

    public void tick(){ 

     if(updateVar == true) timer++; 
    } 

    public int getTimer(){ 

     return timer; 
    } 

다른 클래스 :

Main main; 
    private int holdTimer; 

    public OtherClass(Main main){ 

     this.main = main; 
     holdTimer = this.main.getTimer(); 

      System.out.println(holdTimer); 
    } 

가 0으로 나올 때마다, 누군가가 도와 드릴까요? 당신이 궁금해하는 경우에 대비하여 매 시간마다 내 스레드가 내 틱()을 호출합니다.

+0

''0이 될 때마다 아무도 도와 줄 수 있습니까? "-"매번 "은 무엇을 의미합니까? 코드에서 한 번만 호출됩니다. 테스트에 사용하는 실제 코드를 보여주십시오. –

+0

tick()을 (를) 호출하는 것은 무엇입니까? – tom

+2

어디에서 변경하는지 알 수 없습니다. –

답변

2

다른 스레드에서 tick()을 호출하기 때문에 동시성과 스레드 안전성이라는 어두운 세계로 들어서게됩니다.

는 몇 가지 엄격한 규칙을 준수하지 않는 하나 개의 스레드에서 변경 한 내용은 다른 스레드 볼 필요는 없으며, 간단히 말하면 :

  • 이에 대한 모든 액세스가 동기화되어 있어야합니다 volatile
  • 현장을

인체 공학적 :

private volatile int timer = 0; 

public synchronized void tick(){ 
    if(updateVar == true) timer++; 
} 

pubic synchronized int getTimer(){ 
    return timer; 
} 

당신은 할 수있다 join() 메인 스레드의 대기 루프에 있지 않으면 업데이트 스레드가 완료 될 때까지 대기해야합니다.

+0

많은 도움을 주셔서 대단히 감사합니다 – NGSoftware

+0

곧 100k를 봅니다! 1+ –

0

멤버 변수를 증가 시키려면 tick()으로 전화해야합니다.

+0

나는 그것이 내 스레드에 의해 호출되고있다. 왜냐하면 약간 불필요하기 때문에 그것을 보여주지 않았다. 유감스러운 일이다. – NGSoftware

+2

@NGSoftware : 불필요한가? 진심으로? 열쇠 야. 당신이 그것을 보여주지 않으면 우리는 도울 수 없습니다. –

+1

@NGSoftware 만약 당신이 몇몇 쓰레드에서 같은 변수를 사용하고자한다면, 각 트레드에 의한 캐싱을 막기 위해 '휘발성'으로 선언되어야합니다. – Pshemo

관련 문제