2222import io .opentelemetry .sdk .resources .Resource ;
2323import java .util .Collection ;
2424import java .util .List ;
25+ import java .util .concurrent .atomic .AtomicBoolean ;
2526import java .util .function .Supplier ;
2627import javax .annotation .Nullable ;
2728import javax .annotation .concurrent .ThreadSafe ;
@@ -112,7 +113,7 @@ public MetricData toMetricData(
112113 }
113114
114115 static final class Handle extends AggregatorHandle <DoublePointData , DoubleExemplarData > {
115- private volatile boolean set = false ;
116+ private final AtomicBoolean set = new AtomicBoolean ( false ) ;
116117 private volatile double current = 0 ;
117118
118119 // Only used when memoryMode is REUSABLE_DATA
@@ -135,12 +136,9 @@ protected DoublePointData doAggregateThenMaybeReset(
135136 List <DoubleExemplarData > exemplars ,
136137 boolean reset ) {
137138 double currentLocal = current ;
138- if (!set ) {
139+ if (( reset && !set . compareAndSet ( true , false )) || (! reset && ! set . get ()) ) {
139140 throw new NullPointerException ();
140141 }
141- if (reset ) {
142- set = false ;
143- }
144142
145143 DoublePointData output ;
146144 if (reusablePoint != null ) {
@@ -151,14 +149,13 @@ protected DoublePointData doAggregateThenMaybeReset(
151149 ImmutableDoublePointData .create (
152150 startEpochNanos , epochNanos , attributes , currentLocal , exemplars );
153151 }
154-
155152 return output ;
156153 }
157154
158155 @ Override
159156 protected void doRecordDouble (double value ) {
160157 current = value ;
161- set = true ;
158+ set . set ( true ) ;
162159 }
163160 }
164161}
0 commit comments