fix: Synchronization fixes in temperature service
This commit is contained in:
parent
d5d51869df
commit
07d3e4a2a3
1 changed files with 13 additions and 16 deletions
|
@ -11,35 +11,32 @@ import org.springframework.context.event.EventListener;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class TemperaturesServiceImpl implements TemperaturesService {
|
public class TemperaturesServiceImpl implements TemperaturesService {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(TemperaturesServiceImpl.class);
|
private static final Logger log = LoggerFactory.getLogger(TemperaturesServiceImpl.class);
|
||||||
private Averages averages;
|
private final AtomicReference<Averages> averages = new AtomicReference<>();
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public List<Average> getTemperaturesFor(String city) {
|
public synchronized List<Average> getTemperaturesFor(String city) {
|
||||||
synchronized (this) {
|
while (averages.get() == null) {
|
||||||
while (averages == null) {
|
try {
|
||||||
try {
|
wait();
|
||||||
wait();
|
} catch (InterruptedException e) {
|
||||||
} catch (InterruptedException e) {
|
log.error("Thread was interrupted", e);
|
||||||
log.error("Thread was interrupted", e);
|
Thread.currentThread().interrupt();
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return averages.get(city);
|
|
||||||
}
|
}
|
||||||
|
return averages.get().get(city);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventListener(FileProcessedEvent.class)
|
@EventListener(FileProcessedEvent.class)
|
||||||
public void updateTemperatures(FileProcessedEvent event) {
|
public synchronized void updateTemperatures(FileProcessedEvent event) {
|
||||||
synchronized (this) {
|
averages.set(event.averages());
|
||||||
averages = event.averages();
|
notifyAll();
|
||||||
notifyAll();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue