Współbieżność - metody działające na tych samych polach uruchamiane w osobnych wątkach

0

Robię aplikację Stoper na Androida 4.1.2.

W klasie Timer mam metodę stop(), która podpięta jest do button'a STOP znajdującego się na ekranie i
wykonywana default'owo w wątku głównym po wciśnięciu button'a STOP:

  public void stop() {
    	
    	if (this.timerState == State.RUNNING){
    		
    		this.stopClockValue = (long) SystemClock.elapsedRealtime();
    		this.timerState = State.STOP;	
    	}
    }

W tej samej klasie mam też metodę calculateIntervalClockValue() wykonywaną co 9ms w osobnym wątku, który sobie stworzyłem:

private void calculateIntervalClockValue() {
    	
    	State state = this.timerState;
    	
    	switch(state){
    	
    	case RESET:
    		this.intervalClockValue = 0;
    		break;
    		
    	case RUNNING:
    		this.intervalClockValue = ((long) SystemClock.elapsedRealtime()) - this.startClockValue;
    		break;
    	
    	case STOP:
    		this.intervalClockValue = this.stopClockValue - this.startClockValue;
    		break;		
    	}
    } 

Czy może się zdarzyć, że metoda stop() zostanie odpalona podczas wykonywania metody calculateIntervalClockValue(). Działają one na tych samych polach klasy, więc mogą z tego wyniknąć jakieś niespodziewane sytuacje. Jak się przed tym uchronić?

0

Jeżeli wątki działają na tej samej instancji to może zajść taka sytuacja.
poczytaj o synchronize

0

Najlepiej nie pisz aplikacji wielowątkowej, w której dwa wątki modyfikują te same dane lub jeden czyta a drugi modyfikuje to samo w tym samym czasie. To najprostszy sposób, aby uniknąć niepotrzebnych problemów. Jeżeli już nie da się tego inaczej zrobić w Twoim programie, to obejmij sekcję krytyczną (odczytu lub zapisu) wspomnianym blokiem synchronized. Wtedy zawsze tylko jeden wątek będzie wykonywał operacje w tym bloku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1