diff options
Diffstat (limited to 'kamon-core/src/main/java/kamon/jsr166/Striped64.java')
-rw-r--r-- | kamon-core/src/main/java/kamon/jsr166/Striped64.java | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kamon-core/src/main/java/kamon/jsr166/Striped64.java b/kamon-core/src/main/java/kamon/jsr166/Striped64.java index 4840c8d7..8fbfa4ba 100644 --- a/kamon-core/src/main/java/kamon/jsr166/Striped64.java +++ b/kamon-core/src/main/java/kamon/jsr166/Striped64.java @@ -105,6 +105,14 @@ abstract class Striped64 extends Number { return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); } + final long getAndSet(long val) { + long v; + do { + v = UNSAFE.getLongVolatile(this, valueOffset); + } while (!UNSAFE.compareAndSwapLong(this, valueOffset, v, val)); + return v; + } + // Unsafe mechanics private static final sun.misc.Unsafe UNSAFE; private static final long valueOffset; @@ -182,6 +190,17 @@ abstract class Striped64 extends Number { } /** + * CASes the base field. + */ + final long getAndSetBase(long val) { + long v; + do { + v = UNSAFE.getLongVolatile(this, baseOffset); + } while (!UNSAFE.compareAndSwapLong(this, baseOffset, v, val)); + return v; + } + + /** * CASes the busy field from 0 to 1 to acquire lock. */ final boolean casBusy() { |