diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..5850ed7
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..3916816
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..a59d74b
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..39ce183
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,1306 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ synchronized
+ compare
+ incrementand
+ compareandset
+ all
+ sun.mi
+ onadv
+ set
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1565232818446
+
+
+ 1565232818446
+
+
+ 1566616292953
+
+
+
+ 1566616292953
+
+
+ 1567908240513
+
+
+
+ 1567908240513
+
+
+ 1569205605236
+
+
+
+ 1569205605236
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/com/mashibing/juc/c_020/T11_TestSemaphore.java
+ 12
+
+
+
+
+ jar://C:/Program Files/Java/jdk-11.0.3/lib/src.zip!/java.base/java/util/concurrent/locks/ReentrantLock.java
+ 126
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/com/mashibing/juc/c_021_02_AQS/TestReentrantLock.java
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No facets are configured
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+ JUC
+
+
+
+
+
+
+
+
+
+
+
+
+ Maven: com.lmax:disruptor:3.4.2
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/JUC.iml b/JUC.iml
new file mode 100644
index 0000000..74f3f13
--- /dev/null
+++ b/JUC.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/main/java/com/mashibing/juc/c_018_01_Unsafe/HelloUnsafe.java b/src/main/java/com/mashibing/juc/c_018_01_Unsafe/HelloUnsafe.java
index 9c1fdfb..dc5ff0d 100644
--- a/src/main/java/com/mashibing/juc/c_018_01_Unsafe/HelloUnsafe.java
+++ b/src/main/java/com/mashibing/juc/c_018_01_Unsafe/HelloUnsafe.java
@@ -2,6 +2,8 @@
//import sun.misc.*;
+import sun.misc.Unsafe;
+
public class HelloUnsafe {
static class M {
private M() {}
@@ -9,12 +11,12 @@ private M() {}
int i =0;
}
- /* public static void main(String[] args) throws InstantiationException {
+ public static void main(String[] args) throws InstantiationException {
Unsafe unsafe = Unsafe.getUnsafe();
M m = (M)unsafe.allocateInstance(M.class);
m.i = 9;
System.out.println(m.i);
- }*/
+ }
}
diff --git a/src/main/java/com/mashibing/juc/c_021_03_VarHandle/T01_HelloVarHandle.java b/src/main/java/com/mashibing/juc/c_021_03_VarHandle/T01_HelloVarHandle.java
new file mode 100644
index 0000000..65afb67
--- /dev/null
+++ b/src/main/java/com/mashibing/juc/c_021_03_VarHandle/T01_HelloVarHandle.java
@@ -0,0 +1,37 @@
+package com.mashibing.juc.c_021_03_VarHandle;
+
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+
+public class T01_HelloVarHandle {
+
+ int x = 8;
+
+ private static VarHandle handle;
+
+ static {
+ try {
+ handle = MethodHandles.lookup().findVarHandle(T01_HelloVarHandle.class, "x", int.class);
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) {
+ T01_HelloVarHandle t = new T01_HelloVarHandle();
+
+ //plain read / write
+ System.out.println((int)handle.get(t));
+ handle.set(t,9);
+ System.out.println(t.x);
+
+ handle.compareAndSet(t, 9, 10);
+ System.out.println(t.x);
+
+ handle.getAndAdd(t, 10);
+ System.out.println(t.x);
+
+ }
+}
diff --git a/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/M.java b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/M.java
new file mode 100644
index 0000000..19da6d8
--- /dev/null
+++ b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/M.java
@@ -0,0 +1,8 @@
+package com.mashibing.juc.c_022_RefTypeAndThreadLocal;
+
+public class M {
+ @Override
+ protected void finalize() throws Throwable {
+ System.out.println("finalize");
+ }
+}
diff --git a/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T01_NormalReference.java b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T01_NormalReference.java
new file mode 100644
index 0000000..59efbdc
--- /dev/null
+++ b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T01_NormalReference.java
@@ -0,0 +1,13 @@
+package com.mashibing.juc.c_022_RefTypeAndThreadLocal;
+
+import java.io.IOException;
+
+public class T01_NormalReference {
+ public static void main(String[] args) throws IOException {
+ M m = new M();
+ m = null;
+ System.gc(); //DisableExplicitGC
+
+ System.in.read();
+ }
+}
diff --git a/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T02_SoftReference.java b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T02_SoftReference.java
new file mode 100644
index 0000000..3b4bef9
--- /dev/null
+++ b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T02_SoftReference.java
@@ -0,0 +1,31 @@
+/**
+ * 软引用
+ * 软引用是用来描述一些还有用但并非必须的对象。
+ * 对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。
+ * 如果这次回收还没有足够的内存,才会抛出内存溢出异常。
+ * -Xmx20M
+ */
+package com.mashibing.juc.c_022_RefTypeAndThreadLocal;
+
+import java.lang.ref.SoftReference;
+
+public class T02_SoftReference {
+ public static void main(String[] args) {
+ SoftReference m = new SoftReference<>(new byte[1024*1024*10]);
+ //m = null;
+ System.out.println(m.get());
+ System.gc();
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println(m.get());
+
+ //再分配一个数组,heap将装不下,这时候系统会垃圾回收,先回收一次,如果不够,会把软引用干掉
+ byte[] b = new byte[1024*1024*15];
+ System.out.println(m.get());
+ }
+}
+
+//软引用非常适合缓存使用
diff --git a/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T03_WeakReference.java b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T03_WeakReference.java
new file mode 100644
index 0000000..d049f61
--- /dev/null
+++ b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T03_WeakReference.java
@@ -0,0 +1,24 @@
+/**
+ * 弱引用遭到gc就会回收
+ *
+ */
+package com.mashibing.juc.c_022_RefTypeAndThreadLocal;
+
+import java.lang.ref.WeakReference;
+
+public class T03_WeakReference {
+ public static void main(String[] args) {
+ WeakReference m = new WeakReference<>(new M());
+
+ System.out.println(m.get());
+ System.gc();
+ System.out.println(m.get());
+
+
+ ThreadLocal tl = new ThreadLocal<>();
+ tl.set(new M());
+ tl.remove();
+
+ }
+}
+
diff --git a/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T04_PhantomReference.java b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T04_PhantomReference.java
new file mode 100644
index 0000000..0f7bd2f
--- /dev/null
+++ b/src/main/java/com/mashibing/juc/c_022_RefTypeAndThreadLocal/T04_PhantomReference.java
@@ -0,0 +1,74 @@
+/**
+ *
+ *
+ * 一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,
+ * 也无法通过虚引用来获取一个对象的实例。
+ * 为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
+ * 虚引用和弱引用对关联对象的回收都不会产生影响,如果只有虚引用活着弱引用关联着对象,
+ * 那么这个对象就会被回收。它们的不同之处在于弱引用的get方法,虚引用的get方法始终返回null,
+ * 弱引用可以使用ReferenceQueue,虚引用必须配合ReferenceQueue使用。
+ *
+ * jdk中直接内存的回收就用到虚引用,由于jvm自动内存管理的范围是堆内存,
+ * 而直接内存是在堆内存之外(其实是内存映射文件,自行去理解虚拟内存空间的相关概念),
+ * 所以直接内存的分配和回收都是有Unsafe类去操作,java在申请一块直接内存之后,
+ * 会在堆内存分配一个对象保存这个堆外内存的引用,
+ * 这个对象被垃圾收集器管理,一旦这个对象被回收,
+ * 相应的用户线程会收到通知并对直接内存进行清理工作。
+ *
+ * 事实上,虚引用有一个很重要的用途就是用来做堆外内存的释放,
+ * DirectByteBuffer就是通过虚引用来实现堆外内存的释放的。
+ *
+ */
+
+
+package com.mashibing.juc.c_022_RefTypeAndThreadLocal;
+
+import java.lang.ref.PhantomReference;
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.util.LinkedList;
+import java.util.List;
+
+public class T04_PhantomReference {
+ private static final List