diff --git a/week_02/57/AtomicInteger-057.txt b/week_02/57/AtomicInteger-057.txt new file mode 100644 index 0000000000000000000000000000000000000000..a3111e2b710a67a3f33b4cc8aaec349e02a664bc --- /dev/null +++ b/week_02/57/AtomicInteger-057.txt @@ -0,0 +1,21 @@ +1.原子整形,多线程下保证原子性、可见性。 +private volatile int value; +用volatile修饰的变量value + +2. +public final boolean compareAndSet(int expect, int update) { + return unsafe.compareAndSwapInt(this, valueOffset, expect, update); + } +采用CAS原来,调用Usafe方法,保证操作的原子性 + +3. +关于compareAndSet及weakCompareAndSet的一些区别:参考下面的链接 +https://www.jianshu.com/p/55a66113bc54 + +4. +public final int getAndIncrement() { + return unsafe.getAndAddInt(this, valueOffset, 1); + } +保证原子操作的num++ + +其他方法类似 \ No newline at end of file diff --git a/week_02/57/AtomicStampedReference-057.txt b/week_02/57/AtomicStampedReference-057.txt new file mode 100644 index 0000000000000000000000000000000000000000..656c9661a1479c3ef94d1e819b0e43d2f7f25b5d --- /dev/null +++ b/week_02/57/AtomicStampedReference-057.txt @@ -0,0 +1,17 @@ +1.带时间戳的原子引用类型,初始化时必须指定引用类型的初始值及初始版本号 +2. public V getReference() { + return pair.reference; + } + + public int getStamp() { + return pair.stamp; + } + +获取引用及版本号的方法 + +3.public V get(int[] stampHolder) { + Pair pair = this.pair; + stampHolder[0] = pair.stamp; + return pair.reference; + } +获取引用类型的值 \ No newline at end of file diff --git a/week_02/57/LongAdder-057.txt b/week_02/57/LongAdder-057.txt new file mode 100644 index 0000000000000000000000000000000000000000..4e8f05a20cff7199c637f92b3a7a99b4f69b11f6 --- /dev/null +++ b/week_02/57/LongAdder-057.txt @@ -0,0 +1,62 @@ +1.原子Long类型 +2. +public LongAdder() { + } +只提供无参构造方法,创建一个初始和为零的新加法器。 +3. +继承Striped64 + +4.add 添加给定值 +public void add(long x) { + Cell[] as; long b, v; int m; Cell a; + if ((as = cells) != null || !casBase(b = base, b + x)) { + boolean uncontended = true; + if (as == null || (m = as.length - 1) < 0 || + (a = as[getProbe() & m]) == null || + !(uncontended = a.cas(v = a.value, v + x))) + longAccumulate(x, null, uncontended); + } + } + +5.sum 返回当前总和。返回当前总和。 +返回的值不是原子快照。在没有并发更新的情况下调用会返回准确的结果, +但是在计算总和时发生的并发更新可能不会合并。 +public long sum() { + Cell[] as = cells; Cell a; + long sum = base; + if (as != null) { + for (int i = 0; i < as.length; ++i) { + if ((a = as[i]) != null) + sum += a.value; + } + } + return sum; + } + +6.reset 重置为初始化值,即0 +public void reset() { + Cell[] as = cells; Cell a; + base = 0L; + if (as != null) { + for (int i = 0; i < as.length; ++i) { + if ((a = as[i]) != null) + a.value = 0L; + } + } + } + +7.sum() 并reset() +public long sumThenReset() { + Cell[] as = cells; Cell a; + long sum = base; + base = 0L; + if (as != null) { + for (int i = 0; i < as.length; ++i) { + if ((a = as[i]) != null) { + sum += a.value; + a.value = 0L; + } + } + } + return sum; + } \ No newline at end of file diff --git a/week_02/57/Unsafe-057.txt b/week_02/57/Unsafe-057.txt new file mode 100644 index 0000000000000000000000000000000000000000..a1442d1f1f9ce6b1309aa56a8056ab602961ce3c --- /dev/null +++ b/week_02/57/Unsafe-057.txt @@ -0,0 +1,17 @@ +1. +Unsafe类存在于 sun.misc 包中,其内部方法操作可 +以像C的指针一样直接操作内存。 +Unsafe类中的所有方法都是native修饰的,也就是说Unsafe类中的方法都直接调用操作系统底层资源执 +行相应任务 + +2. +public final int getAndAddInt(Object var1, long var2, int var4) { + int var5; + do { + var5 = this.getIntVolatile(var1, var2); + } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); + + return var5; + } + +以其中一个方法为例。经典的自旋锁,实现原子操作的关键。 \ No newline at end of file