java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
... ...
@@ -350,7 +350,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
350 350
* maintain state to accelerate the {@link #approximate(Competitor, Distance, TimePoint, TimePoint)} method, also in
351 351
* live scenarios when the contents of the competitors' {@link #tracks} changes dynamically.
352 352
*/
353
- private final Map<Competitor, CourseChangeBasedTrackApproximation> maneuverApproximators;
353
+ private final ConcurrentMap<Competitor, CourseChangeBasedTrackApproximation> maneuverApproximators;
354 354
355 355
private transient ConcurrentMap<TimePoint, Future<Wind>> directionFromStartToNextMarkCache;
356 356
... ...
@@ -585,12 +585,11 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
585 585
}
586 586
markPassingsForCompetitor = new HashMap<>();
587 587
tracks = new HashMap<>();
588
- maneuverApproximators = new HashMap<>();
588
+ maneuverApproximators = new ConcurrentHashMap<>();
589 589
for (Competitor competitor : race.getCompetitors()) {
590 590
markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet<MarkPassing>(MarkPassingByTimeComparator.INSTANCE));
591 591
final DynamicGPSFixMovingTrackImpl<Competitor> track = new DynamicGPSFixMovingTrackImpl<Competitor>(competitor, millisecondsOverWhichToAverageSpeed);
592 592
tracks.put(competitor, track);
593
- maneuverApproximators.put(competitor, new CourseChangeBasedTrackApproximation(track, race.getBoatOfCompetitor(competitor).getBoatClass()));
594 593
}
595 594
markPassingsForWaypoint = new ConcurrentHashMap<Waypoint, NavigableSet<MarkPassing>>();
596 595
for (Waypoint waypoint : race.getCourse().getWaypoints()) {
... ...
@@ -2863,7 +2862,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
2863 2862
2864 2863
@Override
2865 2864
public Iterable<GPSFixMoving> approximate(Competitor competitor, Distance maxDistance, TimePoint from, TimePoint to) {
2866
- return maneuverApproximators.get(competitor).approximate(from, to);
2865
+ return maneuverApproximators.computeIfAbsent(competitor,
2866
+ c->new CourseChangeBasedTrackApproximation(getTrack(c), race.getBoatOfCompetitor(c).getBoatClass()))
2867
+ .approximate(from, to);
2867 2868
}
2868 2869
2869 2870
private void ensureManeuverCacheIsFilledForAllCompetitors() {