From ed88289ee86d1e7e193a00b08415660ed574e44b Mon Sep 17 00:00:00 2001 From: Johnnie Date: Mon, 1 Feb 2021 19:45:36 +0800 Subject: [PATCH 1/7] =?UTF-8?q?Update=20Java=E5=86=85=E5=AD=98=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=BB=A5=E5=8F=8Ahappens-before.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\345\236\213\344\273\245\345\217\212happens-before.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/03.java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before\350\247\204\345\210\231/Java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before.md" "b/03.java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before\350\247\204\345\210\231/Java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before.md" index e9ba673..5d5dde1 100644 --- "a/03.java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before\350\247\204\345\210\231/Java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before.md" +++ "b/03.java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before\350\247\204\345\210\231/Java\345\206\205\345\255\230\346\250\241\345\236\213\344\273\245\345\217\212happens-before.md" @@ -6,7 +6,7 @@ 在多线程条件下,多个线程肯定会相互协作完成一件事情,一般来说就会涉及到**多个线程间相互通信告知彼此的状态以及当前的执行结果**等,另外,为了性能优化,还会**涉及到编译器指令重排序和处理器指令重排序**。下面会一一来聊聊这些知识。 -#2. 内存模型抽象结构 +# 2. 内存模型抽象结构 # 线程间协作通信可以类比人与人之间的协作的方式,在现实生活中,之前网上有个流行语“你妈喊你回家吃饭了”,就以这个生活场景为例,小明在外面玩耍,小明妈妈在家里做饭,做晚饭后准备叫小明回家吃饭,那么就存在两种方式: 小明妈妈要去上班了十分紧急这个时候手机又没有电了,于是就在桌子上贴了一张纸条“饭做好了,放在...”小明回家后看到纸条如愿吃到妈妈做的饭菜,那么,如果将小明妈妈和小明作为两个线程,那么这张纸条就是这两个线程间通信的共享变量,通过读写共享变量实现两个线程间协作; @@ -142,4 +142,4 @@ JMM的设计图为: > 参考文献 -《java并发编程的艺术》 \ No newline at end of file +《java并发编程的艺术》 From 2b64df0a20808938af4f66d00e8e60aa359ba1c3 Mon Sep 17 00:00:00 2001 From: Johnnie Date: Tue, 2 Feb 2021 17:44:36 +0800 Subject: [PATCH 2/7] =?UTF-8?q?Update=20java=E5=85=B3=E9=94=AE=E5=AD=97---?= =?UTF-8?q?synchronized.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java\345\205\263\351\224\256\345\255\227---synchronized.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" "b/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" index fe91e9f..d8adb3e 100644 --- "a/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" +++ "b/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" @@ -32,7 +32,7 @@ 在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景: -![Synchronized的使用场景](https://user-gold-cdn.xitu.io/2018/4/30/16315cc79aaac173?w=700&h=413&f=png&s=33838) +![Synchronized的使用场景](Synchronized的使用场景.png) 如图,synchronized可以用在**方法**上也可以使用在**代码块**中,其中方法是实例方法和静态方法分别锁的是该类的实例对象和该类的对象。而使用在代码块中也可以分为三种,具体的可以看上面的表格。这里的需要注意的是:**如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系**。 From 0435434f28b14c400cf78300a6bd07e174c69142 Mon Sep 17 00:00:00 2001 From: Johnnie Date: Tue, 2 Feb 2021 17:45:51 +0800 Subject: [PATCH 3/7] =?UTF-8?q?Update=20java=E5=85=B3=E9=94=AE=E5=AD=97---?= =?UTF-8?q?synchronized.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java\345\205\263\351\224\256\345\255\227---synchronized.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" "b/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" index d8adb3e..c0ded6b 100644 --- "a/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" +++ "b/04.\345\275\273\345\272\225\347\220\206\350\247\243synchronized/java\345\205\263\351\224\256\345\255\227---synchronized.md" @@ -32,7 +32,7 @@ 在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景: -![Synchronized的使用场景](Synchronized的使用场景.png) +![Synchronized的使用场景](https://github.com/Smilence7/Java-concurrency/blob/master/04.%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3synchronized/synchronized%E7%9A%84%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF.png) 如图,synchronized可以用在**方法**上也可以使用在**代码块**中,其中方法是实例方法和静态方法分别锁的是该类的实例对象和该类的对象。而使用在代码块中也可以分为三种,具体的可以看上面的表格。这里的需要注意的是:**如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系**。 From abc0998541a9743caac267904474fd2cbccfe440 Mon Sep 17 00:00:00 2001 From: Johnnie Date: Tue, 16 Feb 2021 22:34:04 +0800 Subject: [PATCH 4/7] =?UTF-8?q?Update=20=E5=B9=B6=E5=8F=91=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E4=B9=8BThreadLocal.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" "b/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" index 2c6ed61..afe0a7f 100644 --- "a/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" +++ "b/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" @@ -128,7 +128,7 @@ ThreadLocalMap是threadLocal一个静态内部类,和大多数容器一样内 } } -Entry是一个以ThreadLocal为key,Object为value的键值对,另外需要注意的是这里的**threadLocal是弱引用,因为Entry继承了WeakReference,在Entry的构造方法中,调用了super(k)方法就会将threadLocal实例包装成一个WeakReferenece。**到这里我们可以用一个图(下图来自http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/)来理解下thread,threadLocal,threadLocalMap,Entry之间的关系: +Entry是一个以ThreadLocal为key,Object为value的键值对,另外需要注意的是这里的**threadLocal是弱引用,因为Entry继承了WeakReference,在Entry的构造方法中,调用了super(k)方法就会将threadLocal实例包装成一个WeakReferenece。**到这里我们可以用一个图(下图来自http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/)来理解下thread,threadLocal,threadLocalMap,Entry之间的关系: ![ThreadLocal各引用间的关系](http://upload-images.jianshu.io/upload_images/2615789-12aef2e6ff040cae.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/610) From bed73bdb5f62ea221c13e0234f56f98f437fc593 Mon Sep 17 00:00:00 2001 From: Johnnie Date: Tue, 16 Feb 2021 22:35:42 +0800 Subject: [PATCH 5/7] =?UTF-8?q?Update=20=E5=B9=B6=E5=8F=91=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E4=B9=8BThreadLocal.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" "b/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" index afe0a7f..c5737d4 100644 --- "a/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" +++ "b/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" @@ -128,7 +128,7 @@ ThreadLocalMap是threadLocal一个静态内部类,和大多数容器一样内 } } -Entry是一个以ThreadLocal为key,Object为value的键值对,另外需要注意的是这里的**threadLocal是弱引用,因为Entry继承了WeakReference,在Entry的构造方法中,调用了super(k)方法就会将threadLocal实例包装成一个WeakReferenece。**到这里我们可以用一个图(下图来自http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/)来理解下thread,threadLocal,threadLocalMap,Entry之间的关系: +Entry是一个以ThreadLocal为key,Object为value的键值对,另外需要注意的是这里的**threadLocal是弱引用,因为Entry继承了WeakReference,在Entry的构造方法中,调用了super(k)方法就会将threadLocal实例包装成一个WeakReferenece。** 到这里我们可以用一个图(下图来自[blog.xiaohansong.com]http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/)来理解下thread,threadLocal,threadLocalMap,Entry之间的关系: ![ThreadLocal各引用间的关系](http://upload-images.jianshu.io/upload_images/2615789-12aef2e6ff040cae.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/610) From 8d21e14deb8012c8e9126b06f930459e0a808d5e Mon Sep 17 00:00:00 2001 From: Johnnie Date: Tue, 16 Feb 2021 22:36:08 +0800 Subject: [PATCH 6/7] =?UTF-8?q?Update=20=E5=B9=B6=E5=8F=91=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E4=B9=8BThreadLocal.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" "b/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" index c5737d4..b36eebc 100644 --- "a/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" +++ "b/17.\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal/\345\271\266\345\217\221\345\256\271\345\231\250\344\271\213ThreadLocal.md" @@ -128,7 +128,7 @@ ThreadLocalMap是threadLocal一个静态内部类,和大多数容器一样内 } } -Entry是一个以ThreadLocal为key,Object为value的键值对,另外需要注意的是这里的**threadLocal是弱引用,因为Entry继承了WeakReference,在Entry的构造方法中,调用了super(k)方法就会将threadLocal实例包装成一个WeakReferenece。** 到这里我们可以用一个图(下图来自[blog.xiaohansong.com]http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/)来理解下thread,threadLocal,threadLocalMap,Entry之间的关系: +Entry是一个以ThreadLocal为key,Object为value的键值对,另外需要注意的是这里的**threadLocal是弱引用,因为Entry继承了WeakReference,在Entry的构造方法中,调用了super(k)方法就会将threadLocal实例包装成一个WeakReferenece。** 到这里我们可以用一个图(下图来自[blog.xiaohansong.com](http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/))来理解下thread,threadLocal,threadLocalMap,Entry之间的关系: ![ThreadLocal各引用间的关系](http://upload-images.jianshu.io/upload_images/2615789-12aef2e6ff040cae.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/610) From b28bd72b2b28a2c10187f8074d81917e2bb9a119 Mon Sep 17 00:00:00 2001 From: Johnnie Date: Fri, 19 Feb 2021 16:03:35 +0800 Subject: [PATCH 7/7] =?UTF-8?q?Update=20=E5=BD=BB=E5=BA=95=E7=90=86?= =?UTF-8?q?=E8=A7=A3ReentrantLock.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...275\273\345\272\225\347\220\206\350\247\243ReentrantLock.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/10.\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock/\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock.md" "b/10.\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock/\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock.md" index 59fe6f4..8a8b165 100644 --- "a/10.\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock/\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock.md" +++ "b/10.\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock/\345\275\273\345\272\225\347\220\206\350\247\243ReentrantLock.md" @@ -1,7 +1,7 @@ # 1. ReentrantLock的介绍 # -ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,**支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞**。在java关键字synchronized隐式支持重入性(关于synchronized可以[看这篇文章](https://juejin.im/post/5ae6dc04f265da0ba351d3ff)),synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持**公平锁和非公平锁**两种方式。那么,要想完完全全的弄懂ReentrantLock的话,主要也就是ReentrantLock同步语义的学习:1. 重入性的实现原理;2. 公平锁和非公平锁。 +ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,**支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞**。在java关键字synchronized隐式支持重入性(关于synchronized可以[看这篇文章](https://juejin.im/post/5ae6dc04f265da0ba351d3ff)),ReentrantLock通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持**公平锁和非公平锁**两种方式。那么,要想完完全全的弄懂ReentrantLock的话,主要也就是ReentrantLock同步语义的学习:1. 重入性的实现原理;2. 公平锁和非公平锁。 # 2. 重入性的实现原理 #