1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 /* 26 * This file is available under and governed by the GNU General Public 27 * License version 2 only, as published by the Free Software Foundation. 28 * However, the following notice accompanied the original version of this 29 * file: 30 * 31 * Written by Doug Lea with assistance from members of JCP JSR-166 32 * Expert Group and released to the public domain, as explained at 33 * http://creativecommons.org/publicdomain/zero/1.0/ 34 */ 35 36 package java.util.concurrent.atomic; 37 38 import java.lang.invoke.VarHandle; 39 import java.util.function.LongBinaryOperator; 40 import java.util.function.LongUnaryOperator; 41 42 /** 43 * A {@code long} value that may be updated atomically. See the 44 * {@link VarHandle} specification for descriptions of the properties 45 * of atomic accesses. An {@code AtomicLong} is used in applications 46 * such as atomically incremented sequence numbers, and cannot be used 47 * as a replacement for a {@link java.lang.Long}. However, this class 48 * does extend {@code Number} to allow uniform access by tools and 49 * utilities that deal with numerically-based classes. 50 * 51 * @since 1.5 52 * @author Doug Lea 53 */ 54 public class AtomicLong extends Number implements java.io.Serializable { 55 private static final long serialVersionUID = 1927816293512124184L; 56 57 /** 58 * Records whether the underlying JVM supports lockless 59 * compareAndSet for longs. While the intrinsic compareAndSetLong 60 * method works in either case, some constructions should be 61 * handled at Java level to avoid locking user-visible locks. 62 */ 63 static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8(); 64 65 /** 66 * Returns whether underlying JVM supports lockless CompareAndSet 67 * for longs. Called only once and cached in VM_SUPPORTS_LONG_CAS. 68 */ 69 private static native boolean VMSupportsCS8(); 70 71 /* 72 * This class intended to be implemented using VarHandles, but there 73 * are unresolved cyclic startup dependencies. 74 */ 75 private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe(); 76 private static final long VALUE = U.objectFieldOffset(AtomicLong.class, "value"); 77 78 private volatile long value; 79 80 /** 81 * Creates a new AtomicLong with the given initial value. 82 * 83 * @param initialValue the initial value 84 */ 85 public AtomicLong(long initialValue) { 86 value = initialValue; 87 } 88 89 /** 90 * Creates a new AtomicLong with initial value {@code 0}. 91 */ 92 public AtomicLong() { 93 } 94 95 /** 96 * Returns the current value, 97 * with memory effects as specified by {@link VarHandle#getVolatile}. 98 * 99 * @return the current value 100 */ 101 public final long get() { 102 return value; 103 } 104 105 /** 106 * Sets the value to {@code newValue}, 107 * with memory effects as specified by {@link VarHandle#setVolatile}. 108 * 109 * @param newValue the new value 110 */ 111 public final void set(long newValue) { 112 // See JDK-8180620: Clarify VarHandle mixed-access subtleties 113 U.putLongVolatile(this, VALUE, newValue); 114 } 115 116 /** 117 * Sets the value to {@code newValue}, 118 * with memory effects as specified by {@link VarHandle#setRelease}. 119 * 120 * @param newValue the new value 121 * @since 1.6 122 */ 123 public final void lazySet(long newValue) { 124 U.putLongRelease(this, VALUE, newValue); 125 } 126 127 /** 128 * Atomically sets the value to {@code newValue} and returns the old value, 129 * with memory effects as specified by {@link VarHandle#getAndSet}. 130 * 131 * @param newValue the new value 132 * @return the previous value 133 */ 134 public final long getAndSet(long newValue) { 135 return U.getAndSetLong(this, VALUE, newValue); 136 } 137 138 /** 139 * Atomically sets the value to {@code newValue} 140 * if the current value {@code == expectedValue}, 141 * with memory effects as specified by {@link VarHandle#compareAndSet}. 142 * 143 * @param expectedValue the expected value 144 * @param newValue the new value 145 * @return {@code true} if successful. False return indicates that 146 * the actual value was not equal to the expected value. 147 */ 148 public final boolean compareAndSet(long expectedValue, long newValue) { 149 return U.compareAndSetLong(this, VALUE, expectedValue, newValue); 150 } 151 152 /** 153 * Possibly atomically sets the value to {@code newValue} 154 * if the current value {@code == expectedValue}, 155 * with memory effects as specified by {@link VarHandle#weakCompareAndSetPlain}. 156 * 157 * @deprecated This method has plain memory effects but the method 158 * name implies volatile memory effects (see methods such as 159 * {@link #compareAndExchange} and {@link #compareAndSet}). To avoid 160 * confusion over plain or volatile memory effects it is recommended that 161 * the method {@link #weakCompareAndSetPlain} be used instead. 162 * 163 * @param expectedValue the expected value 164 * @param newValue the new value 165 * @return {@code true} if successful 166 * @see #weakCompareAndSetPlain 167 */ 168 @Deprecated(since="9") 169 public final boolean weakCompareAndSet(long expectedValue, long newValue) { 170 return U.weakCompareAndSetLongPlain(this, VALUE, expectedValue, newValue); 171 } 172 173 /** 174 * Possibly atomically sets the value to {@code newValue} 175 * if the current value {@code == expectedValue}, 176 * with memory effects as specified by {@link VarHandle#weakCompareAndSetPlain}. 177 * 178 * @param expectedValue the expected value 179 * @param newValue the new value 180 * @return {@code true} if successful 181 * @since 9 182 */ 183 public final boolean weakCompareAndSetPlain(long expectedValue, long newValue) { 184 return U.weakCompareAndSetLongPlain(this, VALUE, expectedValue, newValue); 185 } 186 187 /** 188 * Atomically increments the current value, 189 * with memory effects as specified by {@link VarHandle#getAndAdd}. 190 * 191 * <p>Equivalent to {@code getAndAdd(1)}. 192 * 193 * @return the previous value 194 */ 195 public final long getAndIncrement() { 196 return U.getAndAddLong(this, VALUE, 1L); 197 } 198 199 /** 200 * Atomically decrements the current value, 201 * with memory effects as specified by {@link VarHandle#getAndAdd}. 202 * 203 * <p>Equivalent to {@code getAndAdd(-1)}. 204 * 205 * @return the previous value 206 */ 207 public final long getAndDecrement() { 208 return U.getAndAddLong(this, VALUE, -1L); 209 } 210 211 /** 212 * Atomically adds the given value to the current value, 213 * with memory effects as specified by {@link VarHandle#getAndAdd}. 214 * 215 * @param delta the value to add 216 * @return the previous value 217 */ 218 public final long getAndAdd(long delta) { 219 return U.getAndAddLong(this, VALUE, delta); 220 } 221 222 /** 223 * Atomically increments the current value, 224 * with memory effects as specified by {@link VarHandle#getAndAdd}. 225 * 226 * <p>Equivalent to {@code addAndGet(1)}. 227 * 228 * @return the updated value 229 */ 230 public final long incrementAndGet() { 231 return U.getAndAddLong(this, VALUE, 1L) + 1L; 232 } 233 234 /** 235 * Atomically decrements the current value, 236 * with memory effects as specified by {@link VarHandle#getAndAdd}. 237 * 238 * <p>Equivalent to {@code addAndGet(-1)}. 239 * 240 * @return the updated value 241 */ 242 public final long decrementAndGet() { 243 return U.getAndAddLong(this, VALUE, -1L) - 1L; 244 } 245 246 /** 247 * Atomically adds the given value to the current value, 248 * with memory effects as specified by {@link VarHandle#getAndAdd}. 249 * 250 * @param delta the value to add 251 * @return the updated value 252 */ 253 public final long addAndGet(long delta) { 254 return U.getAndAddLong(this, VALUE, delta) + delta; 255 } 256 257 /** 258 * Atomically updates (with memory effects as specified by {@link 259 * VarHandle#compareAndSet}) the current value with the results of 260 * applying the given function, returning the previous value. The 261 * function should be side-effect-free, since it may be re-applied 262 * when attempted updates fail due to contention among threads. 263 * 264 * @param updateFunction a side-effect-free function 265 * @return the previous value 266 * @since 1.8 267 */ 268 public final long getAndUpdate(LongUnaryOperator updateFunction) { 269 long prev = get(), next = 0L; 270 for (boolean haveNext = false;;) { 271 if (!haveNext) 272 next = updateFunction.applyAsLong(prev); 273 if (weakCompareAndSetVolatile(prev, next)) 274 return prev; 275 haveNext = (prev == (prev = get())); 276 } 277 } 278 279 /** 280 * Atomically updates (with memory effects as specified by {@link 281 * VarHandle#compareAndSet}) the current value with the results of 282 * applying the given function, returning the updated value. The 283 * function should be side-effect-free, since it may be re-applied 284 * when attempted updates fail due to contention among threads. 285 * 286 * @param updateFunction a side-effect-free function 287 * @return the updated value 288 * @since 1.8 289 */ 290 public final long updateAndGet(LongUnaryOperator updateFunction) { 291 long prev = get(), next = 0L; 292 for (boolean haveNext = false;;) { 293 if (!haveNext) 294 next = updateFunction.applyAsLong(prev); 295 if (weakCompareAndSetVolatile(prev, next)) 296 return next; 297 haveNext = (prev == (prev = get())); 298 } 299 } 300 301 /** 302 * Atomically updates (with memory effects as specified by {@link 303 * VarHandle#compareAndSet}) the current value with the results of 304 * applying the given function to the current and given values, 305 * returning the previous value. The function should be 306 * side-effect-free, since it may be re-applied when attempted 307 * updates fail due to contention among threads. The function is 308 * applied with the current value as its first argument, and the 309 * given update as the second argument. 310 * 311 * @param x the update value 312 * @param accumulatorFunction a side-effect-free function of two arguments 313 * @return the previous value 314 * @since 1.8 315 */ 316 public final long getAndAccumulate(long x, 317 LongBinaryOperator accumulatorFunction) { 318 long prev = get(), next = 0L; 319 for (boolean haveNext = false;;) { 320 if (!haveNext) 321 next = accumulatorFunction.applyAsLong(prev, x); 322 if (weakCompareAndSetVolatile(prev, next)) 323 return prev; 324 haveNext = (prev == (prev = get())); 325 } 326 } 327 328 /** 329 * Atomically updates (with memory effects as specified by {@link 330 * VarHandle#compareAndSet}) the current value with the results of 331 * applying the given function to the current and given values, 332 * returning the updated value. The function should be 333 * side-effect-free, since it may be re-applied when attempted 334 * updates fail due to contention among threads. The function is 335 * applied with the current value as its first argument, and the 336 * given update as the second argument. 337 * 338 * @param x the update value 339 * @param accumulatorFunction a side-effect-free function of two arguments 340 * @return the updated value 341 * @since 1.8 342 */ 343 public final long accumulateAndGet(long x, 344 LongBinaryOperator accumulatorFunction) { 345 long prev = get(), next = 0L; 346 for (boolean haveNext = false;;) { 347 if (!haveNext) 348 next = accumulatorFunction.applyAsLong(prev, x); 349 if (weakCompareAndSetVolatile(prev, next)) 350 return next; 351 haveNext = (prev == (prev = get())); 352 } 353 } 354 355 /** 356 * Returns the String representation of the current value. 357 * @return the String representation of the current value 358 */ 359 public String toString() { 360 return Long.toString(get()); 361 } 362 363 /** 364 * Returns the current value of this {@code AtomicLong} as an {@code int} 365 * after a narrowing primitive conversion, 366 * with memory effects as specified by {@link VarHandle#getVolatile}. 367 * @jls 5.1.3 Narrowing Primitive Conversion 368 */ 369 public int intValue() { 370 return (int)get(); 371 } 372 373 /** 374 * Returns the current value of this {@code AtomicLong} as a {@code long}, 375 * with memory effects as specified by {@link VarHandle#getVolatile}. 376 * Equivalent to {@link #get()}. 377 */ 378 public long longValue() { 379 return get(); 380 } 381 382 /** 383 * Returns the current value of this {@code AtomicLong} as a {@code float} 384 * after a widening primitive conversion, 385 * with memory effects as specified by {@link VarHandle#getVolatile}. 386 * @jls 5.1.2 Widening Primitive Conversion 387 */ 388 public float floatValue() { 389 return (float)get(); 390 } 391 392 /** 393 * Returns the current value of this {@code AtomicLong} as a {@code double} 394 * after a widening primitive conversion, 395 * with memory effects as specified by {@link VarHandle#getVolatile}. 396 * @jls 5.1.2 Widening Primitive Conversion 397 */ 398 public double doubleValue() { 399 return (double)get(); 400 } 401 402 // jdk9 403 404 /** 405 * Returns the current value, with memory semantics of reading as if the 406 * variable was declared non-{@code volatile}. 407 * 408 * @return the value 409 * @since 9 410 */ 411 public final long getPlain() { 412 return U.getLong(this, VALUE); 413 } 414 415 /** 416 * Sets the value to {@code newValue}, with memory semantics 417 * of setting as if the variable was declared non-{@code volatile} 418 * and non-{@code final}. 419 * 420 * @param newValue the new value 421 * @since 9 422 */ 423 public final void setPlain(long newValue) { 424 U.putLong(this, VALUE, newValue); 425 } 426 427 /** 428 * Returns the current value, 429 * with memory effects as specified by {@link VarHandle#getOpaque}. 430 * 431 * @return the value 432 * @since 9 433 */ 434 public final long getOpaque() { 435 return U.getLongOpaque(this, VALUE); 436 } 437 438 /** 439 * Sets the value to {@code newValue}, 440 * with memory effects as specified by {@link VarHandle#setOpaque}. 441 * 442 * @param newValue the new value 443 * @since 9 444 */ 445 public final void setOpaque(long newValue) { 446 U.putLongOpaque(this, VALUE, newValue); 447 } 448 449 /** 450 * Returns the current value, 451 * with memory effects as specified by {@link VarHandle#getAcquire}. 452 * 453 * @return the value 454 * @since 9 455 */ 456 public final long getAcquire() { 457 return U.getLongAcquire(this, VALUE); 458 } 459 460 /** 461 * Sets the value to {@code newValue}, 462 * with memory effects as specified by {@link VarHandle#setRelease}. 463 * 464 * @param newValue the new value 465 * @since 9 466 */ 467 public final void setRelease(long newValue) { 468 U.putLongRelease(this, VALUE, newValue); 469 } 470 471 /** 472 * Atomically sets the value to {@code newValue} if the current value, 473 * referred to as the <em>witness value</em>, {@code == expectedValue}, 474 * with memory effects as specified by 475 * {@link VarHandle#compareAndExchange}. 476 * 477 * @param expectedValue the expected value 478 * @param newValue the new value 479 * @return the witness value, which will be the same as the 480 * expected value if successful 481 * @since 9 482 */ 483 public final long compareAndExchange(long expectedValue, long newValue) { 484 return U.compareAndExchangeLong(this, VALUE, expectedValue, newValue); 485 } 486 487 /** 488 * Atomically sets the value to {@code newValue} if the current value, 489 * referred to as the <em>witness value</em>, {@code == expectedValue}, 490 * with memory effects as specified by 491 * {@link VarHandle#compareAndExchangeAcquire}. 492 * 493 * @param expectedValue the expected value 494 * @param newValue the new value 495 * @return the witness value, which will be the same as the 496 * expected value if successful 497 * @since 9 498 */ 499 public final long compareAndExchangeAcquire(long expectedValue, long newValue) { 500 return U.compareAndExchangeLongAcquire(this, VALUE, expectedValue, newValue); 501 } 502 503 /** 504 * Atomically sets the value to {@code newValue} if the current value, 505 * referred to as the <em>witness value</em>, {@code == expectedValue}, 506 * with memory effects as specified by 507 * {@link VarHandle#compareAndExchangeRelease}. 508 * 509 * @param expectedValue the expected value 510 * @param newValue the new value 511 * @return the witness value, which will be the same as the 512 * expected value if successful 513 * @since 9 514 */ 515 public final long compareAndExchangeRelease(long expectedValue, long newValue) { 516 return U.compareAndExchangeLongRelease(this, VALUE, expectedValue, newValue); 517 } 518 519 /** 520 * Possibly atomically sets the value to {@code newValue} 521 * if the current value {@code == expectedValue}, 522 * with memory effects as specified by 523 * {@link VarHandle#weakCompareAndSet}. 524 * 525 * @param expectedValue the expected value 526 * @param newValue the new value 527 * @return {@code true} if successful 528 * @since 9 529 */ 530 public final boolean weakCompareAndSetVolatile(long expectedValue, long newValue) { 531 return U.weakCompareAndSetLong(this, VALUE, expectedValue, newValue); 532 } 533 534 /** 535 * Possibly atomically sets the value to {@code newValue} 536 * if the current value {@code == expectedValue}, 537 * with memory effects as specified by 538 * {@link VarHandle#weakCompareAndSetAcquire}. 539 * 540 * @param expectedValue the expected value 541 * @param newValue the new value 542 * @return {@code true} if successful 543 * @since 9 544 */ 545 public final boolean weakCompareAndSetAcquire(long expectedValue, long newValue) { 546 return U.weakCompareAndSetLongAcquire(this, VALUE, expectedValue, newValue); 547 } 548 549 /** 550 * Possibly atomically sets the value to {@code newValue} 551 * if the current value {@code == expectedValue}, 552 * with memory effects as specified by 553 * {@link VarHandle#weakCompareAndSetRelease}. 554 * 555 * @param expectedValue the expected value 556 * @param newValue the new value 557 * @return {@code true} if successful 558 * @since 9 559 */ 560 public final boolean weakCompareAndSetRelease(long expectedValue, long newValue) { 561 return U.weakCompareAndSetLongRelease(this, VALUE, expectedValue, newValue); 562 } 563 564 }