From ffc14cea2b00afb5042678ab8a3ca5d33f46c265 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 13 Jul 2014 23:21:10 +0800 Subject: [PATCH 001/524] =?UTF-8?q?Update=2007.=E4=BD=BF=E7=94=A8socket?= =?UTF-8?q?=E5=8F=91=E9=80=81HTTP=20POST=E8=AF=B7=E6=B1=82.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...351\200\201HTTP POST\350\257\267\346\261\202.md" | 13 ------------- 1 file changed, 13 deletions(-) diff --git "a/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md" "b/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md" index f5757b2..900f70a 100644 --- "a/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md" +++ "b/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md" @@ -54,16 +54,3 @@ socket.close(); ``` 一个HTTP POST的登陆请求就完成了。Java代码不难实现,唯一需要注意的HTTP报文的格式了。 - -##Connection: close - - 细心的人,可能会发现上面的请求,控制台虽然正确地打印了服务器响应的登陆报文,但是控制台的线程是还没有断开的。 -即使客户端使用了socket.close()。 - - 这里涉及TCP协议以及HTTP 1.1的长连接,先不详细解释。这里我们简单地使用一个Header就可以断开请求了。 - -```java -bw.write("Connection: close\r\n"); -``` - - 把上面这一段代码复制到前面一段代码的Header部分即可。perfect! From eb9f790b6ad11d92abf6b05f62dcd36e17c57f66 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 14 Jul 2014 08:52:47 +0800 Subject: [PATCH 002/524] =?UTF-8?q?Update=2027.Java=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E4=B9=8B=E5=AF=B9=E7=A7=B0=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=AE=97=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\260\345\212\240\345\257\206\347\256\227\346\263\225.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" "b/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" index 567e86e..6d65f53 100644 --- "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" +++ "b/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" @@ -6,7 +6,7 @@ **对称加密算法的安全基于密钥的保密,所以密钥的安全与否决定了加密信息的安全!** -虽然说**对称加密算法**不适用于安全要求较高的场合,对是对于一般应用来说,这已经足够了。与此同时,对称加密的速度远由于非对称加密,所以还是很多场景适用对称加密。 +虽然说**对称加密算法**不适用于安全要求较高的场合,对是对于一般应用来说,这已经足够了。与此同时,对称加密的速度远低于非对称加密,所以还是很多场景适用对称加密。 对称加密的速度比公钥加密快很多,在很多场合都需要对称加密。 @@ -111,4 +111,4 @@ public void decrypt() throws InvalidKeyException, NoSuchAlgorithmException, NoSu * 密码学:http://zh.wikipedia.org/wiki/%E5%AF%86%E7%A2%BC%E5%AD%B8 * 经典密码:http://zh.wikipedia.org/wiki/%E7%B6%93%E5%85%B8%E5%AF%86%E7%A2%BC * DES:http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96 -* 3DES:http://zh.wikipedia.org/wiki/3DES \ No newline at end of file +* 3DES:http://zh.wikipedia.org/wiki/3DES From 7d829cea8acfd020ea5249b0df869885e7a776e9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 14 Jul 2014 08:53:56 +0800 Subject: [PATCH 003/524] =?UTF-8?q?Update=2027.Java=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E4=B9=8B=E5=AF=B9=E7=A7=B0=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=AE=97=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" "b/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" index 6d65f53..fa4690c 100644 --- "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" +++ "b/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" @@ -36,7 +36,7 @@ IDEA(International Data Encryption Algorithm,国际数据加密标准)是 在加密之前,我们先要生成加密算法对应的密钥。我们之前所说的密钥长度都是基于位元为单位的。例如128位的密钥,则该密钥占用128个位元,以一个字节八位元,128密钥占用128 / 8 = 16个字节。使用byte[]数组存放,则byte[]的长度为16。 -为了方便存储和传输,我们通常使用Base64对密钥的字节组数进行编码。而ASCII编码有很多字符是不可打印的,所以不建议使用ASCII。当然你可以使用ASCII,当时很容易在存储或传输过程中丢失字节(在计算器中存储和传输没有问题,但是使用纸质就歇菜了)。当然你可以使用其他方式和编码,一般情况下都是使用Base64,约定俗成。 +为了方便存储和传输,我们通常使用Base64对密钥的字节组数进行编码。而ASCII编码有很多字符是不可打印的,所以不建议使用ASCII。当然你可以使用ASCII,但是很容易在存储或传输过程中丢失字节(在计算器中存储和传输没有问题,但是使用纸质就歇菜了)。当然你可以使用其他方式和编码,一般情况下都是使用Base64,约定俗成。 Java中使用`KeyGenerator`类来生成密钥。如下: From 882c605199271acb614fba2bf3b7a15ba64a267a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 14 Jul 2014 08:55:25 +0800 Subject: [PATCH 004/524] =?UTF-8?q?Update=2027.Java=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E4=B9=8B=E5=AF=B9=E7=A7=B0=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=AE=97=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" "b/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" index fa4690c..caaaded 100644 --- "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" +++ "b/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" @@ -58,7 +58,7 @@ public void generateKey() throws NoSuchAlgorithmException { Cipher是JCA中用于加密解密的类,它同时负责数据的加密与解密。在初始化时,需要为Cipher指定是加密或是解密模式。 -加密与加密的过程直接操作的是数据的字节数组,由于字符在JVM中是以unicode形式存在的,字符串的不同编码的字节数组序列是一样的,例如UTF-8和GBK的字节序列就不一样。所以在加密之前或加密之后需要将字符编码进行编码与解码。当然,这不是必须的,你可以使用系统默认的ASCII字符编码,只要统一即可。 +加密与加密的过程直接操作的是数据的字节数组,由于字符在JVM中是以unicode形式存在的,字符串的不同编码的字节数组序列是不一样的,例如UTF-8和GBK的字节序列就不一样。所以在加密之前或加密之后需要将字符编码进行编码与解码。当然,这不是必须的,你可以使用系统默认的ASCII字符编码,只要统一即可。 数据加密后是以字节数组存在的,跟密钥类似,为了方面存储和传输,我们将加密后的结果转为Base64表示形式。 From a74fa79ded72cc639d6afbe3f4f3ff1b46f12e95 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 14 Jul 2014 08:57:14 +0800 Subject: [PATCH 005/524] =?UTF-8?q?Update=2028.Java=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E4=B9=8B=E9=9D=9E=E5=AF=B9=E7=A7=B0=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E7=AE=97=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\260\345\212\240\345\257\206\347\256\227\346\263\225.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" "b/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" index 025fe05..0398372 100644 --- "a/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" +++ "b/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" @@ -10,7 +10,7 @@ ###28.2.1 典型非对称加密算法:RSA -RSA算法密钥的长度为512位至65535位之间,且必须是64的倍数。Java6默认的RSA算法的密钥长度是1014位。 +RSA算法密钥的长度为512位至65535位之间,且必须是64的倍数。Java6默认的RSA算法的密钥长度是1024位。 ###28.2.2 常用非对称加密算法:EIGamal @@ -74,4 +74,4 @@ public void t6_decrypt() throws NoSuchAlgorithmException, InvalidKeySpecExceptio } ``` -##28.4 参考资料 \ No newline at end of file +##28.4 参考资料 From 87c5d40ab30e1f5efbc837cb5efc9cd299f326ea Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 28 Aug 2014 18:42:44 +0800 Subject: [PATCH 006/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 30.Java Runtime Data Areas.md diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md new file mode 100644 index 0000000..c085782 --- /dev/null +++ b/30.Java Runtime Data Areas.md @@ -0,0 +1,70 @@ +#30.Java Runtime Data Areas.md + +##30.1 运行时数据区(Runtime Data Areas) +Java虚拟机为程序的运行提供了各种不同的数据区,部分数据区与JVM的生命周期一致(随JVM启动而分配,JVM退出而释放),而另一部分则跟线程绑定,随着线程的启动和退出进行分配和释放。 + +###30.1.1 程序计数器(Program Counter Rigister) +Java虚拟机支持多个线程在同一时刻运行。每一个Java虚拟机线程拥有自己的程序计数器。在任意时刻,任意线程都处于一个方法中(称为当前方法(current method)),如果是该方法是**非本地方法(not native method)**,则该程序计数器记录着**Java虚拟机执行的当前指令的地址**。而如果该方法为**本地方法(native method)**,则该程序计数器为undefined。 + +##30.1.2 Java虚拟机栈(Java Virtual Machine Stacks) +每个Java虚拟机线程都拥有各自的**Java虚拟机栈**,并与线程同时被创建。Java虚拟机栈用于存储**帧(frames)**。Java虚拟机栈跟传统语言的栈相似:存储局部变量、结果,同时参与方法的调用和返回。 +Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous. + +在第一版的Java虚拟机规范中,**Java虚拟机栈**做为**Java栈** 为人们所熟知。这个规范允许Java虚拟机栈是固定的大小或根据需要通过计算来动态地扩展和收缩。如果Java虚拟机堆的大小是固定的,(If the Java Virtual Machine stacks are of a fixed size, the size of each Java Virtual Machine stack may be chosen independently when that stack is created.) + +Java虚拟的实现可以提供让程序员或用户来控制Java虚拟栈初始大小,并且,可以让Java虚拟机栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。 + +以下异常情况与Java虚拟栈相关: +* 如果线程需要的Java虚拟机栈大小超过限额,则抛出**StackOverflowError**。 +* 如果Java虚拟机栈被设置为可动态拓展,当拓展时由于受限于物理内存的限制而无法实现拓展时,则抛出**OutOfMemoryError**。 + + +2.5.3. Heap + +The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated. + +The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor's system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous. + +A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the heap, as well as, if the heap can be dynamically expanded or contracted, control over the maximum and minimum heap size. + +The following exceptional condition is associated with the heap: + +If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an OutOfMemoryError. + +2.5.4. Method Area + +The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization. + +The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. This version of the Java Virtual Machine specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous. + +A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the method area, as well as, in the case of a varying-size method area, control over the maximum and minimum method area size. + +The following exceptional condition is associated with the method area: + +If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError. + +2.5.5. Run-Time Constant Pool + +A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table. + +Each run-time constant pool is allocated from the Java Virtual Machine's method area (§2.5.4). The run-time constant pool for a class or interface is constructed when the class or interface is created (§5.3) by the Java Virtual Machine. + +The following exceptional condition is associated with the construction of the run-time constant pool for a class or interface: + +When creating a class or interface, if the construction of the run-time constant pool requires more memory than can be made available in the method area of the Java Virtual Machine, the Java Virtual Machine throws an OutOfMemoryError. + +See §5 (Loading, Linking, and Initializing) for information about the construction of the run-time constant pool. + +2.5.6. Native Method Stacks + +An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created. + +This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created. + +A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the native method stacks, as well as, in the case of varying-size native method stacks, control over the maximum and minimum method stack sizes. + +The following exceptional conditions are associated with native method stacks: + +If the computation in a thread requires a larger native method stack than is permitted, the Java Virtual Machine throws a StackOverflowError. + +If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError. \ No newline at end of file From 02ac2a97e5c8aac71b65471b18caa9384724f248 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 28 Aug 2014 18:46:33 +0800 Subject: [PATCH 007/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index c085782..b363f53 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -1,5 +1,7 @@ #30.Java Runtime Data Areas.md +Java Runtime Data Areas + ##30.1 运行时数据区(Runtime Data Areas) Java虚拟机为程序的运行提供了各种不同的数据区,部分数据区与JVM的生命周期一致(随JVM启动而分配,JVM退出而释放),而另一部分则跟线程绑定,随着线程的启动和退出进行分配和释放。 @@ -18,6 +20,7 @@ Java虚拟的实现可以提供让程序员或用户来控制Java虚拟栈初始 * 如果线程需要的Java虚拟机栈大小超过限额,则抛出**StackOverflowError**。 * 如果Java虚拟机栈被设置为可动态拓展,当拓展时由于受限于物理内存的限制而无法实现拓展时,则抛出**OutOfMemoryError**。 +##30.1.2 堆(Heap) 2.5.3. Heap @@ -31,6 +34,7 @@ The following exceptional condition is associated with the heap: If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an OutOfMemoryError. +## 方法区(Method Area) 2.5.4. Method Area The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization. @@ -43,6 +47,8 @@ The following exceptional condition is associated with the method area: If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError. + +##运行时常量池(Runtime Constant Pool) 2.5.5. Run-Time Constant Pool A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table. @@ -55,6 +61,7 @@ When creating a class or interface, if the construction of the run-time constant See §5 (Loading, Linking, and Initializing) for information about the construction of the run-time constant pool. +##本地方法栈(Native Method Stacks) 2.5.6. Native Method Stacks An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created. From 99db8d2b2769e54a1770b936f738da8d2f5a7642 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 28 Aug 2014 18:47:45 +0800 Subject: [PATCH 008/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index b363f53..a0c712f 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -8,7 +8,7 @@ Java虚拟机为程序的运行提供了各种不同的数据区,部分数据 ###30.1.1 程序计数器(Program Counter Rigister) Java虚拟机支持多个线程在同一时刻运行。每一个Java虚拟机线程拥有自己的程序计数器。在任意时刻,任意线程都处于一个方法中(称为当前方法(current method)),如果是该方法是**非本地方法(not native method)**,则该程序计数器记录着**Java虚拟机执行的当前指令的地址**。而如果该方法为**本地方法(native method)**,则该程序计数器为undefined。 -##30.1.2 Java虚拟机栈(Java Virtual Machine Stacks) +###30.1.2 Java虚拟机栈(Java Virtual Machine Stacks) 每个Java虚拟机线程都拥有各自的**Java虚拟机栈**,并与线程同时被创建。Java虚拟机栈用于存储**帧(frames)**。Java虚拟机栈跟传统语言的栈相似:存储局部变量、结果,同时参与方法的调用和返回。 Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous. @@ -20,7 +20,7 @@ Java虚拟的实现可以提供让程序员或用户来控制Java虚拟栈初始 * 如果线程需要的Java虚拟机栈大小超过限额,则抛出**StackOverflowError**。 * 如果Java虚拟机栈被设置为可动态拓展,当拓展时由于受限于物理内存的限制而无法实现拓展时,则抛出**OutOfMemoryError**。 -##30.1.2 堆(Heap) +###30.1.2 堆(Heap) 2.5.3. Heap @@ -34,7 +34,7 @@ The following exceptional condition is associated with the heap: If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an OutOfMemoryError. -## 方法区(Method Area) +### 方法区(Method Area) 2.5.4. Method Area The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization. @@ -48,7 +48,7 @@ The following exceptional condition is associated with the method area: If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError. -##运行时常量池(Runtime Constant Pool) +###运行时常量池(Runtime Constant Pool) 2.5.5. Run-Time Constant Pool A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table. @@ -61,7 +61,7 @@ When creating a class or interface, if the construction of the run-time constant See §5 (Loading, Linking, and Initializing) for information about the construction of the run-time constant pool. -##本地方法栈(Native Method Stacks) +###本地方法栈(Native Method Stacks) 2.5.6. Native Method Stacks An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created. From 0569f88309473905509d5eab37249db00966a4b4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 28 Aug 2014 19:07:52 +0800 Subject: [PATCH 009/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index a0c712f..ceed10d 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -3,12 +3,15 @@ Java Runtime Data Areas ##30.1 运行时数据区(Runtime Data Areas) + Java虚拟机为程序的运行提供了各种不同的数据区,部分数据区与JVM的生命周期一致(随JVM启动而分配,JVM退出而释放),而另一部分则跟线程绑定,随着线程的启动和退出进行分配和释放。 ###30.1.1 程序计数器(Program Counter Rigister) + Java虚拟机支持多个线程在同一时刻运行。每一个Java虚拟机线程拥有自己的程序计数器。在任意时刻,任意线程都处于一个方法中(称为当前方法(current method)),如果是该方法是**非本地方法(not native method)**,则该程序计数器记录着**Java虚拟机执行的当前指令的地址**。而如果该方法为**本地方法(native method)**,则该程序计数器为undefined。 ###30.1.2 Java虚拟机栈(Java Virtual Machine Stacks) + 每个Java虚拟机线程都拥有各自的**Java虚拟机栈**,并与线程同时被创建。Java虚拟机栈用于存储**帧(frames)**。Java虚拟机栈跟传统语言的栈相似:存储局部变量、结果,同时参与方法的调用和返回。 Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous. @@ -22,17 +25,15 @@ Java虚拟的实现可以提供让程序员或用户来控制Java虚拟栈初始 ###30.1.2 堆(Heap) -2.5.3. Heap - -The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated. +Java虚拟机具有一个由所有Java虚拟机线程共享的一个堆。堆是**分配和储存所有的实例对象和数组的运行时数据区域**。 -The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor's system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous. +堆是在Java虚拟机启动时被创建的。堆的对象储存空间通过**自动存储管理系统(garbage collector简称gc)**进行回收,并不能像c/c++语言那样显示地进行释放。Java虚拟机没有指定限制使用的gc,这个可以由程序员和用户根据自己的情况来进行选择。堆可以是固定大小的,也可以通过计算来动态地拓展和收缩。同时,堆的内容空间地址不需要是连续的。 -A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the heap, as well as, if the heap can be dynamically expanded or contracted, control over the maximum and minimum heap size. +Java虚拟机的实现可以提供让程序员和用户控制初始的堆大小,并且,可以让栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。 -The following exceptional condition is associated with the heap: +以下异常情况与堆相关: -If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an OutOfMemoryError. +* 当堆需要拓展的内存大小大于自动存储管理系统所能提供的内存大小时,抛出**OutOfMemoryError**。 ### 方法区(Method Area) 2.5.4. Method Area From 8796b641e081ae7c57ea41a4e3e9dbe4f4af9211 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 28 Aug 2014 19:09:36 +0800 Subject: [PATCH 010/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index ceed10d..041cecd 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -75,4 +75,10 @@ The following exceptional conditions are associated with native method stacks: If the computation in a thread requires a larger native method stack than is permitted, the Java Virtual Machine throws a StackOverflowError. -If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError. \ No newline at end of file +If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError. + +### 拓展阅读 + +* 翻译自:http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5 +* understanding-jvm-internals: http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/ +* understanding-java-garbage-collection: http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ \ No newline at end of file From c5df6bc185d4f1fca0b421344728cefe0c83eb1c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 01:41:53 +0800 Subject: [PATCH 011/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index 041cecd..79dae41 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -36,21 +36,17 @@ Java虚拟机的实现可以提供让程序员和用户控制初始的堆大小 * 当堆需要拓展的内存大小大于自动存储管理系统所能提供的内存大小时,抛出**OutOfMemoryError**。 ### 方法区(Method Area) -2.5.4. Method Area -The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization. +Java虚拟机拥有一个由所有Java虚拟机线程共享的方法区。方法区类似于传统语言的用于存储编译代码的内存区域。(The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. )它用于存储每个类的类结构,例如**运行时常量池(Runtime Constant Pool)**,字段和方法数据,以及方法和构造方法的代码,包括类、实例和接口在初始化时使用的特殊方法。 -The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. This version of the Java Virtual Machine specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous. +方法区也是在Java虚拟机启动时创建的。虽然方法区作为堆的一部分,但简单的Java虚拟机的实现可能不会对这部分区域进行gc操作和内存紧凑操作。Java虚拟机规范并不强制规范方法区的存储位置和管理已编译代码的策略。方法区可以是固定大小,也可以根据实际需要对方法区的大小进行拓展和紧凑操作。同时,方法区的内存不需要是连续的。 -A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the method area, as well as, in the case of a varying-size method area, control over the maximum and minimum method area size. - -The following exceptional condition is associated with the method area: - -If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError. +Java虚拟机的实现应该提供让程序员和用户控制初始的方法区内存大小,并且,可以让方法区在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。 +以下异常情况与方法区相关: +* 如果方法区不能提供满足需要分配的内存时,Java虚拟机抛出**OutOfMemoryError**。 ###运行时常量池(Runtime Constant Pool) -2.5.5. Run-Time Constant Pool A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table. From fe93825daf77b4da297e01161e1e8fed64902ee3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 01:58:35 +0800 Subject: [PATCH 012/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index 79dae41..de7e390 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -50,13 +50,11 @@ Java虚拟机的实现应该提供让程序员和用户控制初始的方法区 A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table. -Each run-time constant pool is allocated from the Java Virtual Machine's method area (§2.5.4). The run-time constant pool for a class or interface is constructed when the class or interface is created (§5.3) by the Java Virtual Machine. +每个运行时常量池都是在Java虚拟机的方法区中进行分配的(也就是说运行时常量池是方法区中的一部分)。类/接口的运行时常量池在类/接口创建时被Java虚拟机构造。 -The following exceptional condition is associated with the construction of the run-time constant pool for a class or interface: +以下异常情况与类/接口的运行时常量池的创建相关: -When creating a class or interface, if the construction of the run-time constant pool requires more memory than can be made available in the method area of the Java Virtual Machine, the Java Virtual Machine throws an OutOfMemoryError. - -See §5 (Loading, Linking, and Initializing) for information about the construction of the run-time constant pool. +当创建一个类或接口时,如果运行时常量池的创建需要更多的内存,而方法区没有足够的内存可以提供时,Java虚拟机抛出**OutOfMemoryError**。 ###本地方法栈(Native Method Stacks) 2.5.6. Native Method Stacks From a44c6df21af4c234aa8d526dccebea162dc7acc2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 02:06:22 +0800 Subject: [PATCH 013/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index de7e390..1c29030 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -47,8 +47,7 @@ Java虚拟机的实现应该提供让程序员和用户控制初始的方法区 * 如果方法区不能提供满足需要分配的内存时,Java虚拟机抛出**OutOfMemoryError**。 ###运行时常量池(Runtime Constant Pool) - -A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table. +**运行时常量池**是一个类或接口的class文件的中**constant_pool**表的运行时表示。它包含多种常量:编译期的数值型字面量,运行时的方法和字段的引用。运行时常量池提供类似于一个传统的编程语言中的符号表的功能,但它比典型的符号表包含了更广泛的范围中的数据。 每个运行时常量池都是在Java虚拟机的方法区中进行分配的(也就是说运行时常量池是方法区中的一部分)。类/接口的运行时常量池在类/接口创建时被Java虚拟机构造。 From c6f6c3f367b6ea7b50ab9290ac918fabd2473518 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 02:13:28 +0800 Subject: [PATCH 014/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index 1c29030..def7a3a 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -56,17 +56,17 @@ Java虚拟机的实现应该提供让程序员和用户控制初始的方法区 当创建一个类或接口时,如果运行时常量池的创建需要更多的内存,而方法区没有足够的内存可以提供时,Java虚拟机抛出**OutOfMemoryError**。 ###本地方法栈(Native Method Stacks) -2.5.6. Native Method Stacks An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created. This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created. -A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the native method stacks, as well as, in the case of varying-size native method stacks, control over the maximum and minimum method stack sizes. -The following exceptional conditions are associated with native method stacks: +Java虚拟机的实现应当提供这样的功能:程序员和用户可以控制本地方法栈的初始化大小,并且,可以让本地方法栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。 + +以下异常情况与本地方法栈相关: +* 如果本地方法栈需要更多的内存,但无法进行分配时,Java虚拟机抛出**StackOverflowError**。 -If the computation in a thread requires a larger native method stack than is permitted, the Java Virtual Machine throws a StackOverflowError. If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError. From d4d30843af31186f1d9a195e8f65263bfaed3101 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 02:19:45 +0800 Subject: [PATCH 015/524] Published with https://stackedit.io/ --- 30.Java Runtime Data Areas.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/30.Java Runtime Data Areas.md b/30.Java Runtime Data Areas.md index def7a3a..ca4875d 100644 --- a/30.Java Runtime Data Areas.md +++ b/30.Java Runtime Data Areas.md @@ -56,8 +56,7 @@ Java虚拟机的实现应该提供让程序员和用户控制初始的方法区 当创建一个类或接口时,如果运行时常量池的创建需要更多的内存,而方法区没有足够的内存可以提供时,Java虚拟机抛出**OutOfMemoryError**。 ###本地方法栈(Native Method Stacks) - -An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created. +Java虚拟机应该使用传统的栈(通俗地将:C栈)来对**本地方法**(非Java实现的方法)进行支持。Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created. This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created. From f3e876eba6533ade57c0f4a932cb484213a62425 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 11:48:25 +0800 Subject: [PATCH 016/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 53 +++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 31.Understanding Java Garbage Collection.md diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md new file mode 100644 index 0000000..0fdb2a1 --- /dev/null +++ b/31.Understanding Java Garbage Collection.md @@ -0,0 +1,53 @@ +#31.Understanding Java Garbage Collection.md +理解GC(Garbage Collection)的工作原理对Java编程有什么益处呢?满足软件工程师的求知欲或许是一个不错的原因,但与此同时,也可以帮助你编写更加优秀的Java应用程序。 + +这是我的个人的主观意见,但是我相信那些深谙GC的人往往更容易成为一个优秀的Java工程师。如果你对GC感兴趣,那么意味着你有不错的开发经验。如果你有过仔细选择合适的GC算法经验,这意味着你完全了解你开发应用程序的功能特点。当然,这也许只是优秀开发者的普遍衡量标准,然而我要说的是,要想成为一名优秀的开发者,理解GC是一门必修的课程。 + +这篇文章的主要目的是以尽量简洁的方式向你讲解GC。我希望这篇文章能切切实实地对你有所帮助。回到正题,在GC中有个词汇**stop-the-word**,stop-the-word这个过程总会发生,无论你选择何种GC算法。stop-the-world意味着在**执行GC的过程中,JVM会中断所有的应用程序线程**( 除了GC需要的线程外)。被中断的线程会在GC完成后恢复。我们所关注的**GC调优就在于如何减少stop-the-world的运行时间**。 + +## 垃圾收集器(Generational Garbage Collection) + +Java代码并不能显式地对内存进行分配和移除。有些人会将对象设置为null或者调用System.gc()方法来**显式**地移除内存空间。将对象设置为null没有大不了的,当调用System.gc()方法却会大大地响应系统的性能(我们并不需要这样做)。 + +在Java中,开发者并不需要显式地在代码中释放内存,垃圾收集器会帮助我们找到不需要的对象并讲它们移除。垃圾收集器只所以被引入使用是基于以下两个假定前提: + 1. 大多数对象很快成为不可达状态; + 2. **老对象引用新对象**这种情况总是控制在很小的数量内。 +这两个假定前提被成为**弱世代假说(Weak generational hypothesis)**,基于这个假设,在HotSpot虚拟机中,内存(切确地说是Java Heap)被分为两种:**新生代(Young Generation)**与**老年代(Old Generation)**。 + +新生代:绝大部分的新创建的对象都被分配到这里。由于大部分的对象很快会成为不可达状态,很多新创建的对象都分配到新生代,然后很快从这个区域被释放。对象从新生代被释放,我们称这个过程为**Minor GC**。 + +老年代:当在新生代的对象没有成为不可达状态,并且从新生代存活下来后,我们会将这些对象复制到老年代。老年代的储存空间会比新生代的要大,所以在老年代发生GC的频率要远远低于在新生代的GC频率。对象从老年代被释放,我们称这个过程为**major GC**或**full GC**。 + +我们看下以下两个图表: +GC Area & Data Flow +以上图中**永久代(Permanent Generation)**被成为**方法区**,它用于存储class文件和运行时常量池。所以,这里的存储空间并不用于“收留”从老年代存活下来的对象。当GC可能会在这个区域发生,我们也把在这个区域发生的GC算作full GC。 + +有些人会有疑问:当老年代的对象需要引用新生代的对象,这时候会发生什么情况? + +为了处理这些情况,在老年代中会有个叫做**卡表(card table)**的东西,它是一个512字节的数据块。在老年代的对象需要引用新生代的对象时,会被记录到这里。然后,当新生代的GC执行时,这个**card table**会被检查以确定对象是否应该被GC处理,这样做可以防止对老年代的所有对象进行遍历。这个卡表使用一个被称为**写屏障**的装置进行管理,它可以让minor GC的性能更加高效,虽然它本身也需要一定的开销,但是整体的开销却是减少的。 +GC Area & Data Flow + +## 新生代(Composition of the Young Generation) + +为了深入理解GC,我们来看一下新生代。新生代被划分为3个区域空间: + * 一个伊甸园(One Eden Space) + * 两个幸存区 (Two Survivor spaces) + * +There are 3 spaces in total, two of which are Survivor spaces. The order of execution process of each space is as below: +The majority of newly created objects are located in the Eden space. +After one GC in the Eden space, the surviving objects are moved to one of the Survivor spaces. +After a GC in the Eden space, the objects are piled up into the Survivor space, where other surviving objects already exist. +Once a Survivor space is full, surviving objects are moved to the other Survivor space. Then, the Survivor space that is full will be changed to a state where there is no data at all. +The objects that survived these steps that have been repeated a number of times are moved to the old generation. +As you can see by checking these steps, one of the Survivor spaces must remain empty. If data exists in both Survivor spaces, or the usage is 0 for both spaces, then take that as a sign that something is wrong with your system. +The process of data piling up into the old generation through minor GCs can be shown as in the below chart: +Figure 3: Before & After a GC. +Figure 3: Before & After a GC. +Note that in HotSpot VM, two techniques are used for faster memory allocations. One is called "bump-the-pointer," and the other is called "TLABs (Thread-Local Allocation Buffers)." +Bump-the-pointer technique tracks the last object allocated to the Eden space. That object will be located on top of the Eden space. And if there is an object created afterwards, it checks only if the size of the object is suitable for the Eden space. If the said object seems right, it will be placed in the Eden space, and the new object goes on top. So, when new objects are created, only the lastly added object needs to be checked, which allows much faster memory allocations. However, it is a different story if we consider a multithreaded environment. To save objects used by multiple threads in the Eden space for Thread-Safe, an inevitable lock will occur and the performance will drop due to the lock-contention. TLABs is the solution to this problem in HotSpot VM. This allows each thread to have a small portion of its Eden space that corresponds to its own share. As each thread can only access to their own TLAB, even the bump-the-pointer technique will allow memory allocations without a lock. +This has been a quick overview of the GC in the young generation. You do not necessarily have to remember the two techniques that I have just mentioned. You will not go to jail for not knowing them. But please remember that after the objects are first created in the Eden space, and the long-surviving objects are moved to the old generation through the Survivor space. + + + +## 参考文档 +* 翻译自:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ \ No newline at end of file From 2376f1d821c55d9bff932d3c0d410d90eed92cc3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 11:59:05 +0800 Subject: [PATCH 017/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 0fdb2a1..f460aa5 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -31,14 +31,13 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对 为了深入理解GC,我们来看一下新生代。新生代被划分为3个区域空间: * 一个伊甸园(One Eden Space) - * 两个幸存区 (Two Survivor spaces) - * -There are 3 spaces in total, two of which are Survivor spaces. The order of execution process of each space is as below: -The majority of newly created objects are located in the Eden space. -After one GC in the Eden space, the surviving objects are moved to one of the Survivor spaces. -After a GC in the Eden space, the objects are piled up into the Survivor space, where other surviving objects already exist. -Once a Survivor space is full, surviving objects are moved to the other Survivor space. Then, the Survivor space that is full will be changed to a state where there is no data at all. -The objects that survived these steps that have been repeated a number of times are moved to the old generation. + * 两个幸存区 (Two Survivor Spaces) +这三个区域空间中,有两个是幸存区(Survivor Spaces)。每个区域空间的执行过程如下: + 1. 绝大多数新创建的对象都首先被分配到伊甸园(Eden Space)。 + 2. 当伊甸园的GC执行以后,存活下来的对象会被移动到其中一个幸存区(这个幸存区存放着之前存活下来的对象)。 + 3. 一旦幸存区满了以后,该幸存区存活下来的对象会移动到另外一个幸存区,然后该幸存区会重置为空状态。 + 4. 在多次幸存区的GC执行后而存活下来的对象会被移动到老年代。 + As you can see by checking these steps, one of the Survivor spaces must remain empty. If data exists in both Survivor spaces, or the usage is 0 for both spaces, then take that as a sign that something is wrong with your system. The process of data piling up into the old generation through minor GCs can be shown as in the below chart: Figure 3: Before & After a GC. From 4803623662a0e42b358caf7ac86c57ed6e90d8c9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 12:01:07 +0800 Subject: [PATCH 018/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index f460aa5..fe83e4b 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -30,9 +30,12 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对 ## 新生代(Composition of the Young Generation) 为了深入理解GC,我们来看一下新生代。新生代被划分为3个区域空间: + * 一个伊甸园(One Eden Space) * 两个幸存区 (Two Survivor Spaces) + 这三个区域空间中,有两个是幸存区(Survivor Spaces)。每个区域空间的执行过程如下: + 1. 绝大多数新创建的对象都首先被分配到伊甸园(Eden Space)。 2. 当伊甸园的GC执行以后,存活下来的对象会被移动到其中一个幸存区(这个幸存区存放着之前存活下来的对象)。 3. 一旦幸存区满了以后,该幸存区存活下来的对象会移动到另外一个幸存区,然后该幸存区会重置为空状态。 From 89fc55092a44293e8231e795fc6ad525ddd87100 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 12:01:51 +0800 Subject: [PATCH 019/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index fe83e4b..3fe12d3 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -10,8 +10,10 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对象设置为null或者调用System.gc()方法来**显式**地移除内存空间。将对象设置为null没有大不了的,当调用System.gc()方法却会大大地响应系统的性能(我们并不需要这样做)。 在Java中,开发者并不需要显式地在代码中释放内存,垃圾收集器会帮助我们找到不需要的对象并讲它们移除。垃圾收集器只所以被引入使用是基于以下两个假定前提: - 1. 大多数对象很快成为不可达状态; - 2. **老对象引用新对象**这种情况总是控制在很小的数量内。 + +1. 大多数对象很快成为不可达状态; +2. **老对象引用新对象**这种情况总是控制在很小的数量内。 + 这两个假定前提被成为**弱世代假说(Weak generational hypothesis)**,基于这个假设,在HotSpot虚拟机中,内存(切确地说是Java Heap)被分为两种:**新生代(Young Generation)**与**老年代(Old Generation)**。 新生代:绝大部分的新创建的对象都被分配到这里。由于大部分的对象很快会成为不可达状态,很多新创建的对象都分配到新生代,然后很快从这个区域被释放。对象从新生代被释放,我们称这个过程为**Minor GC**。 @@ -31,15 +33,15 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对 为了深入理解GC,我们来看一下新生代。新生代被划分为3个区域空间: - * 一个伊甸园(One Eden Space) - * 两个幸存区 (Two Survivor Spaces) + * 一个伊甸园(One Eden Space) +* 两个幸存区 (Two Survivor Spaces) 这三个区域空间中,有两个是幸存区(Survivor Spaces)。每个区域空间的执行过程如下: - 1. 绝大多数新创建的对象都首先被分配到伊甸园(Eden Space)。 - 2. 当伊甸园的GC执行以后,存活下来的对象会被移动到其中一个幸存区(这个幸存区存放着之前存活下来的对象)。 - 3. 一旦幸存区满了以后,该幸存区存活下来的对象会移动到另外一个幸存区,然后该幸存区会重置为空状态。 - 4. 在多次幸存区的GC执行后而存活下来的对象会被移动到老年代。 +1. 绝大多数新创建的对象都首先被分配到伊甸园(Eden Space)。 +2. 当伊甸园的GC执行以后,存活下来的对象会被移动到其中一个幸存区(这个幸存区存放着之前存活下来的对象)。 +3. 一旦幸存区满了以后,该幸存区存活下来的对象会移动到另外一个幸存区,然后该幸存区会重置为空状态。 +4. 在多次幸存区的GC执行后而存活下来的对象会被移动到老年代。 As you can see by checking these steps, one of the Survivor spaces must remain empty. If data exists in both Survivor spaces, or the usage is 0 for both spaces, then take that as a sign that something is wrong with your system. The process of data piling up into the old generation through minor GCs can be shown as in the below chart: From 9eb37647245357b55582658645e13f73dad1fd23 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 12:02:40 +0800 Subject: [PATCH 020/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 3fe12d3..bbc27fd 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -21,12 +21,15 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对 老年代:当在新生代的对象没有成为不可达状态,并且从新生代存活下来后,我们会将这些对象复制到老年代。老年代的储存空间会比新生代的要大,所以在老年代发生GC的频率要远远低于在新生代的GC频率。对象从老年代被释放,我们称这个过程为**major GC**或**full GC**。 我们看下以下两个图表: + GC Area & Data Flow + 以上图中**永久代(Permanent Generation)**被成为**方法区**,它用于存储class文件和运行时常量池。所以,这里的存储空间并不用于“收留”从老年代存活下来的对象。当GC可能会在这个区域发生,我们也把在这个区域发生的GC算作full GC。 有些人会有疑问:当老年代的对象需要引用新生代的对象,这时候会发生什么情况? 为了处理这些情况,在老年代中会有个叫做**卡表(card table)**的东西,它是一个512字节的数据块。在老年代的对象需要引用新生代的对象时,会被记录到这里。然后,当新生代的GC执行时,这个**card table**会被检查以确定对象是否应该被GC处理,这样做可以防止对老年代的所有对象进行遍历。这个卡表使用一个被称为**写屏障**的装置进行管理,它可以让minor GC的性能更加高效,虽然它本身也需要一定的开销,但是整体的开销却是减少的。 + GC Area & Data Flow ## 新生代(Composition of the Young Generation) From 75c4dba691dd62e2174588f25d4fbbb00084bfd6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 12:03:24 +0800 Subject: [PATCH 021/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index bbc27fd..5204ae0 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -36,8 +36,8 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对 为了深入理解GC,我们来看一下新生代。新生代被划分为3个区域空间: - * 一个伊甸园(One Eden Space) -* 两个幸存区 (Two Survivor Spaces) +* 一个伊甸园(One Eden Space) +* 两个幸存区 (Two Survivor Spaces) 这三个区域空间中,有两个是幸存区(Survivor Spaces)。每个区域空间的执行过程如下: From 431fe3e0d0c9d961a106e7a43ea57c78c46b21c1 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 14:25:17 +0800 Subject: [PATCH 022/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 50 ++++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 5204ae0..8ca0704 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -46,15 +46,53 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对 3. 一旦幸存区满了以后,该幸存区存活下来的对象会移动到另外一个幸存区,然后该幸存区会重置为空状态。 4. 在多次幸存区的GC执行后而存活下来的对象会被移动到老年代。 -As you can see by checking these steps, one of the Survivor spaces must remain empty. If data exists in both Survivor spaces, or the usage is 0 for both spaces, then take that as a sign that something is wrong with your system. -The process of data piling up into the old generation through minor GCs can be shown as in the below chart: -Figure 3: Before & After a GC. -Figure 3: Before & After a GC. -Note that in HotSpot VM, two techniques are used for faster memory allocations. One is called "bump-the-pointer," and the other is called "TLABs (Thread-Local Allocation Buffers)." +在这个过程中,其中一个幸存区必须要保持为空状态。如果两个幸存区都是空状态或者都同时存在数据,你的系统一定出现了什么错误。 + +数据通过minor GC并堆砌进入老年代的过程如下图所示: + +Before & After a GC. + +在HotSpot虚拟机中,有两项被用于快速分配内存的技术。一种被成为**bump-the-pointer**,而另一种是所谓的线程局部缓冲器TLABs (Thread-Local Allocation Buffers)。 + Bump-the-pointer technique tracks the last object allocated to the Eden space. That object will be located on top of the Eden space. And if there is an object created afterwards, it checks only if the size of the object is suitable for the Eden space. If the said object seems right, it will be placed in the Eden space, and the new object goes on top. So, when new objects are created, only the lastly added object needs to be checked, which allows much faster memory allocations. However, it is a different story if we consider a multithreaded environment. To save objects used by multiple threads in the Eden space for Thread-Safe, an inevitable lock will occur and the performance will drop due to the lock-contention. TLABs is the solution to this problem in HotSpot VM. This allows each thread to have a small portion of its Eden space that corresponds to its own share. As each thread can only access to their own TLAB, even the bump-the-pointer technique will allow memory allocations without a lock. -This has been a quick overview of the GC in the young generation. You do not necessarily have to remember the two techniques that I have just mentioned. You will not go to jail for not knowing them. But please remember that after the objects are first created in the Eden space, and the long-surviving objects are moved to the old generation through the Survivor space. +你并不需要技术以上提到的两种技术。你需要记住的是:当对象创建之后会首先分配到伊甸园空间,然后通过在幸存区的长时间存活被晋升到老年代空间。 + +##老年代的GC(GC for the Old Generation) + +老年代基本在空间被沾满时才执行GC操作。GC的执行过程根据GC的类型不同而有所差异,如果你对不同的GC类型有所了解,则会明白其中的差异所在。 + +根据JDK7,共有5中GC类型: + +* Serial GC +* Parallel GC +* Parallel Old GC (Parrallel Compacting GC) +* Concurrent Mark & Sweep GC (or CMS) +* Garbage First GC (G1) + +其中,Serial GC不能应用于服务器上。这种GC通常在只有一个CPU内核的台式机器上才被创建 +其中,串行GC不能使用的操作的服务器上。这种类型的GC创建时有在台式计算机上只有一个CPU核心。使用该系列GC将显著删除应用程序的性能。 使用这种将很明显地降低应用程序的性能。 + +现在让我们来了解没种GC的类型: + +###串行GC( Serial GC (-XX:+UseSerialGC)) + +(The GC in the young generation uses the type we explained in the previous paragraph. ?) +在老年代中我们使用一种称为**标记-清除-紧凑(mark-sweep-compact)**的算法。 + +这种算法的第一步就是对老年代的幸存对象进行标记。然后,它从堆的从前往后逐个清理不需要的对象。最后对幸存的对象进行紧凑,使它们在位于连续的内存空间。这个过程会将堆分为两部分:一部分有数据,一部分没数据。Serial GC适用于小的内存空间和少量的CPU核心的机器。 + +###并行GC (Parallel GC (-XX:+UseParallelGC)) + +Difference between the Serial GC and Parallel GC. + + 看上图,你可以清楚看到Serial GC与Parallel之间的差异。Serial GC仅使用一个线程去执行GC过程,而Parallel GC会使用多个线程去执行GC过程,因此,可得到更加优秀的性能。当机器拥有很大的内存和较多的CPU核心时,Paraller GC会表现得非常不错。Parallel GC也被称为**throughput GC**。 + +###Parallel Old GC + +###Concurrent Mark & Sweep GC (or CMS) +###Garbage First GC (G1) ## 参考文档 * 翻译自:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ \ No newline at end of file From 9be2e2d4901b8f381408be13b166b0527e3b67e9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 16:28:47 +0800 Subject: [PATCH 023/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 8ca0704..caa8bd0 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -90,9 +90,32 @@ Bump-the-pointer technique tracks the last object allocated to the Eden space. T ###Parallel Old GC +Parallel Old GC从JDK 5 update版本开始得到支持。相比Parallel GC,唯一的区别在于:Parallel Old GC只工作于老年代。它通过三个步骤进行工作:标记-总结-紧凑。The summary step identifies the surviving objects separately for the areas that the GC have previously performed, and thus different from the sweep step of the mark-sweep-compact algorithm. It goes through a little more complicated steps. + ###Concurrent Mark & Sweep GC (or CMS) +Concurrent Mark & Sweep GC (or CMS) + +As you can see from the picture, the Concurrent Mark-Sweep GC is much more complicated than any other GC types that I have explained so far. The early initial mark step is simple. The surviving objects among the objects the closest to the classloader are searched. So, the pausing time is very short. In the concurrent mark step, the objects referenced by the surviving objects that have just been confirmed are tracked and checked. The difference of this step is that it proceeds while other threads are processed at the same time. In the remark step, the objects that were newly added or stopped being referenced in the concurrent mark step are checked. Lastly, in the concurrent sweep step, the garbage collection procedure takes place. The garbage collection is carried out while other threads are still being processed. Since this GC type is performed in this manner, the pausing time for GC is very short. The CMS GC is also called the low latency GC, and is used when the response time from all applications is crucial. +While this GC type has the advantage of short stop-the-world time, it also has the following disadvantages. +It uses more memory and CPU than other GC types. +The compaction step is not provided by default. +You need to carefully review before using this type. Also, if the compaction task needs to be carried out because of the many memory fragments, the stop-the-world time can be longer than any other GC types. You need to check how often and how long the compaction task is carried out. + ###Garbage First GC (G1) + + + +Finally, let's learn about the garbage first (G1) GC. +Figure 6: Layout of G1 GC. +Figure 6: Layout of G1 GC. +If you want to understand G1 GC, forget everything you know about the young generation and the old generation. As you can see in the picture, one object is allocated to each grid, and then a GC is executed. Then, once one area is full, the objects are allocated to another area, and then a GC is executed. The steps where the data moves from the three spaces of the young generation to the old generation cannot be found in this GC type. This type was created to replace the CMS GC, which has causes a lot of issues and complaints in the long term. +The biggest advantage of the G1 GC is its performance. It is faster than any other GC types that we have discussed so far. But in JDK 6, this is called an early access and can be used only for a test. It is officially included in JDK 7. In my personal opinion, we need to go through a long test period (at least 1 year) before NHN can use JDK7 in actual services, so you probably should wait a while. Also, I heard a few times that a JVM crash occurred after applying the G1 in JDK 6. Please wait until it is more stable. +I will talk about the GC tuning in the next issue, but I would like to ask you one thing in advance. If the size and the type of all objects created in the application are identical, all the GC options for WAS used in our company can be the same. But the size and the lifespan of the objects created by WAS vary depending on the service, and the type of equipment varies as well. In other words, just because a certain service uses the GC option "A," it does not mean that the same option will bring the best results for a different service. It is necessary to find the best values for the WAS threads, WAS instances for each equipment and each GC option by constant tuning and monitoring. This did not come from my personal experience, but from the discussion of the engineers making Oracle JVM for JavaOne 2010. +In this issue, we have only glanced at the GC for Java. Please look forward to our next issue, where I will talk about how to monitor the Java GC status and tune GC. +I would like to note that I referred to a new book released in December 2011 called "Java Performance" (Amazon, it can also be viewed from safari online, if the company provides an account), as well as “Memory Management in the Java HotSpotTM Virtual Machine,” a white paper provided by the Oracle website. (The book is different from "Java Performance Tuning.") +By Sangmin Lee, Senior Engineer at Performance Engineering Lab, NHN Corporation. + ## 参考文档 * 翻译自:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ \ No newline at end of file From fd36cbc638772690286185e6cc5c1dcc158236d2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 17:01:48 +0800 Subject: [PATCH 024/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index caa8bd0..004d983 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -96,11 +96,15 @@ Parallel Old GC从JDK 5 update版本开始得到支持。相比Parallel GC,唯 Concurrent Mark & Sweep GC (or CMS) -As you can see from the picture, the Concurrent Mark-Sweep GC is much more complicated than any other GC types that I have explained so far. The early initial mark step is simple. The surviving objects among the objects the closest to the classloader are searched. So, the pausing time is very short. In the concurrent mark step, the objects referenced by the surviving objects that have just been confirmed are tracked and checked. The difference of this step is that it proceeds while other threads are processed at the same time. In the remark step, the objects that were newly added or stopped being referenced in the concurrent mark step are checked. Lastly, in the concurrent sweep step, the garbage collection procedure takes place. The garbage collection is carried out while other threads are still being processed. Since this GC type is performed in this manner, the pausing time for GC is very short. The CMS GC is also called the low latency GC, and is used when the response time from all applications is crucial. -While this GC type has the advantage of short stop-the-world time, it also has the following disadvantages. -It uses more memory and CPU than other GC types. -The compaction step is not provided by default. -You need to carefully review before using this type. Also, if the compaction task needs to be carried out because of the many memory fragments, the stop-the-world time can be longer than any other GC types. You need to check how often and how long the compaction task is carried out. + 如你上图所看的,Concurrent Mark-Sweep GC比之前介绍的几种GC都要复杂得多。早期的**初始标记阶**段很简单,它的主要功能是最接近根类加载器的对象进行标记,这个阶段的停顿时间十分短暂。在**并发标记**阶段,对刚刚幸存下来的对象的引用进行跟踪和检查,这个过程中,其他的JVM线程不会被中止(也就是没有stop-the-world)。在**重新标记**阶段,会对**并发标记**阶段新添加或停止的引用进行确认。最后,在**并发清除**阶段,对不可达对象进行清理工作(也就GC动作),这个过程,其他的JVM线程也不会被中止。由于这种GC工作方式,GC的停顿时间非常短暂。CMS GC也被称为**低延迟GC**,这对那些对响应时间有严格要求的应用程序是至关重要的。 + +虽然这种GC垃圾收集的停顿时间非常短暂,但是他对内存大小和CPU内核数量与性能有着更高的要求。 +虽然这种GC类型具有极其短暂的停顿时间,但它也有以下缺点: + +* 对内存和CPU的要求更加高。 +* 不提供默认的内存紧凑步骤 + +在使用这种GC之前,你需要仔细地review。此外,在内存紧凑阶段,如果存在大量的内存碎片,那么这种GC需要停顿时间可能会比其他的GC类型的要长。你需要仔细检查内存紧凑发生的频率和时间。 ###Garbage First GC (G1) From ecd1c9cc59376a9548878ae6a3639906bfea7994 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 29 Aug 2014 17:24:36 +0800 Subject: [PATCH 025/524] Published with https://stackedit.io/ --- 31.Understanding Java Garbage Collection.md | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 004d983..6aecb19 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -108,18 +108,13 @@ Parallel Old GC从JDK 5 update版本开始得到支持。相比Parallel GC,唯 ###Garbage First GC (G1) - - - -Finally, let's learn about the garbage first (G1) GC. -Figure 6: Layout of G1 GC. -Figure 6: Layout of G1 GC. -If you want to understand G1 GC, forget everything you know about the young generation and the old generation. As you can see in the picture, one object is allocated to each grid, and then a GC is executed. Then, once one area is full, the objects are allocated to another area, and then a GC is executed. The steps where the data moves from the three spaces of the young generation to the old generation cannot be found in this GC type. This type was created to replace the CMS GC, which has causes a lot of issues and complaints in the long term. -The biggest advantage of the G1 GC is its performance. It is faster than any other GC types that we have discussed so far. But in JDK 6, this is called an early access and can be used only for a test. It is officially included in JDK 7. In my personal opinion, we need to go through a long test period (at least 1 year) before NHN can use JDK7 in actual services, so you probably should wait a while. Also, I heard a few times that a JVM crash occurred after applying the G1 in JDK 6. Please wait until it is more stable. -I will talk about the GC tuning in the next issue, but I would like to ask you one thing in advance. If the size and the type of all objects created in the application are identical, all the GC options for WAS used in our company can be the same. But the size and the lifespan of the objects created by WAS vary depending on the service, and the type of equipment varies as well. In other words, just because a certain service uses the GC option "A," it does not mean that the same option will bring the best results for a different service. It is necessary to find the best values for the WAS threads, WAS instances for each equipment and each GC option by constant tuning and monitoring. This did not come from my personal experience, but from the discussion of the engineers making Oracle JVM for JavaOne 2010. -In this issue, we have only glanced at the GC for Java. Please look forward to our next issue, where I will talk about how to monitor the Java GC status and tune GC. -I would like to note that I referred to a new book released in December 2011 called "Java Performance" (Amazon, it can also be viewed from safari online, if the company provides an account), as well as “Memory Management in the Java HotSpotTM Virtual Machine,” a white paper provided by the Oracle website. (The book is different from "Java Performance Tuning.") -By Sangmin Lee, Senior Engineer at Performance Engineering Lab, NHN Corporation. +最后,让我们来看下Garbage First GC(G1) + +Layout of G1 GC. + +如果你想要了解G1 GC,首先你要忘记关于新生代和老年代的一切知识点。Java堆(新生代&老年代)被划分为一个个大小固定的区域,对象被分派到这些区域中,如果一个区域被占满,则继续分配另外的区域,同时在后台维护一个优先列表,每次在允许的GC时间内,优先回收占用内存多的对象,这是就G1的来源。 + +待续... ## 参考文档 * 翻译自:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ \ No newline at end of file From e9973c98740ad66aa7c6af2a63dba2dfaac902dd Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 09:05:54 +0800 Subject: [PATCH 026/524] Create 1.md --- 31.Java-NIO/1.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 31.Java-NIO/1.md diff --git a/31.Java-NIO/1.md b/31.Java-NIO/1.md new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/31.Java-NIO/1.md @@ -0,0 +1 @@ +test From bb9f9078432ccfbe22dc3e7d4a9ba0f6a7a70ff2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 09:14:07 +0800 Subject: [PATCH 027/524] Delete 1.md --- 31.Java-NIO/1.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 31.Java-NIO/1.md diff --git a/31.Java-NIO/1.md b/31.Java-NIO/1.md deleted file mode 100644 index 9daeafb..0000000 --- a/31.Java-NIO/1.md +++ /dev/null @@ -1 +0,0 @@ -test From 47af7e22375ac228ec764c4b8826e78fb2b2b31f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 09:20:03 +0800 Subject: [PATCH 028/524] Create README.md --- Java-NIO/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Java-NIO/README.md diff --git a/Java-NIO/README.md b/Java-NIO/README.md new file mode 100644 index 0000000..2fc852e --- /dev/null +++ b/Java-NIO/README.md @@ -0,0 +1 @@ +#Java NIO From 3c0d15a69b3595fcfc54a70cf049c282aba31172 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 09:21:03 +0800 Subject: [PATCH 029/524] Update README.md --- Java-NIO/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Java-NIO/README.md b/Java-NIO/README.md index 2fc852e..13df960 100644 --- a/Java-NIO/README.md +++ b/Java-NIO/README.md @@ -1 +1,3 @@ #Java NIO + +翻译自:http://tutorials.jenkov.com/java-nio/index.html From 0c6b76fb9a9b4ec4b841ebfae4739158512c5912 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:14:58 +0800 Subject: [PATCH 030/524] Published with https://stackedit.io/ --- Java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Java diff --git a/Java b/Java new file mode 100644 index 0000000..8f75dd7 --- /dev/null +++ b/Java @@ -0,0 +1,15 @@ +#01.Java NIO教程 + +Java NIO(New IO)是一个可以替代标准IO的IO API,这意味着,它可以替代标准IO和Java Networking API。它提供了与标准IO不同的工作方式。 + +##通道和缓冲区(Channels and Buffers) + +在标准IO接口中,操作的对象是**字节流**和**字符流**。而在NIO中,操作的对象则是**通道(Channels)**和**缓冲区(Buffers)**。数据总是从通道中读取到缓冲区,或从缓冲区写入到通道。 + +##非阻塞IO(Non-blocking IO) + +Java NIO提供了非阻塞IO。举个例子,线程可以让通道读取数据到缓冲区中,当通道读取数据到缓冲区时,线程可以不必等待操作的完成,就可以去处理其他操作。从缓冲区写入到通道也类似。 + +##选择器( Selectors) + +Java NIO引入了**选择器(Selectors)**的概念。一个选择器可以监听多个通道的时间(例如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。 From c3ecfd216a3fec1fdf2eced103f1a8aa95ac2fa0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:15:15 +0800 Subject: [PATCH 031/524] Published with https://stackedit.io/ From 53342702004478860a4d358c1eef59c97c466e2a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:15:47 +0800 Subject: [PATCH 032/524] Published with https://stackedit.io/ --- "Java-NIO/01.Java NIO\346\225\231\347\250\213.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 "Java-NIO/01.Java NIO\346\225\231\347\250\213.md" diff --git "a/Java-NIO/01.Java NIO\346\225\231\347\250\213.md" "b/Java-NIO/01.Java NIO\346\225\231\347\250\213.md" new file mode 100644 index 0000000..8f75dd7 --- /dev/null +++ "b/Java-NIO/01.Java NIO\346\225\231\347\250\213.md" @@ -0,0 +1,15 @@ +#01.Java NIO教程 + +Java NIO(New IO)是一个可以替代标准IO的IO API,这意味着,它可以替代标准IO和Java Networking API。它提供了与标准IO不同的工作方式。 + +##通道和缓冲区(Channels and Buffers) + +在标准IO接口中,操作的对象是**字节流**和**字符流**。而在NIO中,操作的对象则是**通道(Channels)**和**缓冲区(Buffers)**。数据总是从通道中读取到缓冲区,或从缓冲区写入到通道。 + +##非阻塞IO(Non-blocking IO) + +Java NIO提供了非阻塞IO。举个例子,线程可以让通道读取数据到缓冲区中,当通道读取数据到缓冲区时,线程可以不必等待操作的完成,就可以去处理其他操作。从缓冲区写入到通道也类似。 + +##选择器( Selectors) + +Java NIO引入了**选择器(Selectors)**的概念。一个选择器可以监听多个通道的时间(例如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。 From e71eadabae00a9f0f1a6fb52bccc00b7fc7f2d71 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:16:39 +0800 Subject: [PATCH 033/524] Delete Java --- Java | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 Java diff --git a/Java b/Java deleted file mode 100644 index 8f75dd7..0000000 --- a/Java +++ /dev/null @@ -1,15 +0,0 @@ -#01.Java NIO教程 - -Java NIO(New IO)是一个可以替代标准IO的IO API,这意味着,它可以替代标准IO和Java Networking API。它提供了与标准IO不同的工作方式。 - -##通道和缓冲区(Channels and Buffers) - -在标准IO接口中,操作的对象是**字节流**和**字符流**。而在NIO中,操作的对象则是**通道(Channels)**和**缓冲区(Buffers)**。数据总是从通道中读取到缓冲区,或从缓冲区写入到通道。 - -##非阻塞IO(Non-blocking IO) - -Java NIO提供了非阻塞IO。举个例子,线程可以让通道读取数据到缓冲区中,当通道读取数据到缓冲区时,线程可以不必等待操作的完成,就可以去处理其他操作。从缓冲区写入到通道也类似。 - -##选择器( Selectors) - -Java NIO引入了**选择器(Selectors)**的概念。一个选择器可以监听多个通道的时间(例如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。 From 90defce24e491bc17ffdeb3d26dc843f2422e27f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:17:48 +0800 Subject: [PATCH 034/524] Published with https://stackedit.io/ --- .../02.Java NIO\346\246\202\350\247\210.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 "Java-NIO/02.Java NIO\346\246\202\350\247\210.md" diff --git "a/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" "b/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" new file mode 100644 index 0000000..2d460a4 --- /dev/null +++ "b/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" @@ -0,0 +1,47 @@ +#02.Java NIO Overview + +Java NIO consist of the following core components: + +Channels +Buffers +Selectors +Java NIO has more classes and components than these, but the Channel, Buffer and Selector forms the core of the API, in my opinion. The rest of the components, like Pipe and FileLock are merely utility classes to be used in conjunction with the three core components. Therefore, I'll focus on these three components in this NIO overview. The other components are explained in their own texts elsewhere in this tutorial. See the menu at the top corner of this page. + +Channels and Buffers + +Typically, all IO in NIO starts with a Channel. A Channel is a bit like a stream. From the Channel data can be read into a Buffer. Data can also be written from a Buffer into a Channel. Here is an illustration of that: + +Java NIO: Channels and Buffers +Java NIO: Channels read data into Buffers, and Buffers write data into Channels +There are several Channel and Buffer types. Here is a list of the primary Channel implementations in Java NIO: + +FileChannel +DatagramChannel +SocketChannel +ServerSocketChannel +As you can see, these channels cover UDP + TCP network IO, and file IO. + +There are a few interesting interfaces accompanying these classes too, but I'll keep them out of this Java NIO overview for simplicity's sake. They'll be explained where relevant, in other texts of this Java NIO tutorial. + +Here is a list of the core Buffer implementations in Java NIO: + +ByteBuffer +CharBuffer +DoubleBuffer +FloatBuffer +IntBuffer +LongBuffer +ShortBuffer +These Buffer's cover the basic data types that you can send via IO: byte, short, int, long, float, double and characters. + +Java NIO also has a MappedByteBuffer which is used in conjunction with memory mapped files. I'll leave this Buffer out of this overview though. + +Selectors + +A Selector allows a single thread to handle multiple Channel's. This is handy if your application has many connections (Channels) open, but only has low traffic on each connection. For instance, in a chat server. + +Here is an illustration of a thread using a Selector to handle 3 Channel's: + +Java NIO: Selectors +Java NIO: A Thread uses a Selector to handle 3 Channel's +To use a Selector you register the Channel's with it. Then you call it's select() method. This method will block until there is an event ready for one of the registered channels. Once the method returns, the thread can then process these events. Examples of events are incoming connection, data received etc. \ No newline at end of file From 56b3fe6d294c75ff88812b51ac020a6b89fe5b5c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:33:56 +0800 Subject: [PATCH 035/524] add images --- Java-NIO/images/overview-channels-buffers.png | Bin 0 -> 9174 bytes Java-NIO/images/overview-selectors.png | Bin 0 -> 9016 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Java-NIO/images/overview-channels-buffers.png create mode 100644 Java-NIO/images/overview-selectors.png diff --git a/Java-NIO/images/overview-channels-buffers.png b/Java-NIO/images/overview-channels-buffers.png new file mode 100644 index 0000000000000000000000000000000000000000..ad738090f13531b8654184cd90e33258282f0dfd GIT binary patch literal 9174 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 literal 0 HcmV?d00001 diff --git a/Java-NIO/images/overview-selectors.png b/Java-NIO/images/overview-selectors.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c075784a6fba1c33b50b585770468f75fe06db GIT binary patch literal 9016 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 Hy$=3AfS}yZ literal 0 HcmV?d00001 From 3037890857b8f4f5e48317754b5763f0b8362373 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:43:48 +0800 Subject: [PATCH 036/524] Published with https://stackedit.io/ --- .../02.Java NIO\346\246\202\350\247\210.md" | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git "a/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" "b/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" index 2d460a4..bac97a1 100644 --- "a/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" +++ "b/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" @@ -1,42 +1,45 @@ -#02.Java NIO Overview +#02.Java NIO概览 -Java NIO consist of the following core components: +Java NIO包括以下核心组件: + + * 通道(Channels) + * 缓冲区(Buffers) + * 选择器(Selectors) -Channels -Buffers -Selectors -Java NIO has more classes and components than these, but the Channel, Buffer and Selector forms the core of the API, in my opinion. The rest of the components, like Pipe and FileLock are merely utility classes to be used in conjunction with the three core components. Therefore, I'll focus on these three components in this NIO overview. The other components are explained in their own texts elsewhere in this tutorial. See the menu at the top corner of this page. +Java NIO包含许多类和组件,但是**通道(Channels)**,**缓冲区(Buffers)**和**选择器(Selectors)**是其中最核心的接口。其他的组件,例如**管道(Pipe)**和文件锁**(FileLock)**只是为这三个核心组件服务的工具类。 -Channels and Buffers +##通道和缓冲区(Channels and Buffers) -Typically, all IO in NIO starts with a Channel. A Channel is a bit like a stream. From the Channel data can be read into a Buffer. Data can also be written from a Buffer into a Channel. Here is an illustration of that: +通常情况下,在NIO中的所有IO都起始于**通道(Channels)**。通道有点类似于**流**。来自通道的数据可以读取到缓冲区中,同样地,也可以从缓存区中写入数据到通道,如下图所示: -Java NIO: Channels and Buffers -Java NIO: Channels read data into Buffers, and Buffers write data into Channels -There are several Channel and Buffer types. Here is a list of the primary Channel implementations in Java NIO: +Java NIO: Channels read data into Buffers, and Buffers write data into Channels
+ -FileChannel -DatagramChannel -SocketChannel -ServerSocketChannel -As you can see, these channels cover UDP + TCP network IO, and file IO. +Java NIO中有很多Channel和Buffer实现。以下是Java NIO中最主要的Channel的实现类; -There are a few interesting interfaces accompanying these classes too, but I'll keep them out of this Java NIO overview for simplicity's sake. They'll be explained where relevant, in other texts of this Java NIO tutorial. +* FileChannel +* DatagramChannel +* SocketChannel +* ServerSocketChannel -Here is a list of the core Buffer implementations in Java NIO: +正如你所见,这些通道覆盖了UDP、TCP和文件IO。 -ByteBuffer -CharBuffer -DoubleBuffer -FloatBuffer -IntBuffer -LongBuffer -ShortBuffer -These Buffer's cover the basic data types that you can send via IO: byte, short, int, long, float, double and characters. +以下是Java NIO中最主要的Buffer的实现类: + +* ByteBuffer +* CharBuffer +* ShortBuffer +* IntBuffer +* LongBuffer +* FloatBuffer +* DoubleBuffer + +以上的缓冲区实现类覆盖了你能通过IO发送的全部基本类型数据数据。Java NIO也提供了一个叫MappedByteBuffer的Buffer实现类,它用于跟内存映射文件交互。 + +##选择器(Selectors) -Java NIO also has a MappedByteBuffer which is used in conjunction with memory mapped files. I'll leave this Buffer out of this overview though. -Selectors A Selector allows a single thread to handle multiple Channel's. This is handy if your application has many connections (Channels) open, but only has low traffic on each connection. For instance, in a chat server. From c974507daaaec748d7463bdd3fa749db568b0e35 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:55:33 +0800 Subject: [PATCH 037/524] Published with https://stackedit.io/ --- .../02.Java NIO\346\246\202\350\247\210.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" "b/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" index bac97a1..27327bb 100644 --- "a/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" +++ "b/Java-NIO/02.Java NIO\346\246\202\350\247\210.md" @@ -2,9 +2,9 @@ Java NIO包括以下核心组件: - * 通道(Channels) - * 缓冲区(Buffers) - * 选择器(Selectors) +* 通道(Channels) +* 缓冲区(Buffers) +* 选择器(Selectors) Java NIO包含许多类和组件,但是**通道(Channels)**,**缓冲区(Buffers)**和**选择器(Selectors)**是其中最核心的接口。其他的组件,例如**管道(Pipe)**和文件锁**(FileLock)**只是为这三个核心组件服务的工具类。 @@ -39,12 +39,12 @@ Java NIO中有很多Channel和Buffer实现。以下是Java NIO中最主要的Cha ##选择器(Selectors) +选择器允许使用一个线程来操作多个通道。这对于那些有大量网络连接但传输的数据量非常少的应用来说是非常方便有利的,例如聊天服务器。 +下面的示图描述了一个线程使用选择器来处理三个通道: -A Selector allows a single thread to handle multiple Channel's. This is handy if your application has many connections (Channels) open, but only has low traffic on each connection. For instance, in a chat server. - -Here is an illustration of a thread using a Selector to handle 3 Channel's: +A Thread uses a Selector to handle 3 Channel's
+ -Java NIO: Selectors -Java NIO: A Thread uses a Selector to handle 3 Channel's -To use a Selector you register the Channel's with it. Then you call it's select() method. This method will block until there is an event ready for one of the registered channels. Once the method returns, the thread can then process these events. Examples of events are incoming connection, data received etc. \ No newline at end of file +当你需要使用选择器时,你需要使用它向通道进行注册(register)。然后调用选择器的`select()`方法。这个方法会阻塞直至其中一个通道的事件就绪。一旦方法返回后,线程就可以对事件进行处理。这些事件包括:网路连接,接收数据等等。 \ No newline at end of file From 402839c60f6bcd427accaf74b93dd1e84218f74b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 10:59:18 +0800 Subject: [PATCH 038/524] Published with https://stackedit.io/ --- .../03. Java NIO \351\200\232\351\201\223.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 "Java-NIO/03. Java NIO \351\200\232\351\201\223.md" diff --git "a/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" "b/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" new file mode 100644 index 0000000..cb2267a --- /dev/null +++ "b/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" @@ -0,0 +1,54 @@ +#03. Java NIO 通道 + +Java NIO Channels are similar to streams with a few differences: + +You can both read and write to a Channels. Streams are typically one-way (read or write). +Channels can be read and written asynchronously. +Channels always read to, or write from, a Buffer. +As mentioned above, you read data from a channel into a buffer, and write data from a buffer into a channel. Here is an illustration of that: + +Java NIO: Channels and Buffers +Java NIO: Channels read data into Buffers, and Buffers write data into Channels +Channel Implementations + +Here are the most important Channel implementations in Java NIO: + +FileChannel +DatagramChannel +SocketChannel +ServerSocketChannel +The FileChannel reads data from and to files. + +The DatagramChannel can read and write data over the network via UDP. + +The SocketChannel can read and write data over the network via TCP. + +The ServerSocketChannel allows you to listen for incoming TCP connections, like a web server does. For each incoming connection a SocketChannel is created. + +Basic Channel Example + +Here is a basic example that uses a FileChannel to read some data into a Buffer: + +```Java +RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); +FileChannel inChannel = aFile.getChannel(); + +ByteBuffer buf = ByteBuffer.allocate(48); + +int bytesRead = inChannel.read(buf); +while (bytesRead != -1) { + + System.out.println("Read " + bytesRead); + buf.flip(); + + while(buf.hasRemaining()){ + System.out.print((char) buf.get()); + } + + buf.clear(); + bytesRead = inChannel.read(buf); +} +aFile.close(); +``` + +Notice the buf.flip() call. First you read into a Buffer. Then you flip it. Then you read out of it. I'll get into more detail about that in the next text about Buffer's. \ No newline at end of file From 5840f1dc21d4d5a95a5cf5df8782844d02d4358c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:10:10 +0800 Subject: [PATCH 039/524] Published with https://stackedit.io/ --- "Java-NIO/03. Java NIO \351\200\232\351\201\223.md" | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git "a/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" "b/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" index cb2267a..c0831f3 100644 --- "a/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" +++ "b/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" @@ -1,5 +1,15 @@ #03. Java NIO 通道 +Java NIO的通道(Channels)类似与标准IO中的**流(Stream)**,它们之间的区别在于: + +* 你可以从管道中读取或写入数据(双向),但是流只能是读取或写入(单向)。 +* 通道可以进行异步(Asynchonously)操作。 +* 通道(Channel)总是从缓冲区(Buffers)中读取或写入数据。 + +如上面所提到的,数据总是从管道中读取到缓冲区,后从缓冲区中写入到通道。如下图所示: + +![Java NIO: Channels read data into Buffers, and Buffers write data into Channels](images/overview-channels-buffers.png) + Java NIO Channels are similar to streams with a few differences: You can both read and write to a Channels. Streams are typically one-way (read or write). From 572f4d4fb9a0f9216466e1e7d0e562b2583ad8bb Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:19:16 +0800 Subject: [PATCH 040/524] Published with https://stackedit.io/ --- .../03. Java NIO \351\200\232\351\201\223.md" | 38 +++++-------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git "a/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" "b/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" index c0831f3..30b4e53 100644 --- "a/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" +++ "b/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" @@ -1,6 +1,6 @@ #03. Java NIO 通道 -Java NIO的通道(Channels)类似与标准IO中的**流(Stream)**,它们之间的区别在于: +Java NIO的**通道(Channels)**类似与标准IO中的**流(Stream)**,它们之间的区别在于: * 你可以从管道中读取或写入数据(双向),但是流只能是读取或写入(单向)。 * 通道可以进行异步(Asynchonously)操作。 @@ -10,34 +10,16 @@ Java NIO的通道(Channels)类似与标准IO中的**流(Stream)**,它 ![Java NIO: Channels read data into Buffers, and Buffers write data into Channels](images/overview-channels-buffers.png) -Java NIO Channels are similar to streams with a few differences: + 以下是Java NIO中Chanel的最重要的实现类: -You can both read and write to a Channels. Streams are typically one-way (read or write). -Channels can be read and written asynchronously. -Channels always read to, or write from, a Buffer. -As mentioned above, you read data from a channel into a buffer, and write data from a buffer into a channel. Here is an illustration of that: +* FileChannel:从文件中读取或写入数据 +* DatagramChannel:从UPD中读取或写入数据 +* SocketChannel:从TCP中读取或写入数据 +* ServerSocketChannel:用于监听TCP连接,每接收一个连接就创建一个`SocketChannel` -Java NIO: Channels and Buffers -Java NIO: Channels read data into Buffers, and Buffers write data into Channels -Channel Implementations +##Channel例子(Basic Channel Example) -Here are the most important Channel implementations in Java NIO: - -FileChannel -DatagramChannel -SocketChannel -ServerSocketChannel -The FileChannel reads data from and to files. - -The DatagramChannel can read and write data over the network via UDP. - -The SocketChannel can read and write data over the network via TCP. - -The ServerSocketChannel allows you to listen for incoming TCP connections, like a web server does. For each incoming connection a SocketChannel is created. - -Basic Channel Example - -Here is a basic example that uses a FileChannel to read some data into a Buffer: +以下的代码示例演示了从FileChannel读取数据到Buffer中: ```Java RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); @@ -60,5 +42,5 @@ while (bytesRead != -1) { } aFile.close(); ``` - -Notice the buf.flip() call. First you read into a Buffer. Then you flip it. Then you read out of it. I'll get into more detail about that in the next text about Buffer's. \ No newline at end of file + +注意`buf.flip`的调用。当你写入数据到Buffer后,需要调用这个方法,然后才能从Buffer中读取数据。 \ No newline at end of file From c92e426cbe7bfa35b9c050e76b2ee6848ad432da Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:19:56 +0800 Subject: [PATCH 041/524] =?UTF-8?q?Rename=2003.=20Java=20NIO=20=E9=80=9A?= =?UTF-8?q?=E9=81=93.md=20to=2003.=20Java=20NIO=E9=80=9A=E9=81=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03. Java NIO\351\200\232\351\201\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename "Java-NIO/03. Java NIO \351\200\232\351\201\223.md" => "Java-NIO/03. Java NIO\351\200\232\351\201\223.md" (96%) diff --git "a/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" "b/Java-NIO/03. Java NIO\351\200\232\351\201\223.md" similarity index 96% rename from "Java-NIO/03. Java NIO \351\200\232\351\201\223.md" rename to "Java-NIO/03. Java NIO\351\200\232\351\201\223.md" index 30b4e53..90f6b20 100644 --- "a/Java-NIO/03. Java NIO \351\200\232\351\201\223.md" +++ "b/Java-NIO/03. Java NIO\351\200\232\351\201\223.md" @@ -43,4 +43,4 @@ while (bytesRead != -1) { aFile.close(); ``` -注意`buf.flip`的调用。当你写入数据到Buffer后,需要调用这个方法,然后才能从Buffer中读取数据。 \ No newline at end of file +注意`buf.flip`的调用。当你写入数据到Buffer后,需要调用这个方法,然后才能从Buffer中读取数据。 From e6afa2995e762ccf507214b5dee394d445389325 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:20:37 +0800 Subject: [PATCH 042/524] =?UTF-8?q?Update=2003.=20Java=20NIO=E9=80=9A?= =?UTF-8?q?=E9=81=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "Java-NIO/03. Java NIO\351\200\232\351\201\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-NIO/03. Java NIO\351\200\232\351\201\223.md" "b/Java-NIO/03. Java NIO\351\200\232\351\201\223.md" index 90f6b20..291e3f3 100644 --- "a/Java-NIO/03. Java NIO\351\200\232\351\201\223.md" +++ "b/Java-NIO/03. Java NIO\351\200\232\351\201\223.md" @@ -1,4 +1,4 @@ -#03. Java NIO 通道 +#03. Java NIO通道 Java NIO的**通道(Channels)**类似与标准IO中的**流(Stream)**,它们之间的区别在于: From 17172a3704285181ebb43546efd694fa841b05d6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:20:53 +0800 Subject: [PATCH 043/524] =?UTF-8?q?Rename=2003.=20Java=20NIO=E9=80=9A?= =?UTF-8?q?=E9=81=93.md=20to=2003.Java=20NIO=E9=80=9A=E9=81=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03.Java NIO\351\200\232\351\201\223.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "Java-NIO/03. Java NIO\351\200\232\351\201\223.md" => "Java-NIO/03.Java NIO\351\200\232\351\201\223.md" (100%) diff --git "a/Java-NIO/03. Java NIO\351\200\232\351\201\223.md" "b/Java-NIO/03.Java NIO\351\200\232\351\201\223.md" similarity index 100% rename from "Java-NIO/03. Java NIO\351\200\232\351\201\223.md" rename to "Java-NIO/03.Java NIO\351\200\232\351\201\223.md" From e3be549e221c8ca5ecdf3eb8873f5ce54aca2f4a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:22:31 +0800 Subject: [PATCH 044/524] Published with https://stackedit.io/ --- ...IO\347\274\223\345\206\262\345\214\272.md" | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 "Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" new file mode 100644 index 0000000..c7bd206 --- /dev/null +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -0,0 +1,173 @@ +#04.Java NIO Buffer + +Java NIO Buffers are used when interacting with NIO Channels. As you know, data is read from channels into buffers, and written from buffers into channels. + +A buffer is essentially a block of memory into which you can write data, which you can then later read again. This memory block is wrapped in a NIO Buffer object, which provides a set of methods that makes it easier to work with the memory block. + +Basic Buffer Usage + +Using a Buffer to read and write data typically follows this little 4-step process: + +Write data into the Buffer +Call buffer.flip() +Read data out of the Buffer +Call buffer.clear() or buffer.compact() +When you write data into a buffer, the buffer keeps track of how much data you have written. Once you need to read the data, you need to switch the buffer from writing mode into reading mode using the flip() method call. In reading mode the buffer lets you read all the data written into the buffer. + +Once you have read all the data, you need to clear the buffer, to make it ready for writing again. You can do this in two ways: By calling clear() or by calling compact(). The clear() method clears the whole buffer. The compact() method only clears the data which you have already read. Any unread data is moved to the beginning of the buffer, and data will now be written into the buffer after the unread data. + +Here is a simple Buffer usage example, with the write, flip, read and clear operations maked in bold: + +RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); +FileChannel inChannel = aFile.getChannel(); + +//create buffer with capacity of 48 bytes +ByteBuffer buf = ByteBuffer.allocate(48); + +int bytesRead = inChannel.read(buf); //read into buffer. +while (bytesRead != -1) { + + buf.flip(); //make buffer ready for read + + while(buf.hasRemaining()){ + System.out.print((char) buf.get()); // read 1 byte at a time + } + + buf.clear(); //make buffer ready for writing + bytesRead = inChannel.read(buf); +} +aFile.close(); +Buffer Capacity, Position and Limit + +A buffer is essentially a block of memory into which you can write data, which you can then later read again. This memory block is wrapped in a NIO Buffer object, which provides a set of methods that makes it easier to work with the memory block. + +A Buffer has three properties you need to be familiar with, in order to understand how a Buffer works. These are: + +capacity +position +limit +The meaning of position and limit depends on whether the Buffer is in read or write mode. Capacity always means the same, no matter the buffer mode. + +Here is an illustration of capacity, position and limit in write and read modes. The explanation follows in the sections after the illustration. + +Java NIO: Buffer capacity, position and limit in write and read mode. +Buffer capacity, position and limit in write and read mode. +Capacity + +Being a memory block, a Buffer has a certain fixed size, also called its "capacity". You can only write capacity bytes, longs, chars etc. into the Buffer. Once the Buffer is full, you need to empty it (read the data, or clear it) before you can write more data into it. + +Position + +When you write data into the Buffer, you do so at a certain position. Initially the position is 0. When a byte, long etc. has been written into the Buffer the position is advanced to point to the next cell in the buffer to insert data into. Position can maximally become capacity - 1. + +When you read data from a Buffer you also do so from a given position. When you flip a Buffer from writing mode to reading mode, the position is reset back to 0. As you read data from the Buffer you do so from position, and position is advanced to next position to read. + +Limit + +In write mode the limit of a Buffer is the limit of how much data you can write into the buffer. In write mode the limit is equal to the capacity of the Buffer. + +When flipping the Buffer into read mode, limit means the limit of how much data you can read from the data. Therefore, when flipping a Buffer into read mode, limit is set to write position of the write mode. In other words, you can read as many bytes as were written (limit is set to the number of bytes written, which is marked by position). + +Buffer Types + +Java NIO comes with the following Buffer types: + +ByteBuffer +MappedByteBuffer +CharBuffer +DoubleBuffer +FloatBuffer +IntBuffer +LongBuffer +ShortBuffer +As you can see, these Buffer types represent different data types. In other words, they let you work with the bytes in the buffer as char, short, int, long, float or double instead. + +The MappedByteBuffer is a bit special, and will be covered in its own text. + +Allocating a Buffer + +To obtain a Buffer object you must first allocate it. Every Buffer class has an allocate() method that does this. Here is an example showing the allocation of a ByteBuffer, with a capacity of 48 bytes: + +ByteBuffer buf = ByteBuffer.allocate(48); +Here is an example allocating a CharBuffer with space for 1024 characters: + +CharBuffer buf = CharBuffer.allocate(1024); +Writing Data to a Buffer + +You can write data into a Buffer in two ways: + +Write data from a Channel into a Buffer +Write data into the Buffer yourself, via the buffer's put() methods. +Here is an example showing how a Channel can write data into a Buffer: + +int bytesRead = inChannel.read(buf); //read into buffer. +Here is an example that writes data into a Buffer via the put() method: + +buf.put(127); +There are many other versions of the put() method, allowing you to write data into the Buffer in many different ways. For instance, writing at specific positions, or writing an array of bytes into the buffer. See the JavaDoc for the concrete buffer implementation for more details. + +flip() + +The flip() method switches a Buffer from writing mode to reading mode. Calling flip() sets the position back to 0, and sets the limit to where position just was. + +In other words, position now marks the reading position, and limit marks how many bytes, chars etc. were written into the buffer - the limit of how many bytes, chars etc. that can be read. + +Reading Data from a Buffer + +There are two ways you can read data from a Buffer. + +Read data from the buffer into a channel. +Read data from the buffer yourself, using one of the get() methods. +Here is an example of how you can read data from a buffer into a channel: + +//read from buffer into channel. +int bytesWritten = inChannel.write(buf); +Here is an example that reads data from a Buffer using the get() method: + +byte aByte = buf.get(); +There are many other versions of the get() method, allowing you to read data from the Buffer in many different ways. For instance, reading at specific positions, or reading an array of bytes from the buffer. See the JavaDoc for the concrete buffer implementation for more details. + +rewind() + +The Buffer.rewind() sets the position back to 0, so you can reread all the data in the buffer. The limit remains untouched, thus still marking how many elements (bytes, chars etc.) that can be read from the Buffer. + +clear() and compact() + +Once you are done reading data out of the Buffer you have to make the Buffer ready for writing again. You can do so either by calling clear() or by calling compact(). + +If you call clear() the position is set back to 0 and the limit to capacity. In other words, the Buffer is cleared. The data in the Buffer is not cleared. Only the markers telling where you can write data into the Buffer are. + +If there is any unread data in the Buffer when you call clear() that data will be "forgotten", meaning you no longer have any markers telling what data has been read, and what has not been read. + +If there is still unread data in the Buffer, and you want to read it later, but you need to do some writing first, call compact() instead of clear(). + +compact() copies all unread data to the beginning of the Buffer. Then it sets position to right after the last unread element. The limit property is still set to capacity, just like clear() does. Now the Buffer is ready for writing, but you will not overwrite the unread data. + +mark() and reset() + +You can mark a given position in a Buffer by calling the Buffer.mark() method. You can then later reset the position back to the marked position by calling the Buffer.reset() method. Here is an example: + +buffer.mark(); + +//call buffer.get() a couple of times, e.g. during parsing. + +buffer.reset(); //set position back to mark. +equals() and compareTo() + +It is possible to compare two buffers using equals() and compareTo(). + +equals() + +Two buffers are equal if: + +They are of the same type (byte, char, int etc.) +They have the same amount of remaining bytes, chars etc. in the buffer. +All remaining bytes, chars etc. are equal. +As you can see, equals only compares part of the Buffer, not every single element inside it. In fact, it just compares the remaining elements in the Buffer. + +compareTo() + +The compareTo() method compares the remaining elements (bytes, chars etc.) of the two buffers, for use in e.g. sorting routines. A buffer is considered "smaller" than another buffer if: + +The first element which is equal to the corresponding element in the other buffer, is smaller than that in the other buffer. +All elements are equal, but the first buffer runs out of elements before the second buffer does (it has fewer elements). \ No newline at end of file From 31a086952f5344caf49e811d427ba01356d6c946 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:22:53 +0800 Subject: [PATCH 045/524] Published with https://stackedit.io/ --- "Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index c7bd206..71582be 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -1,4 +1,4 @@ -#04.Java NIO Buffer +#04.Java NIO缓冲区 Java NIO Buffers are used when interacting with NIO Channels. As you know, data is read from channels into buffers, and written from buffers into channels. From aa8d8cfdc0848e1ee9f5e5af6c86f10d0b027438 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:22:31 +0800 Subject: [PATCH 046/524] add images --- Java-NIO/images/buffers-modes.png | Bin 0 -> 16208 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Java-NIO/images/buffers-modes.png diff --git a/Java-NIO/images/buffers-modes.png b/Java-NIO/images/buffers-modes.png new file mode 100644 index 0000000000000000000000000000000000000000..15a094ab4a75da555304a8d2e78f1d91fffeb447 GIT binary patch literal 16208 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 G1pYt2WYqrv literal 0 HcmV?d00001 From 21b5687d2b7d319241810f79cb187d3bc485a102 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 11:28:40 +0800 Subject: [PATCH 047/524] Published with https://stackedit.io/ --- .../04.Java NIO\347\274\223\345\206\262\345\214\272.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 71582be..c104bd1 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -1,5 +1,7 @@ #04.Java NIO缓冲区 +Java NIO中的**缓冲区(Buffers)**用于跟**通道(Channels)**交互时使用。如你所知,数据从通道中读取到缓冲区,或从缓冲区中写入到通道。 + Java NIO Buffers are used when interacting with NIO Channels. As you know, data is read from channels into buffers, and written from buffers into channels. A buffer is essentially a block of memory into which you can write data, which you can then later read again. This memory block is wrapped in a NIO Buffer object, which provides a set of methods that makes it easier to work with the memory block. @@ -37,12 +39,17 @@ while (bytesRead != -1) { bytesRead = inChannel.read(buf); } aFile.close(); + + +![Buffer capacity, position and limit in write and read mode.](http://tutorials.jenkov.com/images/java-nio/buffers-modes.png) + Buffer Capacity, Position and Limit A buffer is essentially a block of memory into which you can write data, which you can then later read again. This memory block is wrapped in a NIO Buffer object, which provides a set of methods that makes it easier to work with the memory block. A Buffer has three properties you need to be familiar with, in order to understand how a Buffer works. These are: + capacity position limit From 74cfbd07add1992d5b61d4547425c7b27e80df59 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 12:26:36 +0800 Subject: [PATCH 048/524] Published with https://stackedit.io/ --- ...va NIO\347\274\223\345\206\262\345\214\272.md" | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index c104bd1..8dd3a44 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -2,11 +2,20 @@ Java NIO中的**缓冲区(Buffers)**用于跟**通道(Channels)**交互时使用。如你所知,数据从通道中读取到缓冲区,或从缓冲区中写入到通道。 -Java NIO Buffers are used when interacting with NIO Channels. As you know, data is read from channels into buffers, and written from buffers into channels. +缓冲区本质上是一个内存块,在这个块中,你可以进行写入和读取操作。Java NIO将这个内存块用缓存区包装起来,并提供了一系列的用于操作这个内存块的API。 + +##缓冲区的基本用法(Basic Buffer Usage) + +利用缓冲区读写数据通常遵循这个小4个步骤: + +* 写入数据到缓冲区; +* 调用buffer.flip()方法; +* 从缓冲区中读取数据; +* 调用buffer.clear()或buffer.compact()方法。 + +当你往缓冲区写入数据的时候,缓冲区会跟踪记录你写入的数据量。当你需要缓冲区读取数据时,你需要调用**`flip()`**方法将缓冲区从**写入模式**切换为**读取模式**。在读取模式中,你可以读取之前往缓冲区写入的所有数据。 -A buffer is essentially a block of memory into which you can write data, which you can then later read again. This memory block is wrapped in a NIO Buffer object, which provides a set of methods that makes it easier to work with the memory block. -Basic Buffer Usage Using a Buffer to read and write data typically follows this little 4-step process: From 3c44efde4e7b83f9002e1f19f2395f2460bd4ee7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 12:33:47 +0800 Subject: [PATCH 049/524] Published with https://stackedit.io/ --- ....Java NIO\347\274\223\345\206\262\345\214\272.md" | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 8dd3a44..6230621 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -13,17 +13,9 @@ Java NIO中的**缓冲区(Buffers)**用于跟**通道(Channels)**交互 * 从缓冲区中读取数据; * 调用buffer.clear()或buffer.compact()方法。 -当你往缓冲区写入数据的时候,缓冲区会跟踪记录你写入的数据量。当你需要缓冲区读取数据时,你需要调用**`flip()`**方法将缓冲区从**写入模式**切换为**读取模式**。在读取模式中,你可以读取之前往缓冲区写入的所有数据。 +当你往缓冲区写入数据的时候,缓冲区会跟踪记录你写入的数据量。当你需要缓冲区读取数据时,你需要调用`flip()`方法将缓冲区从**写入模式**切换为**读取模式**。在读取模式中,你可以读取之前往缓冲区写入的所有数据。 - - -Using a Buffer to read and write data typically follows this little 4-step process: - -Write data into the Buffer -Call buffer.flip() -Read data out of the Buffer -Call buffer.clear() or buffer.compact() -When you write data into a buffer, the buffer keeps track of how much data you have written. Once you need to read the data, you need to switch the buffer from writing mode into reading mode using the flip() method call. In reading mode the buffer lets you read all the data written into the buffer. +当你读取完数据之后,你需要清空缓冲区,以便可以写入数据。你可以通过两种方式来完成:调用`clear()`或`compact()`方法。__`clear()`方法会清空整个缓冲区的数据。而`compact()`方法只会清空已经读取过的数据,尚未读取过的数据会被移动到缓冲区的前端,以便下次读取。__ Once you have read all the data, you need to clear the buffer, to make it ready for writing again. You can do this in two ways: By calling clear() or by calling compact(). The clear() method clears the whole buffer. The compact() method only clears the data which you have already read. Any unread data is moved to the beginning of the buffer, and data will now be written into the buffer after the unread data. From 04c4dc970b86af5674465c5d5fc3a14ee456f165 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 15:38:17 +0800 Subject: [PATCH 050/524] Published with https://stackedit.io/ --- ...4.Java NIO\347\274\223\345\206\262\345\214\272.md" | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 6230621..afb3537 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -15,12 +15,11 @@ Java NIO中的**缓冲区(Buffers)**用于跟**通道(Channels)**交互 当你往缓冲区写入数据的时候,缓冲区会跟踪记录你写入的数据量。当你需要缓冲区读取数据时,你需要调用`flip()`方法将缓冲区从**写入模式**切换为**读取模式**。在读取模式中,你可以读取之前往缓冲区写入的所有数据。 -当你读取完数据之后,你需要清空缓冲区,以便可以写入数据。你可以通过两种方式来完成:调用`clear()`或`compact()`方法。__`clear()`方法会清空整个缓冲区的数据。而`compact()`方法只会清空已经读取过的数据,尚未读取过的数据会被移动到缓冲区的前端,以便下次读取。__ +当你读取完数据之后,你需要清空缓冲区,以便可以写入数据。你可以通过两种方式来完成:调用`clear()`或`compact()`方法。__`clear()`方法会清空整个缓冲区的数据。而`compact()`方法只会清空已经读取过的数据,尚未读取过的数据会被移动到缓冲区的前端,以便下次继续读取。__ -Once you have read all the data, you need to clear the buffer, to make it ready for writing again. You can do this in two ways: By calling clear() or by calling compact(). The clear() method clears the whole buffer. The compact() method only clears the data which you have already read. Any unread data is moved to the beginning of the buffer, and data will now be written into the buffer after the unread data. - -Here is a simple Buffer usage example, with the write, flip, read and clear operations maked in bold: +简单示例: +```Java RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); @@ -40,9 +39,9 @@ while (bytesRead != -1) { bytesRead = inChannel.read(buf); } aFile.close(); +``` - -![Buffer capacity, position and limit in write and read mode.](http://tutorials.jenkov.com/images/java-nio/buffers-modes.png) +![Buffer capacity, position and limit in write and read mode.](images/java-nio/buffers-modes.png) Buffer Capacity, Position and Limit From a15cfb955bf9e1d4428bded4e739fd15e7f3e004 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 16:09:40 +0800 Subject: [PATCH 051/524] Published with https://stackedit.io/ --- ...IO\347\274\223\345\206\262\345\214\272.md" | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index afb3537..c6b4667 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -41,52 +41,51 @@ while (bytesRead != -1) { aFile.close(); ``` -![Buffer capacity, position and limit in write and read mode.](images/java-nio/buffers-modes.png) +##Capacity, Position和Limit -Buffer Capacity, Position and Limit +缓冲区本质上是一个内存块,在这个块中,你可以进行写入和读取操作。Java NIO将这个内存块用缓存区包装起来,并提供了一系列的用于操作这个内存块的API。 + +如果你想知道缓冲区是如何工作的,那么你需要理解缓冲区的三个属性,它们分别是: + +* 容量(Capacity) +* 位置(Position) +* 极限(Limit) -A buffer is essentially a block of memory into which you can write data, which you can then later read again. This memory block is wrapped in a NIO Buffer object, which provides a set of methods that makes it easier to work with the memory block. -A Buffer has three properties you need to be familiar with, in order to understand how a Buffer works. These are: +**position**和**limit**在读取模式/写入模式中具有不同的含义。而**capacity**在任何情况都具有同一含义:**缓冲区的容量大小。** +下面这个图描绘了capacity,position和limit在读取模式和写入模式中的含义: -capacity -position -limit -The meaning of position and limit depends on whether the Buffer is in read or write mode. Capacity always means the same, no matter the buffer mode. +![Java NIO: Buffer capacity, position and limit in write and read mode.](http://tutorials.jenkov.com/images/java-nio/buffers-modes.png) -Here is an illustration of capacity, position and limit in write and read modes. The explanation follows in the sections after the illustration. +###Capacity -Java NIO: Buffer capacity, position and limit in write and read mode. -Buffer capacity, position and limit in write and read mode. -Capacity +做为一个内存块,缓冲区有固定的大小,称之为:**容量(capcity)**。你只能往缓冲区中写入固定大小的bytes,long,chars等类型数据。一旦缓冲区慢后,你需要清空它(读取数据或clear())才能继续写入数据。 -Being a memory block, a Buffer has a certain fixed size, also called its "capacity". You can only write capacity bytes, longs, chars etc. into the Buffer. Once the Buffer is full, you need to empty it (read the data, or clear it) before you can write more data into it. +###Position -Position +当你往缓冲区写入数据时,实际上你是往缓冲区中的指定的位置写入数据。这个位置初始值为0,当往缓冲区写入数据时,position会指向下一个可写入的内存单元。postion的最大值为capacity-1。 -When you write data into the Buffer, you do so at a certain position. Initially the position is 0. When a byte, long etc. has been written into the Buffer the position is advanced to point to the next cell in the buffer to insert data into. Position can maximally become capacity - 1. +当你从缓冲区读取数据时,你同样的是从position指定的位置读取数据。当你调用`flip()`方法使缓冲区由**写入模式**切换成**读取模式**后,position会重置为0。当从position指定单元读数据后,postion会移至下一个可读取单元。 -When you read data from a Buffer you also do so from a given position. When you flip a Buffer from writing mode to reading mode, the position is reset back to 0. As you read data from the Buffer you do so from position, and position is advanced to next position to read. +###Limit -Limit +在**写入模式**中,limit指定的是能写入数据量的大小。在写入模式中,limit的值等于capacity的值。 -In write mode the limit of a Buffer is the limit of how much data you can write into the buffer. In write mode the limit is equal to the capacity of the Buffer. +当调用`flip()`方法使缓冲区切换成**读取模式**后,limit会重置为你能读取的数据量的大小。因此,在调用`flip()`方法后,limit重置为position的值,而position重置为0。 -When flipping the Buffer into read mode, limit means the limit of how much data you can read from the data. Therefore, when flipping a Buffer into read mode, limit is set to write position of the write mode. In other words, you can read as many bytes as were written (limit is set to the number of bytes written, which is marked by position). +##Buffer Types -Buffer Types +Java NIO提供了一下缓冲区类型: -Java NIO comes with the following Buffer types: +* ByteBuffer +* MappedByteBuffer +* ShortBuffer +* IntBuffer +* LongBuffer +* FloatBuffer +* DoubleBuffer -ByteBuffer -MappedByteBuffer -CharBuffer -DoubleBuffer -FloatBuffer -IntBuffer -LongBuffer -ShortBuffer As you can see, these Buffer types represent different data types. In other words, they let you work with the bytes in the buffer as char, short, int, long, float or double instead. The MappedByteBuffer is a bit special, and will be covered in its own text. From 66b4908a2879fe4e830fdc614b113faddc3b8c32 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 16:11:05 +0800 Subject: [PATCH 052/524] Published with https://stackedit.io/ --- ...a NIO\347\274\223\345\206\262\345\214\272.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index c6b4667..faa64bd 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -90,7 +90,7 @@ As you can see, these Buffer types represent different data types. In other word The MappedByteBuffer is a bit special, and will be covered in its own text. -Allocating a Buffer +###Allocating a Buffer To obtain a Buffer object you must first allocate it. Every Buffer class has an allocate() method that does this. Here is an example showing the allocation of a ByteBuffer, with a capacity of 48 bytes: @@ -98,7 +98,7 @@ ByteBuffer buf = ByteBuffer.allocate(48); Here is an example allocating a CharBuffer with space for 1024 characters: CharBuffer buf = CharBuffer.allocate(1024); -Writing Data to a Buffer +###Writing Data to a Buffer You can write data into a Buffer in two ways: @@ -112,7 +112,7 @@ Here is an example that writes data into a Buffer via the put() method: buf.put(127); There are many other versions of the put() method, allowing you to write data into the Buffer in many different ways. For instance, writing at specific positions, or writing an array of bytes into the buffer. See the JavaDoc for the concrete buffer implementation for more details. -flip() +###flip() The flip() method switches a Buffer from writing mode to reading mode. Calling flip() sets the position back to 0, and sets the limit to where position just was. @@ -133,11 +133,11 @@ Here is an example that reads data from a Buffer using the get() method: byte aByte = buf.get(); There are many other versions of the get() method, allowing you to read data from the Buffer in many different ways. For instance, reading at specific positions, or reading an array of bytes from the buffer. See the JavaDoc for the concrete buffer implementation for more details. -rewind() +###rewind() The Buffer.rewind() sets the position back to 0, so you can reread all the data in the buffer. The limit remains untouched, thus still marking how many elements (bytes, chars etc.) that can be read from the Buffer. -clear() and compact() +###clear() and compact() Once you are done reading data out of the Buffer you have to make the Buffer ready for writing again. You can do so either by calling clear() or by calling compact(). @@ -149,7 +149,7 @@ If there is still unread data in the Buffer, and you want to read it later, but compact() copies all unread data to the beginning of the Buffer. Then it sets position to right after the last unread element. The limit property is still set to capacity, just like clear() does. Now the Buffer is ready for writing, but you will not overwrite the unread data. -mark() and reset() +###mark() and reset() You can mark a given position in a Buffer by calling the Buffer.mark() method. You can then later reset the position back to the marked position by calling the Buffer.reset() method. Here is an example: @@ -162,7 +162,7 @@ equals() and compareTo() It is possible to compare two buffers using equals() and compareTo(). -equals() +###equals() Two buffers are equal if: @@ -171,7 +171,7 @@ They have the same amount of remaining bytes, chars etc. in the buffer. All remaining bytes, chars etc. are equal. As you can see, equals only compares part of the Buffer, not every single element inside it. In fact, it just compares the remaining elements in the Buffer. -compareTo() +###compareTo() The compareTo() method compares the remaining elements (bytes, chars etc.) of the two buffers, for use in e.g. sorting routines. A buffer is considered "smaller" than another buffer if: From 072e10e7387d16509de4666cb37aafcd0b40f496 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 16:13:26 +0800 Subject: [PATCH 053/524] Published with https://stackedit.io/ --- ...ava NIO\347\274\223\345\206\262\345\214\272.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index faa64bd..600359d 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -94,10 +94,16 @@ The MappedByteBuffer is a bit special, and will be covered in its own text. To obtain a Buffer object you must first allocate it. Every Buffer class has an allocate() method that does this. Here is an example showing the allocation of a ByteBuffer, with a capacity of 48 bytes: +```Java ByteBuffer buf = ByteBuffer.allocate(48); +``` + Here is an example allocating a CharBuffer with space for 1024 characters: +```Java CharBuffer buf = CharBuffer.allocate(1024); +``` + ###Writing Data to a Buffer You can write data into a Buffer in two ways: @@ -106,10 +112,13 @@ Write data from a Channel into a Buffer Write data into the Buffer yourself, via the buffer's put() methods. Here is an example showing how a Channel can write data into a Buffer: +```Java int bytesRead = inChannel.read(buf); //read into buffer. Here is an example that writes data into a Buffer via the put() method: buf.put(127); +``` + There are many other versions of the put() method, allowing you to write data into the Buffer in many different ways. For instance, writing at specific positions, or writing an array of bytes into the buffer. See the JavaDoc for the concrete buffer implementation for more details. ###flip() @@ -126,11 +135,14 @@ Read data from the buffer into a channel. Read data from the buffer yourself, using one of the get() methods. Here is an example of how you can read data from a buffer into a channel: +```Java //read from buffer into channel. int bytesWritten = inChannel.write(buf); Here is an example that reads data from a Buffer using the get() method: byte aByte = buf.get(); +``` + There are many other versions of the get() method, allowing you to read data from the Buffer in many different ways. For instance, reading at specific positions, or reading an array of bytes from the buffer. See the JavaDoc for the concrete buffer implementation for more details. ###rewind() @@ -153,12 +165,14 @@ compact() copies all unread data to the beginning of the Buffer. Then it sets po You can mark a given position in a Buffer by calling the Buffer.mark() method. You can then later reset the position back to the marked position by calling the Buffer.reset() method. Here is an example: +```Java buffer.mark(); //call buffer.get() a couple of times, e.g. during parsing. buffer.reset(); //set position back to mark. equals() and compareTo() +``` It is possible to compare two buffers using equals() and compareTo(). From 1575db25d1d57fe156135b1de56541c6357fca2a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 16:31:03 +0800 Subject: [PATCH 054/524] Published with https://stackedit.io/ --- ...IO\347\274\223\345\206\262\345\214\272.md" | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 600359d..aa19fa8 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -86,19 +86,15 @@ Java NIO提供了一下缓冲区类型: * FloatBuffer * DoubleBuffer -As you can see, these Buffer types represent different data types. In other words, they let you work with the bytes in the buffer as char, short, int, long, float or double instead. - -The MappedByteBuffer is a bit special, and will be covered in its own text. - ###Allocating a Buffer -To obtain a Buffer object you must first allocate it. Every Buffer class has an allocate() method that does this. Here is an example showing the allocation of a ByteBuffer, with a capacity of 48 bytes: +要获得缓冲区,你需要为它开辟空间。每一个缓冲区类都有一个`allocate()`方法用于开辟内存空间。下面这个代码示例显示了如何开辟48个字节的缓冲区。 ```Java ByteBuffer buf = ByteBuffer.allocate(48); ``` -Here is an example allocating a CharBuffer with space for 1024 characters: +下面的代码显示了如何开辟1024个字符的内存空间: ```Java CharBuffer buf = CharBuffer.allocate(1024); @@ -106,20 +102,24 @@ CharBuffer buf = CharBuffer.allocate(1024); ###Writing Data to a Buffer -You can write data into a Buffer in two ways: +你可以通过两种方式往缓冲区中写入数据: + +* 从通道中写入数据到缓冲区。 +* 通过缓冲区的`put()`方法直接往缓冲区写入数据。 -Write data from a Channel into a Buffer -Write data into the Buffer yourself, via the buffer's put() methods. -Here is an example showing how a Channel can write data into a Buffer: +下面的代码演示了从通道中写入数据到缓冲区: ```Java int bytesRead = inChannel.read(buf); //read into buffer. -Here is an example that writes data into a Buffer via the put() method: +``` + +下面的代码演示了通过`put()`方法直接往缓冲区写入数据: +```Java buf.put(127); ``` -There are many other versions of the put() method, allowing you to write data into the Buffer in many different ways. For instance, writing at specific positions, or writing an array of bytes into the buffer. See the JavaDoc for the concrete buffer implementation for more details. +有很多重载的`put`方法方便你往缓冲区写入数据。例如,将数据写入到指定位置,或者将字节数组写入缓冲区。具体的方法请查阅API。 ###flip() From c6c76840b759d57d650ec0639f6ebc84f109e678 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 4 Sep 2014 16:36:49 +0800 Subject: [PATCH 055/524] Published with https://stackedit.io/ --- Java-NIO/05.Java NIO Scatter, Gather.md | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Java-NIO/05.Java NIO Scatter, Gather.md diff --git a/Java-NIO/05.Java NIO Scatter, Gather.md b/Java-NIO/05.Java NIO Scatter, Gather.md new file mode 100644 index 0000000..66f3482 --- /dev/null +++ b/Java-NIO/05.Java NIO Scatter, Gather.md @@ -0,0 +1,47 @@ +#05.Java NIO Scatter, Gather + +Java NIO comes with built-in scatter / gather support. Scatter / gather are concepts used in reading from, and writing to channels. + +A scattering read from a channel is a read operation that reads data into more than one buffer. Thus, the channel "scatters" the data from the channel into multiple buffers. + +A gathering write to a channel is a write operation that writes data from more than one buffer into a single channel. Thus, the channel "gathers" the data from multiple buffers into one channel. + +Scatter / gather can be really useful in situations where you need to work with various parts of the transmitted data separately. For instance, if a message consists of a header and a body, you might keep the header and body in separate buffers. Doing so may make it easier for you to work with header and body separately. + +Scattering Reads + +A "scattering read" reads data from a single channel into multiple buffers. Here is an illustration of that principle: + +Here is an illustration of the Scatter principle: + +Java NIO: Scattering Read +Java NIO: Scattering Read +Here is a code example that shows how to perform a scattering read: + +ByteBuffer header = ByteBuffer.allocate(128); +ByteBuffer body = ByteBuffer.allocate(1024); + +ByteBuffer[] bufferArray = { header, body }; + +channel.read(buffers); +Notice how the buffers are first inserted into an array, then the array passed as parameter to the channel.read() method. The read() method then writes data from the channel in the sequence the buffers occur in the array. Once a buffer is full, the channel moves on to fill the next buffer. + +The fact that scattering reads fill up one buffer before moving on to the next, means that it is not suited for dynamically sized message parts. In other words, if you have a header and a body, and the header is fixed size (e.g. 128 bytes), then a scattering read works fine. + +Gathering Writes + +A "gathering write" writes data from multiple buffers into a single channel. Here is an illustration of that principle: + +Java NIO: Gathering Write +Java NIO: Gathering Write +Here is a code example that shows how to perform a gathering write: + +ByteBuffer header = ByteBuffer.allocate(128); +ByteBuffer body = ByteBuffer.allocate(1024); + +//write data into buffers + +ByteBuffer[] bufferArray = { header, body }; + +channel.write(buffers); +The array of buffers are passed into the write() method, which writes the content of the buffers in the sequence they are encountered in the array. Only the data between position and limit of the buffers is written. Thus, if a buffer has a capacity of 128 bytes, but only contains 58 bytes, only 58 bytes are written from that buffer to the channel. Thus, a gathering write works fine with dynamically sized message parts, in contrast to scattering reads. \ No newline at end of file From 4e04acbf1464acbb968a5e96ff7505dd4031449a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 14:12:33 +0800 Subject: [PATCH 056/524] Create README.md --- Java-Concurrency-Multithreading/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Java-Concurrency-Multithreading/README.md diff --git a/Java-Concurrency-Multithreading/README.md b/Java-Concurrency-Multithreading/README.md new file mode 100644 index 0000000..41cada4 --- /dev/null +++ b/Java-Concurrency-Multithreading/README.md @@ -0,0 +1 @@ + 翻译自:http://tutorials.jenkov.com/java-concurrency/index.html From 2e3a79297875fe1708267a41c3a582fab9650c87 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 14:15:18 +0800 Subject: [PATCH 057/524] Published with https://stackedit.io/ --- ...5\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" diff --git "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" new file mode 100644 index 0000000..5676619 --- /dev/null +++ "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" @@ -0,0 +1 @@ +# 01.Java 并发与多线程 \ No newline at end of file From 16146b93c345ca95a3f9293c699fd308670fe1e0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 14:16:08 +0800 Subject: [PATCH 058/524] Published with https://stackedit.io/ --- ...16\345\244\232\347\272\277\347\250\213.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" index 5676619..9b43d3f 100644 --- "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" @@ -1 +1,20 @@ -# 01.Java 并发与多线程 \ No newline at end of file +# 01.Java 并发与多线程 + +Back in the old days a computer had a single CPU, and was only capable of executing a single program at a time. Later came multitasking which meant that computers could execute multiple programs (AKA tasks or processes) at the same time. It wasn't really "at the same time" though. The single CPU was shared between the programs. The operating system would switch between the programs running, executing each of them for a little while before switching. + +Along with multitasking came new challenges for software developers. Programs can no longer assume to have all the CPU time available, nor all memory or any other computer resources. A "good citizen" program should release all resources it is no longer using, so other programs can use them. + +Later yet came multithreading which mean that you could have multiple threads of execution inside the same program. A thread of execution can be thought of as a CPU executing the program. When you have multiple threads executing the same program, it is like having multiple CPU's execute within the same program. + +Mulithreading is even more challenging than multitasking. The threads are executing within the same program and are hence reading and writing the same memory simultanously. This can result in errors not seen in a singlethreaded program. Some of these errors may not be seen on single CPU machines, because two threads never really execute "simultanously". Modern computers, though, come with multi core CPU's. This means that separate threads can be executed by separate cores simultanously. + +If a thread reads a memory location while another thread writes to it, what value will the first thread end up reading? The old value? The value written by the second thread? Or a value that is a mix between the two? Or, if two threads are writing to the same memory location simultanously, what value will be left when they are done? The value written by the first thread? The value written by the second thread? Or a mix of the two values written? Without proper precautions any of these outcomes are possible. The behaviour would not even be predictable. The outcome could change from time to time. + + +##Multithreading and Concurrency in Java + +Java was one of the first languages to make multithreading easily available to developers. Java had multithreading capabilities from the very beginning. Therefore, Java developers often face the problems described above. That is the reason I am writing this trail on Java concurrency. As notes to myself, and any fellow Java developer whom may benefit from it. + +The trail will primarily be concerned with multithreading in Java, but some of the problems occurring in multithreading are similar to problems occurring in multitasking and in distributed systems. References to multitasking and distributed systems may therefore occur in this trail too. Hence the word "concurrency" rather than "multithreading". + +This trail is still work in progress. Texts will be published whenver time is available to write them. Below is a list of the current texts in this trail. The list is also repeated at the top right of every page in the trail. \ No newline at end of file From 28d530d55e6b171e6ace3345e97c6c736fe83814 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 14:17:21 +0800 Subject: [PATCH 059/524] Published with https://stackedit.io/ --- ...72\277\347\250\213\347\232\204\345\245\275\345\244\204.md" | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" new file mode 100644 index 0000000..b920339 --- /dev/null +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -0,0 +1,4 @@ +#02.多线程的好处 + + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From 222d6d0a6fb9a8371996bed29c6f310f0bf0d710 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 15:02:22 +0800 Subject: [PATCH 060/524] Published with https://stackedit.io/ --- ...4\270\216\345\244\232\347\272\277\347\250\213.md" | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" index 9b43d3f..423d594 100644 --- "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" @@ -1,15 +1,19 @@ # 01.Java 并发与多线程 -Back in the old days a computer had a single CPU, and was only capable of executing a single program at a time. Later came multitasking which meant that computers could execute multiple programs (AKA tasks or processes) at the same time. It wasn't really "at the same time" though. The single CPU was shared between the programs. The operating system would switch between the programs running, executing each of them for a little while before switching. +在以前,一台计算机只有一个CPU,而且在同一时间只能执行一个应用程序。后来引入了多任务的概念,这意味着计算机能再同一时间内执行多个应用程序。虽然,这并不是真正意义上的“同时”。多个应用程序共享计算机的CPU,操作系统在极小的时间切片内对应用程序进行切换以获得CPU资源。 -Along with multitasking came new challenges for software developers. Programs can no longer assume to have all the CPU time available, nor all memory or any other computer resources. A "good citizen" program should release all resources it is no longer using, so other programs can use them. +多任务的引入对软件开发者带来的新的挑战。应用程序不再能占用所有的CPU时间和所有的内存以及其他计算机资源。同时,一个好的应用程序在退出之后应该释放所有的系统系统以供其它应用程序使用。 + +不久之后,多线程的概念被引入,这意味着,在一个应用程序中可以拥有多个执行线程。A thread of execution can be thought of as a CPU executing the program. 当一个应用程序有多个线程执行时,它就像拥有多个CPU在执行任务。 + +多线程比多任务带来的挑战更加巨大。多线程意味着,在一个应用程序内部,可以存在多个线程同时地对内存进行读写操作。它会出现一些在单线程中永远不会出现的错误。有些错误也许在单个CPU的计算机上也不会出现(因为在单个CPU的计算机上,两个线程永远不可能真正意义上的同时执行)。现代计算机,基本都拥有多个CPU内核,线程可以通过独占内核来实现真正意义上的并行。 -Later yet came multithreading which mean that you could have multiple threads of execution inside the same program. A thread of execution can be thought of as a CPU executing the program. When you have multiple threads executing the same program, it is like having multiple CPU's execute within the same program. -Mulithreading is even more challenging than multitasking. The threads are executing within the same program and are hence reading and writing the same memory simultanously. This can result in errors not seen in a singlethreaded program. Some of these errors may not be seen on single CPU machines, because two threads never really execute "simultanously". Modern computers, though, come with multi core CPU's. This means that separate threads can be executed by separate cores simultanously. If a thread reads a memory location while another thread writes to it, what value will the first thread end up reading? The old value? The value written by the second thread? Or a value that is a mix between the two? Or, if two threads are writing to the same memory location simultanously, what value will be left when they are done? The value written by the first thread? The value written by the second thread? Or a mix of the two values written? Without proper precautions any of these outcomes are possible. The behaviour would not even be predictable. The outcome could change from time to time. +如果一个线程读取内存位置,而另一个线程写入的话,会在第一个线程结束了什么价值看什么?旧的价值?写由所述第二线程的值?或者一个值,两者之间的混合?或者,如果两个线程都写入同一个存储位置simultanously,什么价值都做的时候,他们会留下?写的第一线程的值?写由所述第二线程的值?或两个值的组合写的?如果没有适当的预防措施,所有这些结果是可能的。行为甚至不会预测。其结果可能会改变,不时。 + ##Multithreading and Concurrency in Java From 392262a7dbb9ace79691639ef784e094eedad559 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 15:20:56 +0800 Subject: [PATCH 061/524] Published with https://stackedit.io/ --- ...21\344\270\216\345\244\232\347\272\277\347\250\213.md" | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" index 423d594..b024e2c 100644 --- "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" @@ -8,14 +8,10 @@ 多线程比多任务带来的挑战更加巨大。多线程意味着,在一个应用程序内部,可以存在多个线程同时地对内存进行读写操作。它会出现一些在单线程中永远不会出现的错误。有些错误也许在单个CPU的计算机上也不会出现(因为在单个CPU的计算机上,两个线程永远不可能真正意义上的同时执行)。现代计算机,基本都拥有多个CPU内核,线程可以通过独占内核来实现真正意义上的并行。 +如果一个线程往一块内存读取数据,而同时另一个线程往同样的地址写入数据,那么第一个线程读取的值是多少?原来的值?或是被第二个线程写入的值?或是两者混合的值?再举个例子,如果有两个线程同时往一块内存地址写入数据,那么这块内存最终的值是什么?第一个线程写入的值?还是第二个线程写入的值?还是两者的混合?如果没有恰当的预防措施,所有的这些结果都是可能的。线程的执行行为不能预测,所以最终的计算结果也跟着不同。 -If a thread reads a memory location while another thread writes to it, what value will the first thread end up reading? The old value? The value written by the second thread? Or a value that is a mix between the two? Or, if two threads are writing to the same memory location simultanously, what value will be left when they are done? The value written by the first thread? The value written by the second thread? Or a mix of the two values written? Without proper precautions any of these outcomes are possible. The behaviour would not even be predictable. The outcome could change from time to time. - -如果一个线程读取内存位置,而另一个线程写入的话,会在第一个线程结束了什么价值看什么?旧的价值?写由所述第二线程的值?或者一个值,两者之间的混合?或者,如果两个线程都写入同一个存储位置simultanously,什么价值都做的时候,他们会留下?写的第一线程的值?写由所述第二线程的值?或两个值的组合写的?如果没有适当的预防措施,所有这些结果是可能的。行为甚至不会预测。其结果可能会改变,不时。 - - -##Multithreading and Concurrency in Java +##Java的多线程与并发(Multithreading and Concurrency in Java) Java was one of the first languages to make multithreading easily available to developers. Java had multithreading capabilities from the very beginning. Therefore, Java developers often face the problems described above. That is the reason I am writing this trail on Java concurrency. As notes to myself, and any fellow Java developer whom may benefit from it. From 082c654481bd41ac8cbe03ffdffe4dd7e364547a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 15:43:19 +0800 Subject: [PATCH 062/524] Published with https://stackedit.io/ --- ...13\347\232\204\345\245\275\345\244\204.md" | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" index b920339..fc187e8 100644 --- "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -1,4 +1,62 @@ #02.多线程的好处 +尽管多线程带来的一些挑战,也让先写应用程序变得复杂,但它也带来了一系列好处: + +* 更好的资源利用率 +* 在某些情况下,让程序变得更加简单 +* More responsive programs + + +##更好的资源利用率(Better resource utilization) + +试想一下,一个读取和处理本地系统文件的应用程序。比方说,从磁盘读取AF文件需要5秒,处理需要2秒,处理两个文件过程如下: + +``` +读取文件A消耗5s +处理文件A消耗2s +读取文件B消耗5s +处理文件B消耗2s +------------- +总共消耗时间14s +``` + + + +When reading the file from disk most of the CPU time is spent waiting for the disk to read the data. The CPU is pretty much idle during that time. It could be doing something else. By changing the order of the operations, the CPU could be better utilized. Look at this ordering: + + 5 seconds reading file A + 5 seconds reading file B + 2 seconds processing file A + 2 seconds processing file B +----------------------- + 12 seconds total +The CPU waits for the first file to be read. Then it starts the read of the second file. While the second file is being read, the CPU processes the first file. Remember, while waiting for the file to be read from disk, the CPU is mostly idle. + +In general, the CPU can be doing other things while waiting for IO. It doesn't have to be disk IO. It can be network IO as well, or input from a user at the machine. Network and disk IO is often a lot slower than CPU's and memory IO. + + +Simpler Program Design + +If you were to program the above ordering of reading and processing by hand in a singlethreaded application, you would have to keep track of both the read and processing state of each file. Instead you can start two threads that each just reads and processes a single file. Each of these threads will be blocked while waiting for the disk to read its file. While waiting, other threads can use the CPU to process the parts of the file they have already read. The result is, that the disk is kept busy at all times, reading from various files into memory. This results in a better utilization of both the disk and the CPU. It is also easier to program, since each thread only has to keep track of a single file. + +More responsive programs + +Another common goal for turning a singlethreaded application into a multithreaded application is to achieve a more responsive application. Imagine a server application that listens on some port for incoming requests. when a request is received, it handles the request and then goes back to listening. The server loop is sketched below: + + + while(server is active){ + listen for request + process request + } +If the request takes a long time to process, no new clients can send requests to the server for that duration. Only while the server is listening can requests be received. + +An alternate design would be for the listening thread to pass the request to a worker thread, and return to listening immediatedly. The worker thread will process the request and send a reply to the client. This design is sketched below: + + + while(server is active){ + listen for request + hand request to worker thread + } +This way the server thread will be back at listening sooner. Thus more clients can send requests to the server. The server has become more responsive. + +The same is true for desktop applications. If you click a button that starts a long task, and the thread executing the task is the thread updating the windows, buttons etc., then the application will appear unresponsive while the task executes. Instead the task can be handed off to a worker thread. While the worker thread is busy with the task, the window thread is free to respond to other user requests. When the worker thread is done it signals the window thread. The window thread can then update the application windows with the result of the task. The program with the worker thread design will appear more responsive to the user. -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From d7289e5b020fb756e0129e3c463cb24f4d239ad6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 15:53:20 +0800 Subject: [PATCH 063/524] Published with https://stackedit.io/ --- ...13\347\232\204\345\245\275\345\244\204.md" | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" index fc187e8..a6ea4d9 100644 --- "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -20,25 +20,26 @@ 总共消耗时间14s ``` +当从磁盘读取文件时,大部分的CPU时间都消耗在了等待磁盘读取数据,而在这段时间内,CPU大部分时间内都是空闲的,它原本可以用来做其他操作。改变操作的顺序,可以让CPU得到更高的利用率。如下所示: +``` +读取文件A消耗5s +读取文件B消耗5s + 处理文件A消耗2s +处理文件B消耗2s +------------- +总共消耗时间12s +``` -When reading the file from disk most of the CPU time is spent waiting for the disk to read the data. The CPU is pretty much idle during that time. It could be doing something else. By changing the order of the operations, the CPU could be better utilized. Look at this ordering: - - 5 seconds reading file A - 5 seconds reading file B + 2 seconds processing file A - 2 seconds processing file B ------------------------ - 12 seconds total -The CPU waits for the first file to be read. Then it starts the read of the second file. While the second file is being read, the CPU processes the first file. Remember, while waiting for the file to be read from disk, the CPU is mostly idle. +当CPU读取往文件A后,则紧随着读取文件B,在此同时处理文件A。需要谨记的是,在等带磁盘读取文件时,CPU大部分时间都是空闲的。 -In general, the CPU can be doing other things while waiting for IO. It doesn't have to be disk IO. It can be network IO as well, or input from a user at the machine. Network and disk IO is often a lot slower than CPU's and memory IO. +一般来说,在CPU等待IO操作时可以处理其他任务。IO操作可以是磁盘IO,网络IO或者用户的输入。磁盘IO和网络IO远远慢于CPU IO和内存IO。 -Simpler Program Design +##Simpler Program Design If you were to program the above ordering of reading and processing by hand in a singlethreaded application, you would have to keep track of both the read and processing state of each file. Instead you can start two threads that each just reads and processes a single file. Each of these threads will be blocked while waiting for the disk to read its file. While waiting, other threads can use the CPU to process the parts of the file they have already read. The result is, that the disk is kept busy at all times, reading from various files into memory. This results in a better utilization of both the disk and the CPU. It is also easier to program, since each thread only has to keep track of a single file. -More responsive programs +##More responsive programs Another common goal for turning a singlethreaded application into a multithreaded application is to achieve a more responsive application. Imagine a server application that listens on some port for incoming requests. when a request is received, it handles the request and then goes back to listening. The server loop is sketched below: From 602bca8f596a4914c28f5a4b46017f51ea289348 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 15:55:20 +0800 Subject: [PATCH 064/524] Published with https://stackedit.io/ --- ...72\277\347\250\213\347\232\204\345\245\275\345\244\204.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" index a6ea4d9..87760e7 100644 --- "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -3,7 +3,7 @@ 尽管多线程带来的一些挑战,也让先写应用程序变得复杂,但它也带来了一系列好处: * 更好的资源利用率 -* 在某些情况下,让程序变得更加简单 +* 更简单的程序设计 * More responsive programs @@ -35,7 +35,7 @@ 一般来说,在CPU等待IO操作时可以处理其他任务。IO操作可以是磁盘IO,网络IO或者用户的输入。磁盘IO和网络IO远远慢于CPU IO和内存IO。 -##Simpler Program Design +##更简单的程序设计(Simpler Program Design) If you were to program the above ordering of reading and processing by hand in a singlethreaded application, you would have to keep track of both the read and processing state of each file. Instead you can start two threads that each just reads and processes a single file. Each of these threads will be blocked while waiting for the disk to read its file. While waiting, other threads can use the CPU to process the parts of the file they have already read. The result is, that the disk is kept busy at all times, reading from various files into memory. This results in a better utilization of both the disk and the CPU. It is also easier to program, since each thread only has to keep track of a single file. From 8fbb754b2387d980930d3e26f9149fa544de174b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 16:00:31 +0800 Subject: [PATCH 065/524] Published with https://stackedit.io/ --- ...47\250\213\347\232\204\345\245\275\345\244\204.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" index 87760e7..6c40b5c 100644 --- "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -43,11 +43,12 @@ If you were to program the above ordering of reading and processing by hand in a Another common goal for turning a singlethreaded application into a multithreaded application is to achieve a more responsive application. Imagine a server application that listens on some port for incoming requests. when a request is received, it handles the request and then goes back to listening. The server loop is sketched below: - - while(server is active){ - listen for request - process request - } +```Java +while(server is active){ + listen for request + process request +} +``` If the request takes a long time to process, no new clients can send requests to the server for that duration. Only while the server is listening can requests be received. An alternate design would be for the listening thread to pass the request to a worker thread, and return to listening immediatedly. The worker thread will process the request and send a reply to the client. This design is sketched below: From 1b20707681bfe7868df461593af7eb963e5d742e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 16:36:53 +0800 Subject: [PATCH 066/524] Published with https://stackedit.io/ --- ...13\347\232\204\345\245\275\345\244\204.md" | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" index 6c40b5c..091c3bc 100644 --- "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -39,9 +39,9 @@ If you were to program the above ordering of reading and processing by hand in a singlethreaded application, you would have to keep track of both the read and processing state of each file. Instead you can start two threads that each just reads and processes a single file. Each of these threads will be blocked while waiting for the disk to read its file. While waiting, other threads can use the CPU to process the parts of the file they have already read. The result is, that the disk is kept busy at all times, reading from various files into memory. This results in a better utilization of both the disk and the CPU. It is also easier to program, since each thread only has to keep track of a single file. -##More responsive programs +##更具响应性的程序(More responsive programs) -Another common goal for turning a singlethreaded application into a multithreaded application is to achieve a more responsive application. Imagine a server application that listens on some port for incoming requests. when a request is received, it handles the request and then goes back to listening. The server loop is sketched below: +把单线程应用转化为多线程应用的另一个目标就是实现更具有响应性的应用程序。试想一下,监听某个端口请求的服务器应用程序,当请求到达时,应用程序进行处理,然后返回继续监听。代码如下: ```Java while(server is active){ @@ -49,15 +49,23 @@ while(server is active){ process request } ``` -If the request takes a long time to process, no new clients can send requests to the server for that duration. Only while the server is listening can requests be received. + +如果请求需要很长的处理时间,在这段期间内,应用程序不能处理后续的请求,只有当应用程序处理请求返回监听状态,才能继续接收请求。 + + An alternate design would be for the listening thread to pass the request to a worker thread, and return to listening immediatedly. The worker thread will process the request and send a reply to the client. This design is sketched below: +另一种设计是在监听线程将请求传递给工作线程,并返回到听immediatedly。工作线程将处理该请求并发送到客户端的回复。这种设计勾勒如下: + - while(server is active){ - listen for request + ```Java +while(server is active){ + listen for request hand request to worker thread - } +} +``` + This way the server thread will be back at listening sooner. Thus more clients can send requests to the server. The server has become more responsive. The same is true for desktop applications. If you click a button that starts a long task, and the thread executing the task is the thread updating the windows, buttons etc., then the application will appear unresponsive while the task executes. Instead the task can be handed off to a worker thread. While the worker thread is busy with the task, the window thread is free to respond to other user requests. When the worker thread is done it signals the window thread. The window thread can then update the application windows with the result of the task. The program with the worker thread design will appear more responsive to the user. From 5779b287321faaa5c2e8080c293fa347c4845059 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 16:43:38 +0800 Subject: [PATCH 067/524] Published with https://stackedit.io/ --- ...47\250\213\347\232\204\345\245\275\345\244\204.md" | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" index 091c3bc..75e5cce 100644 --- "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -41,7 +41,7 @@ If you were to program the above ordering of reading and processing by hand in a ##更具响应性的程序(More responsive programs) -把单线程应用转化为多线程应用的另一个目标就是实现更具有响应性的应用程序。试想一下,监听某个端口请求的服务器应用程序,当请求到达时,应用程序进行处理,然后返回继续监听。代码如下: +把单线程应用转化为多线程应用的另一个目标就是实现更具有响应性的应用程序。试想一下,监听某个端口请求的服务器应用程序,当请求到达时,应用程序进行处理,然后返回继续监听。程序设计勾勒如下: ```Java while(server is active){ @@ -52,12 +52,7 @@ while(server is active){ 如果请求需要很长的处理时间,在这段期间内,应用程序不能处理后续的请求,只有当应用程序处理请求返回监听状态,才能继续接收请求。 - - -An alternate design would be for the listening thread to pass the request to a worker thread, and return to listening immediatedly. The worker thread will process the request and send a reply to the client. This design is sketched below: - -另一种设计是在监听线程将请求传递给工作线程,并返回到听immediatedly。工作线程将处理该请求并发送到客户端的回复。这种设计勾勒如下: - +另一种设计就是监听线程接收请求,然后将请求传递给工作线程进行处理,并立即返回到监听状态。工作线程对请求进行处理,然后将结果响应给客户端。这种设计勾勒如下: ```Java while(server is active){ @@ -66,6 +61,8 @@ while(server is active){ } ``` + + This way the server thread will be back at listening sooner. Thus more clients can send requests to the server. The server has become more responsive. The same is true for desktop applications. If you click a button that starts a long task, and the thread executing the task is the thread updating the windows, buttons etc., then the application will appear unresponsive while the task executes. Instead the task can be handed off to a worker thread. While the worker thread is busy with the task, the window thread is free to respond to other user requests. When the worker thread is done it signals the window thread. The window thread can then update the application windows with the result of the task. The program with the worker thread design will appear more responsive to the user. From de60a2fdd17f3dab07947dd82dbe66e34b0f33a0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 16:54:39 +0800 Subject: [PATCH 068/524] Published with https://stackedit.io/ --- ...2\277\347\250\213\347\232\204\345\245\275\345\244\204.md" | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" index 75e5cce..5389b28 100644 --- "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" +++ "b/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" @@ -61,9 +61,6 @@ while(server is active){ } ``` - - -This way the server thread will be back at listening sooner. Thus more clients can send requests to the server. The server has become more responsive. +在这种方式下,服务器线程将很快回到监听状态。因此,可以响应更多的用户请求。服务器变成更具有响应性。 The same is true for desktop applications. If you click a button that starts a long task, and the thread executing the task is the thread updating the windows, buttons etc., then the application will appear unresponsive while the task executes. Instead the task can be handed off to a worker thread. While the worker thread is busy with the task, the window thread is free to respond to other user requests. When the worker thread is done it signals the window thread. The window thread can then update the application windows with the result of the task. The program with the worker thread design will appear more responsive to the user. - From e0d1b469269ddb07500d8f8db83e965a394e6f0e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 16:57:27 +0800 Subject: [PATCH 069/524] Published with https://stackedit.io/ --- ...72\277\347\250\213\347\232\204\346\210\220\346\234\254.md" | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" diff --git "a/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" "b/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" new file mode 100644 index 0000000..0a9de70 --- /dev/null +++ "b/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" @@ -0,0 +1,4 @@ +#03.Multithreading Costs + + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From f7b7a8d46bbc6b8728476602e6e28e99927d8e72 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 17:01:35 +0800 Subject: [PATCH 070/524] Published with https://stackedit.io/ --- ...13\347\232\204\346\210\220\346\234\254.md" | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" "b/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" index 0a9de70..b83143f 100644 --- "a/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" +++ "b/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" @@ -1,4 +1,21 @@ -#03.Multithreading Costs +#03.多线程的代价 +Going from a singlethreaded to a multithreaded application doesn't just provide benefits. It also has some costs. Don't just multithread-enable an application just because you can. You should have a good idea that the benefits gained by doing so, are larger than the costs. When in doubt, try measuring the performance or responsiveness of the application, instead of just guessing. -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file +##设计更加复杂(More complex design) + +Though some parts of a multithreaded applications is simpler than a singlethreaded application, other parts are more complex. Code executed by multiple threads accessing shared data need special attention. Thread interaction is far from always simple. Errors arising from incorrect thread synchronization can be very hard to detect, reproduce and fix. + +##上下文切换的开销(Context Switching Overhead) + +When a CPU switches from executing one thread to executing another, the CPU needs to save the local data, program pointer etc. of the current thread, and load the local data, program pointer etc. of the next thread to execute. This switch is called a "context switch". The CPU switches from executing in the context of one thread to executing in the context of another. + +Context switching isn't cheap. You don't want to switch between threads more than necessary. + +You can read more about context switching on Wikipedia: + +http://en.wikipedia.org/wiki/Context_switch + +##增加资源消耗(Increased Resource Consumption) + +A thread needs some resources from the computer in order to run. Besides CPU time a thread needs some memory to keep its local stack. It may also take up some resources inside the operating system needed to manage the thread. Try creating a program that creates 100 threads that does nothing but wait, and see how much memory the application takes when running. \ No newline at end of file From 3c90ba89e7f072b095382f868ad4c86f11e24178 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 17:04:28 +0800 Subject: [PATCH 071/524] Published with https://stackedit.io/ --- ...45\212\250Java\347\272\277\347\250\213.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" new file mode 100644 index 0000000..f062cd7 --- /dev/null +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -0,0 +1,23 @@ +#04.创建和启动Java线程 + +Going from a singlethreaded to a multithreaded application doesn't just provide benefits. It also has some costs. Don't just multithread-enable an application just because you can. You should have a good idea that the benefits gained by doing so, are larger than the costs. When in doubt, try measuring the performance or responsiveness of the application, instead of just guessing. + +More complex design + +Though some parts of a multithreaded applications is simpler than a singlethreaded application, other parts are more complex. Code executed by multiple threads accessing shared data need special attention. Thread interaction is far from always simple. Errors arising from incorrect thread synchronization can be very hard to detect, reproduce and fix. + +Context Switching Overhead + +When a CPU switches from executing one thread to executing another, the CPU needs to save the local data, program pointer etc. of the current thread, and load the local data, program pointer etc. of the next thread to execute. This switch is called a "context switch". The CPU switches from executing in the context of one thread to executing in the context of another. + +Context switching isn't cheap. You don't want to switch between threads more than necessary. + +You can read more about context switching on Wikipedia: + +http://en.wikipedia.org/wiki/Context_switch + +Increased Resource Consumption + +A thread needs some resources from the computer in order to run. Besides CPU time a thread needs some memory to keep its local stack. It may also take up some resources inside the operating system needed to manage the thread. Try creating a program that creates 100 threads that does nothing but wait, and see how much memory the application takes when running. + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From 8f87b5b2978ccffc9e44824ea563f62c3bde8412 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 17:07:52 +0800 Subject: [PATCH 072/524] Published with https://stackedit.io/ --- ...45\212\250Java\347\272\277\347\250\213.md" | 141 ++++++++++++++++-- 1 file changed, 130 insertions(+), 11 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index f062cd7..405c8bd 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -1,23 +1,142 @@ #04.创建和启动Java线程 -Going from a singlethreaded to a multithreaded application doesn't just provide benefits. It also has some costs. Don't just multithread-enable an application just because you can. You should have a good idea that the benefits gained by doing so, are larger than the costs. When in doubt, try measuring the performance or responsiveness of the application, instead of just guessing. +Java threads are objects like any other Java objects. Threads are instances of class java.lang.Thread, or instances of subclasses of this class. In addition to being objects, java threads can also execute code. -More complex design +##Creating and Starting Threads -Though some parts of a multithreaded applications is simpler than a singlethreaded application, other parts are more complex. Code executed by multiple threads accessing shared data need special attention. Thread interaction is far from always simple. Errors arising from incorrect thread synchronization can be very hard to detect, reproduce and fix. +Creating a thread in Java is done like this: -Context Switching Overhead + Thread thread = new Thread(); +To start the thread you will call its start() method, like this: -When a CPU switches from executing one thread to executing another, the CPU needs to save the local data, program pointer etc. of the current thread, and load the local data, program pointer etc. of the next thread to execute. This switch is called a "context switch". The CPU switches from executing in the context of one thread to executing in the context of another. + thread.start(); +This example doesn't specify any code for the thread to execute. It will stop again right away. -Context switching isn't cheap. You don't want to switch between threads more than necessary. +There are two ways to specify what code the thread should execute. The first is to create a subclass of Thread and override the run() method. The second method is to pass an object that implements Runnable to the Thread constructor. Both methods are covered below. -You can read more about context switching on Wikipedia: +##Thread Subclass -http://en.wikipedia.org/wiki/Context_switch +The first way to specify what code a thread is to run, is to create a subclass of Thread and override the run() method. The run() method is what is executed by the thread after you call start(). Here is an example: -Increased Resource Consumption + public class MyThread extends Thread { -A thread needs some resources from the computer in order to run. Besides CPU time a thread needs some memory to keep its local stack. It may also take up some resources inside the operating system needed to manage the thread. Try creating a program that creates 100 threads that does nothing but wait, and see how much memory the application takes when running. + public void run(){ + System.out.println("MyThread running"); + } + } +To create and start the above thread you can do like this: -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file + MyThread myThread = new MyThread(); + myTread.start(); +The start() call will return as soon as the thread is started. It will not wait until the run() method is done. The run() method will execute as if executed by a different CPU. When the run() method executes it will print out the text "MyThread running". + +You can also create an anonymous subclass of Thread like this: + + Thread thread = new Thread(){ + public void run(){ + System.out.println("Thread Running"); + } + } + + thread.start(); +This example will print out the text "Thread running" once the run() method is executed by the new thread. + +##Runnable Interface Implemention + +The second way to specify what code a thread should run is by creating a class that implements java.lang.Runnable. The Runnable object can be executed by a Thread. + +Here is a Java Runnable example: + + public class MyRunnable implements Runnable { + + public void run(){ + System.out.println("MyRunnable running"); + } + } +To have the run() method executed by a thread, pass an instance of MyRunnable to a Thread in its constructor. Here is how that is done: + + Thread thread = new Thread(new MyRunnable()); + thread.start(); +When the thread is started it will call the run() method of the MyRunnable instance instead of executing it's own run() method. The above example would print out the text "MyRunnable running". + +You can also create an anonymous implementation of Runnable, like this: + + Runnable myRunnable = new Runnable(){ + + public void run(){ + System.out.println("Runnable running"); + } + } + + + Thread thread = new Thread(myRunnable); + thread.start(); +##Subclass or Runnable? + +There are no rules about which of the two methods that is the best. Both methods works. Personally though, I prefer implementing Runnable, and handing an instance of the implementation to a Thread instance. When having the Runnable's executed by a thread pool it is easy to queue up the Runnable instances until a thread from the pool is idle. This is a little harder to do with Thread subclasses. + +Sometimes you may have to implement Runnable as well as subclass Thread. For instance, if creating a subclass of Thread that can execute more than one Runnable. This is typically the case when implementing a thread pool. + +##Common Pitfall: Calling run() instead of start() + +When creating and starting a thread a common mistake is to call the run() method of the Thread instead of start(), like this: + + Thread newThread = new Thread(MyRunnable()); + thread.run(); //should be start(); +At first you may not notice anything because the Runnable's run() method is executed like you expected. However, it is NOT executed by the new thread you just created. Instead the run() method is executed by the thread that created the thread. In other words, the thread that executed the above two lines of code. To have the run() method of the MyRunnable instance called by the new created thread, newThread, you MUST call the newThread.start() method. + +##Thread Names + +When you create a thread you can give it a name. The name can help you distinguish different threads from each other. For instance, if multiple threads write to System.out it can be handy to see which thread wrote the text. Here is an example: + +```Java +Thread thread = new Thread("New Thread") { + public void run(){ + System.out.println("run by: " + getname()); + } +}; + +thread.start(); +System.out.println(thread.getName()); +``` + +Notice the string "New Thread" passed as parameter to the Thread constructor. This string is the name of the thread. The name can be obtained by the Thread's getName() method. You can also pass a name to a Thread when using a Runnable implementation. Here is how that looks: + +```Java +MyRunnable runnable = new MyRunnable(); +Thread thread = new Thread(runnable, "New Thread"); + +thread.start(); +System.out.println(thread.getName()); +``` +Notice however, that since the MyRunnable class is not a subclass of Thread, it does not have access to the getName() method of the thread executing it. A reference to the currently executing thread can be obtained using the call + +```Java + Thread.currentThread(); +``` +Getting the name of the thread currently executing the code can therefore be done like this: + +```Java +String threadName = Thread.currentThread().getName(); +``` +##Java Thread Example + +Here is a small example. First it prints out the name of the thread executing the main() method. This thread is assigned by the JVM. Then it starts up 10 threads and give them all a number as name ("" + i). Each thread then prints its name out, and then stops executing. + +```Java +public class ThreadExample { + + public static void main(String[] args){ + System.out.println(Thread.currentThread().getName()); + for(int i=0; i<10; i++){ + new Thread("" + i){ + public void run(){ + System.out.println("Thread: " + getName() + " running"); + } + }.start(); + } + } +} +``` + +Note that even if the threads are started in sequence (1, 2, 3 etc.) they may not execute sequentially, meaning thread 1 may not be the first thread to write its name to System.out. This is because the threads are in principle executing in parallel and not sequentially. The JVM and/or operating system determines the order in which the threads are executed. This order does not have to be the same order in which they were started. \ No newline at end of file From d17458f85f6dd4a090f3bbcfa536f9716c80fb9a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 5 Sep 2014 17:13:32 +0800 Subject: [PATCH 073/524] Published with https://stackedit.io/ --- ...257\345\212\250Java\347\272\277\347\250\213.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 405c8bd..ce8b191 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -2,7 +2,7 @@ Java threads are objects like any other Java objects. Threads are instances of class java.lang.Thread, or instances of subclasses of this class. In addition to being objects, java threads can also execute code. -##Creating and Starting Threads +##创建和启动线程(Creating and Starting Threads) Creating a thread in Java is done like this: @@ -14,7 +14,7 @@ This example doesn't specify any code for the thread to execute. It will stop ag There are two ways to specify what code the thread should execute. The first is to create a subclass of Thread and override the run() method. The second method is to pass an object that implements Runnable to the Thread constructor. Both methods are covered below. -##Thread Subclass +##继承Thread类(Thread Subclass) The first way to specify what code a thread is to run, is to create a subclass of Thread and override the run() method. The run() method is what is executed by the thread after you call start(). Here is an example: @@ -41,7 +41,7 @@ You can also create an anonymous subclass of Thread like this: thread.start(); This example will print out the text "Thread running" once the run() method is executed by the new thread. -##Runnable Interface Implemention +##实现Runnable接口(Runnable Interface Implemention) The second way to specify what code a thread should run is by creating a class that implements java.lang.Runnable. The Runnable object can be executed by a Thread. @@ -71,13 +71,13 @@ You can also create an anonymous implementation of Runnable, like this: Thread thread = new Thread(myRunnable); thread.start(); -##Subclass or Runnable? +##子类还是实现接口(Subclass or Runnable)? There are no rules about which of the two methods that is the best. Both methods works. Personally though, I prefer implementing Runnable, and handing an instance of the implementation to a Thread instance. When having the Runnable's executed by a thread pool it is easy to queue up the Runnable instances until a thread from the pool is idle. This is a little harder to do with Thread subclasses. Sometimes you may have to implement Runnable as well as subclass Thread. For instance, if creating a subclass of Thread that can execute more than one Runnable. This is typically the case when implementing a thread pool. -##Common Pitfall: Calling run() instead of start() +##常见陷阱:(Common Pitfall: Calling run() instead of start()) When creating and starting a thread a common mistake is to call the run() method of the Thread instead of start(), like this: @@ -85,7 +85,7 @@ When creating and starting a thread a common mistake is to call the run() method thread.run(); //should be start(); At first you may not notice anything because the Runnable's run() method is executed like you expected. However, it is NOT executed by the new thread you just created. Instead the run() method is executed by the thread that created the thread. In other words, the thread that executed the above two lines of code. To have the run() method of the MyRunnable instance called by the new created thread, newThread, you MUST call the newThread.start() method. -##Thread Names +##线程名称(Thread Names) When you create a thread you can give it a name. The name can help you distinguish different threads from each other. For instance, if multiple threads write to System.out it can be handy to see which thread wrote the text. Here is an example: @@ -119,7 +119,7 @@ Getting the name of the thread currently executing the code can therefore be don ```Java String threadName = Thread.currentThread().getName(); ``` -##Java Thread Example +##Java线程示例(Java Thread Example) Here is a small example. First it prints out the name of the thread executing the main() method. This thread is assigned by the JVM. Then it starts up 10 threads and give them all a number as name ("" + i). Each thread then prints its name out, and then stops executing. From 1ffc98f84d46da7e4d7d14a539594a71600fe1ef Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 14:46:09 +0800 Subject: [PATCH 074/524] Published with https://stackedit.io/ --- ....Java NIO\347\274\223\345\206\262\345\214\272.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index aa19fa8..228152c 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -13,7 +13,7 @@ Java NIO中的**缓冲区(Buffers)**用于跟**通道(Channels)**交互 * 从缓冲区中读取数据; * 调用buffer.clear()或buffer.compact()方法。 -当你往缓冲区写入数据的时候,缓冲区会跟踪记录你写入的数据量。当你需要缓冲区读取数据时,你需要调用`flip()`方法将缓冲区从**写入模式**切换为**读取模式**。在读取模式中,你可以读取之前往缓冲区写入的所有数据。 +当你往缓冲区写入数据的时候,缓冲区会跟踪记录你写入的数据量。当你需要缓冲区读取数据时,你需要调用`flip()`方法将缓冲区从**写模式**切换为**读模式**。在读模式中,你可以读取之前往缓冲区写入的所有数据。 当你读取完数据之后,你需要清空缓冲区,以便可以写入数据。你可以通过两种方式来完成:调用`clear()`或`compact()`方法。__`clear()`方法会清空整个缓冲区的数据。而`compact()`方法只会清空已经读取过的数据,尚未读取过的数据会被移动到缓冲区的前端,以便下次继续读取。__ @@ -52,9 +52,9 @@ aFile.close(); * 极限(Limit) -**position**和**limit**在读取模式/写入模式中具有不同的含义。而**capacity**在任何情况都具有同一含义:**缓冲区的容量大小。** +**position**和**limit**在读模式/写模式中具有不同的含义。而**capacity**在任何情况都具有同一含义:**缓冲区的容量大小。** -下面这个图描绘了capacity,position和limit在读取模式和写入模式中的含义: +下面这个图描绘了capacity,position和limit在读模式和写模式中的含义: ![Java NIO: Buffer capacity, position and limit in write and read mode.](http://tutorials.jenkov.com/images/java-nio/buffers-modes.png) @@ -66,13 +66,13 @@ aFile.close(); 当你往缓冲区写入数据时,实际上你是往缓冲区中的指定的位置写入数据。这个位置初始值为0,当往缓冲区写入数据时,position会指向下一个可写入的内存单元。postion的最大值为capacity-1。 -当你从缓冲区读取数据时,你同样的是从position指定的位置读取数据。当你调用`flip()`方法使缓冲区由**写入模式**切换成**读取模式**后,position会重置为0。当从position指定单元读数据后,postion会移至下一个可读取单元。 +当你从缓冲区读取数据时,你同样的是从position指定的位置读取数据。当你调用`flip()`方法使缓冲区由**写模式**切换成**读模式**后,position会重置为0。当从position指定单元读数据后,postion会移至下一个可读取单元。 ###Limit -在**写入模式**中,limit指定的是能写入数据量的大小。在写入模式中,limit的值等于capacity的值。 +在**写模式**中,limit指定的是能写入数据量的大小。在写模式中,limit的值等于capacity的值。 -当调用`flip()`方法使缓冲区切换成**读取模式**后,limit会重置为你能读取的数据量的大小。因此,在调用`flip()`方法后,limit重置为position的值,而position重置为0。 +当调用`flip()`方法使缓冲区切换成**读模式**后,limit会重置为你能读取的数据量的大小。因此,在调用`flip()`方法后,limit重置为position的值,而position重置为0。 ##Buffer Types From f5dba080abd6db0c3739e2f2d25faa2baf9d4310 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 15:25:34 +0800 Subject: [PATCH 075/524] Published with https://stackedit.io/ --- ...IO\347\274\223\345\206\262\345\214\272.md" | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 228152c..2c0b095 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -123,43 +123,44 @@ buf.put(127); ###flip() -The flip() method switches a Buffer from writing mode to reading mode. Calling flip() sets the position back to 0, and sets the limit to where position just was. +调用`flip()`方法可以将缓冲区区从写模式切换为模式,此时limit被重置为position的值,而position被重置为0。 -In other words, position now marks the reading position, and limit marks how many bytes, chars etc. were written into the buffer - the limit of how many bytes, chars etc. that can be read. +换句话说,position标识当前读的位置,而limit标识缓存区可读内容的大小。 -Reading Data from a Buffer +##从缓冲区读取数据(Reading Data from a Buffer) -There are two ways you can read data from a Buffer. +从缓冲区读取数据有两种方式: -Read data from the buffer into a channel. -Read data from the buffer yourself, using one of the get() methods. -Here is an example of how you can read data from a buffer into a channel: +* 从缓冲区读取数据到通道中。 +* 直接调用缓冲区的`get()`方法。 + +以下是这两种方法对应的代码: ```Java //read from buffer into channel. int bytesWritten = inChannel.write(buf); -Here is an example that reads data from a Buffer using the get() method: +``` +```Java byte aByte = buf.get(); ``` -There are many other versions of the get() method, allowing you to read data from the Buffer in many different ways. For instance, reading at specific positions, or reading an array of bytes from the buffer. See the JavaDoc for the concrete buffer implementation for more details. +Java API提供了多种重载的`get()`方法。详情请查阅文档。 ###rewind() -The Buffer.rewind() sets the position back to 0, so you can reread all the data in the buffer. The limit remains untouched, thus still marking how many elements (bytes, chars etc.) that can be read from the Buffer. +`Buffer.rewind()`可以将**position**重置为0,这样你就可以多次读取缓冲区的数据,期间**limit**的值保持不边 ###clear() and compact() -Once you are done reading data out of the Buffer you have to make the Buffer ready for writing again. You can do so either by calling clear() or by calling compact(). +当从缓冲区读取完数据后,可以调用`clear()`或`compact()`将缓冲区切换为写模式。 -If you call clear() the position is set back to 0 and the limit to capacity. In other words, the Buffer is cleared. The data in the Buffer is not cleared. Only the markers telling where you can write data into the Buffer are. +如果调用的是`clear()`方法,position重置为0,limit重置为capacity的值。换言之,缓冲区被清除了,但实际上缓冲区的数据并没被清除。 -If there is any unread data in the Buffer when you call clear() that data will be "forgotten", meaning you no longer have any markers telling what data has been read, and what has not been read. +如果缓冲区中还有需要读取的数据,同时你需要清除已经读取过的数据,这时你可以调用`compact()`方法。 -If there is still unread data in the Buffer, and you want to read it later, but you need to do some writing first, call compact() instead of clear(). +`compact()`方法会复制尚未读取的数据到缓冲区的前面,然后将position设置为未读取数据的最后一个元素的后一位,而limit重置为capacity的值。这样就可以保证未读取的数据不会丢失,同时又可以继续写入数据。 -compact() copies all unread data to the beginning of the Buffer. Then it sets position to right after the last unread element. The limit property is still set to capacity, just like clear() does. Now the Buffer is ready for writing, but you will not overwrite the unread data. ###mark() and reset() @@ -167,7 +168,6 @@ You can mark a given position in a Buffer by calling the Buffer.mark() method. Y ```Java buffer.mark(); - //call buffer.get() a couple of times, e.g. during parsing. buffer.reset(); //set position back to mark. From 471a3377989fc40cc642cb9a24bcc66b3fa1d68c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 15:31:29 +0800 Subject: [PATCH 076/524] Published with https://stackedit.io/ --- .../04.Java NIO\347\274\223\345\206\262\345\214\272.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 2c0b095..7ad3dea 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -162,18 +162,19 @@ Java API提供了多种重载的`get()`方法。详情请查阅文档。 `compact()`方法会复制尚未读取的数据到缓冲区的前面,然后将position设置为未读取数据的最后一个元素的后一位,而limit重置为capacity的值。这样就可以保证未读取的数据不会丢失,同时又可以继续写入数据。 -###mark() and reset() +###mark()和reset() -You can mark a given position in a Buffer by calling the Buffer.mark() method. You can then later reset the position back to the marked position by calling the Buffer.reset() method. Here is an example: +`Buffer.mark()`可以对position的位置进行标志,在进行一系列操作后,可以调用`reset()`将position重置为`Buffer.mark()`标志的位置。例子: ```Java buffer.mark(); //call buffer.get() a couple of times, e.g. during parsing. buffer.reset(); //set position back to mark. -equals() and compareTo() ``` +##equals()和compareTo() + It is possible to compare two buffers using equals() and compareTo(). ###equals() From f62c37e6a2da684449054a66e62a047509212046 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 15:43:10 +0800 Subject: [PATCH 077/524] Published with https://stackedit.io/ --- ...IO\347\274\223\345\206\262\345\214\272.md" | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 7ad3dea..2b487a4 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -175,18 +175,21 @@ buffer.reset(); //set position back to mark. ##equals()和compareTo() -It is possible to compare two buffers using equals() and compareTo(). -###equals() +可以调用缓冲区的`equals()`方法和`compareTo()`方法对缓冲区进行比较。 -Two buffers are equal if: +####equals() -They are of the same type (byte, char, int etc.) -They have the same amount of remaining bytes, chars etc. in the buffer. -All remaining bytes, chars etc. are equal. -As you can see, equals only compares part of the Buffer, not every single element inside it. In fact, it just compares the remaining elements in the Buffer. +如果符合以下情况,则两个缓冲区的`equals()`返回值为true: + +* 缓冲区的类型相同(byte、char等等); +* 缓冲区中有效数据的数据量相等; +* 缓冲区中有效数据的数据一致; + +如上所示,如果缓冲区中的**有效数据**都相同,则`equals()`返回值为true。 + +####compareTo() -###compareTo() The compareTo() method compares the remaining elements (bytes, chars etc.) of the two buffers, for use in e.g. sorting routines. A buffer is considered "smaller" than another buffer if: From 9fa5a81cbf05583e849b7939b5bedfcba1b1a105 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 15:46:31 +0800 Subject: [PATCH 078/524] Published with https://stackedit.io/ --- "Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" index 2b487a4..3b33ef3 100644 --- "a/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" +++ "b/Java-NIO/04.Java NIO\347\274\223\345\206\262\345\214\272.md" @@ -190,7 +190,6 @@ buffer.reset(); //set position back to mark. ####compareTo() - The compareTo() method compares the remaining elements (bytes, chars etc.) of the two buffers, for use in e.g. sorting routines. A buffer is considered "smaller" than another buffer if: The first element which is equal to the corresponding element in the other buffer, is smaller than that in the other buffer. From 5c38890957c7e4e426982c62520977146217fa15 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 16:47:18 +0800 Subject: [PATCH 079/524] Published with https://stackedit.io/ --- ...45\212\250Java\347\272\277\347\250\213.md" | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index ce8b191..3063bb3 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -1,18 +1,24 @@ #04.创建和启动Java线程 -Java threads are objects like any other Java objects. Threads are instances of class java.lang.Thread, or instances of subclasses of this class. In addition to being objects, java threads can also execute code. +Java线程对象与其它的对象相似。线程对象是`java.lang.Thread`的实例,或是`java.lang.Thread`的子类的实例。跟普通对象不同,线程对象可以执行代码。 ##创建和启动线程(Creating and Starting Threads) -Creating a thread in Java is done like this: +在Java中,可以使用以下方式创建线程: - Thread thread = new Thread(); -To start the thread you will call its start() method, like this: +```Java +Thread thread = new Thread(); +``` - thread.start(); -This example doesn't specify any code for the thread to execute. It will stop again right away. +调用`Thread.start()`可以启动线程: + +```Java +thread.start(); +``` + +这个例子并没有为线程指定要执行的代码,所以它会很快返回并停止。 -There are two ways to specify what code the thread should execute. The first is to create a subclass of Thread and override the run() method. The second method is to pass an object that implements Runnable to the Thread constructor. Both methods are covered below. +有两种方法可以为线程指定需要执行的代码。第一种方式是创建`Thread`的子类并重写`run()`方法;第二种方式是将实现`Runnable`接口的对象作为构造参数传给`Thread(Runnale r)`。 ##继承Thread类(Thread Subclass) @@ -71,6 +77,8 @@ You can also create an anonymous implementation of Runnable, like this: Thread thread = new Thread(myRunnable); thread.start(); + + ##子类还是实现接口(Subclass or Runnable)? There are no rules about which of the two methods that is the best. Both methods works. Personally though, I prefer implementing Runnable, and handing an instance of the implementation to a Thread instance. When having the Runnable's executed by a thread pool it is easy to queue up the Runnable instances until a thread from the pool is idle. This is a little harder to do with Thread subclasses. From 469801ccdebde1291fac7791640d441c217eb2ed Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 16:56:12 +0800 Subject: [PATCH 080/524] Published with https://stackedit.io/ --- ...45\212\250Java\347\272\277\347\250\213.md" | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 3063bb3..2d71904 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -22,18 +22,24 @@ thread.start(); ##继承Thread类(Thread Subclass) -The first way to specify what code a thread is to run, is to create a subclass of Thread and override the run() method. The run() method is what is executed by the thread after you call start(). Here is an example: +第一种为线程指定执行代码的方法:**继承Thread类并重写run方法。** `run()`方法在调用`Thread.start()`后执行。例子: - public class MyThread extends Thread { - - public void run(){ - System.out.println("MyThread running"); - } +```Java +public class MyThread extends Thread { + public void run(){ + System.out.println("MyThread running"); } -To create and start the above thread you can do like this: +} +``` +通过下面的代码创建并执行线程: + +``` MyThread myThread = new MyThread(); myTread.start(); +``` + + The start() call will return as soon as the thread is started. It will not wait until the run() method is done. The run() method will execute as if executed by a different CPU. When the run() method executes it will print out the text "MyThread running". You can also create an anonymous subclass of Thread like this: From 9abf9783ae7b4fb3c2bec77730e0356eaf1aea95 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 17:05:12 +0800 Subject: [PATCH 081/524] Published with https://stackedit.io/ --- ...214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 2d71904..08bb129 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -39,8 +39,9 @@ public class MyThread extends Thread { myTread.start(); ``` +`start()`方法的调用会立即返回,并不会等待`run()`方法的执行,就好像这段代码被其他的CPU执行一样。 + -The start() call will return as soon as the thread is started. It will not wait until the run() method is done. The run() method will execute as if executed by a different CPU. When the run() method executes it will print out the text "MyThread running". You can also create an anonymous subclass of Thread like this: From 5cce351a3aa34e2ceb57a0ba1759e78497ecf698 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 17:33:00 +0800 Subject: [PATCH 082/524] Published with https://stackedit.io/ --- ...\345\212\250Java\347\272\277\347\250\213.md" | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 08bb129..95e1233 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -41,18 +41,17 @@ public class MyThread extends Thread { `start()`方法的调用会立即返回,并不会等待`run()`方法的执行,就好像这段代码被其他的CPU执行一样。 +你还可以使用匿名子类来创建线程对象: - -You can also create an anonymous subclass of Thread like this: - - Thread thread = new Thread(){ - public void run(){ - System.out.println("Thread Running"); - } +```Java +Thread thread = new Thread(){ + public void run(){ + System.out.println("Thread Running"); } +} - thread.start(); -This example will print out the text "Thread running" once the run() method is executed by the new thread. +thread.start(); +``` ##实现Runnable接口(Runnable Interface Implemention) From 99779f8c133ea32db9b6fcb09ce7405e9ebdb6e1 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 17:40:50 +0800 Subject: [PATCH 083/524] Published with https://stackedit.io/ --- ...45\212\250Java\347\272\277\347\250\213.md" | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 95e1233..ee4d150 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -55,20 +55,26 @@ thread.start(); ##实现Runnable接口(Runnable Interface Implemention) -The second way to specify what code a thread should run is by creating a class that implements java.lang.Runnable. The Runnable object can be executed by a Thread. +第二种为线程指定执行代码的方法:创建实现`java.lang.Runnable`接口的对象,然后把该对象交给Thread执行。 -Here is a Java Runnable example: +MyRunnable类实现Runnable接口: - public class MyRunnable implements Runnable { - - public void run(){ - System.out.println("MyRunnable running"); - } +```Java +public class MyRunnable implements Runnable { + public void run(){ + System.out.println("MyRunnable running"); } -To have the run() method executed by a thread, pass an instance of MyRunnable to a Thread in its constructor. Here is how that is done: +} +``` + +将MyRunnable的实例作为构造参数传给Thread,然后通过`thread.start()`启动线程: + +```Java +Thread thread = new Thread(new MyRunnable()); +thread.start(); +``` + - Thread thread = new Thread(new MyRunnable()); - thread.start(); When the thread is started it will call the run() method of the MyRunnable instance instead of executing it's own run() method. The above example would print out the text "MyRunnable running". You can also create an anonymous implementation of Runnable, like this: From caf284a83ae4b12db6964a6e750ba997835873dd Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 17:46:15 +0800 Subject: [PATCH 084/524] Published with https://stackedit.io/ --- ...45\212\250Java\347\272\277\347\250\213.md" | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index ee4d150..60757b3 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -74,22 +74,22 @@ Thread thread = new Thread(new MyRunnable()); thread.start(); ``` +当线程启动后,它会调用MyRunnable实例的`run()` 方法而不是自身的`run()`方法。 -When the thread is started it will call the run() method of the MyRunnable instance instead of executing it's own run() method. The above example would print out the text "MyRunnable running". -You can also create an anonymous implementation of Runnable, like this: +同样,你可以通过匿名Runnable类来实现: - Runnable myRunnable = new Runnable(){ +````Java +Runnable myRunnable = new Runnable(){ - public void run(){ - System.out.println("Runnable running"); - } - } - - - Thread thread = new Thread(myRunnable); - thread.start(); + public void run(){ + System.out.println("Runnable running"); + } +} +Thread thread = new Thread(myRunnable); +thread.start(); +``` ##子类还是实现接口(Subclass or Runnable)? From fe9c8a0b525a5907e87a2ecfcd4a3b54a7e0cf2c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 18:17:37 +0800 Subject: [PATCH 085/524] Published with https://stackedit.io/ --- ...220\257\345\212\250Java\347\272\277\347\250\213.md" | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 60757b3..ad798ef 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -101,8 +101,11 @@ Sometimes you may have to implement Runnable as well as subclass Thread. For ins When creating and starting a thread a common mistake is to call the run() method of the Thread instead of start(), like this: - Thread newThread = new Thread(MyRunnable()); - thread.run(); //should be start(); +```Java +Thread newThread = new Thread(MyRunnable()); +thread.run(); //should be start(); +``` + At first you may not notice anything because the Runnable's run() method is executed like you expected. However, it is NOT executed by the new thread you just created. Instead the run() method is executed by the thread that created the thread. In other words, the thread that executed the above two lines of code. To have the run() method of the MyRunnable instance called by the new created thread, newThread, you MUST call the newThread.start() method. ##线程名称(Thread Names) @@ -132,8 +135,9 @@ System.out.println(thread.getName()); Notice however, that since the MyRunnable class is not a subclass of Thread, it does not have access to the getName() method of the thread executing it. A reference to the currently executing thread can be obtained using the call ```Java - Thread.currentThread(); +Thread.currentThread(); ``` + Getting the name of the thread currently executing the code can therefore be done like this: ```Java From 0bec5fe542bdbee95f82b20888de6b6e8bddfa84 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 18:35:29 +0800 Subject: [PATCH 086/524] Published with https://stackedit.io/ --- ...\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index ad798ef..2c90910 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -95,7 +95,7 @@ thread.start(); There are no rules about which of the two methods that is the best. Both methods works. Personally though, I prefer implementing Runnable, and handing an instance of the implementation to a Thread instance. When having the Runnable's executed by a thread pool it is easy to queue up the Runnable instances until a thread from the pool is idle. This is a little harder to do with Thread subclasses. -Sometimes you may have to implement Runnable as well as subclass Thread. For instance, if creating a subclass of Thread that can execute more than one Runnable. This is typically the case when implementing a thread pool. +Sometimes you may have to implement Runnable as well as subclass Thread. For instance, if creating a subclass of Thread that can execute more than one Runnable. This is typically the case when implementing a thread pool. ??? Thread本身已经实现Runnable接口,这段话如何理解?? ##常见陷阱:(Common Pitfall: Calling run() instead of start()) From 6ec83c94a3f68ff223a2d7bb8099d6aad06896c9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 18:38:23 +0800 Subject: [PATCH 087/524] Published with https://stackedit.io/ --- ...14\345\220\257\345\212\250Java\347\272\277\347\250\213.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 2c90910..d17014a 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -99,13 +99,15 @@ Sometimes you may have to implement Runnable as well as subclass Thread. For ins ##常见陷阱:(Common Pitfall: Calling run() instead of start()) -When creating and starting a thread a common mistake is to call the run() method of the Thread instead of start(), like this: +一个常见的陷阱就是调用`run()`方法来启动线程: ```Java Thread newThread = new Thread(MyRunnable()); thread.run(); //should be start(); ``` + + At first you may not notice anything because the Runnable's run() method is executed like you expected. However, it is NOT executed by the new thread you just created. Instead the run() method is executed by the thread that created the thread. In other words, the thread that executed the above two lines of code. To have the run() method of the MyRunnable instance called by the new created thread, newThread, you MUST call the newThread.start() method. ##线程名称(Thread Names) From 236ccce5168ab18cea75ae73ba7dbb27fab1fe6d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 9 Sep 2014 18:42:17 +0800 Subject: [PATCH 088/524] Published with https://stackedit.io/ --- ...214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index d17014a..d4b7ffe 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -106,10 +106,9 @@ Thread newThread = new Thread(MyRunnable()); thread.run(); //should be start(); ``` +这段代码的`run()`会正常执行,然而,它并不是由新创建的线程执行的,而是由当前线程执行。如果要创建新的线程来执行,必须调用`start()`方法而不是`run()`方法。 -At first you may not notice anything because the Runnable's run() method is executed like you expected. However, it is NOT executed by the new thread you just created. Instead the run() method is executed by the thread that created the thread. In other words, the thread that executed the above two lines of code. To have the run() method of the MyRunnable instance called by the new created thread, newThread, you MUST call the newThread.start() method. - ##线程名称(Thread Names) When you create a thread you can give it a name. The name can help you distinguish different threads from each other. For instance, if multiple threads write to System.out it can be handy to see which thread wrote the text. Here is an example: From 536d277151b59bd47d17d88331860cb55f4c1160 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 14:52:29 +0800 Subject: [PATCH 089/524] Published with https://stackedit.io/ --- ...5\220\257\345\212\250Java\347\272\277\347\250\213.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index d4b7ffe..c8901da 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -111,8 +111,8 @@ thread.run(); //should be start(); ##线程名称(Thread Names) -When you create a thread you can give it a name. The name can help you distinguish different threads from each other. For instance, if multiple threads write to System.out it can be handy to see which thread wrote the text. Here is an example: - + 当创建线程时,可以对线程命名,通过对线程命名可以用来区分不同的线程。举个例子,有多个线程通过`System.out`写内容到控制台,那么可以通过名字很方便地区分不同的线程: + ```Java Thread thread = new Thread("New Thread") { public void run(){ @@ -123,8 +123,7 @@ Thread thread = new Thread("New Thread") { thread.start(); System.out.println(thread.getName()); ``` - -Notice the string "New Thread" passed as parameter to the Thread constructor. This string is the name of the thread. The name can be obtained by the Thread's getName() method. You can also pass a name to a Thread when using a Runnable implementation. Here is how that looks: +字符串“New Thread”通过构造函数传给Thread,这个就是线程的名字。可以通过`getName()`获取线程的名字。使用Runnable接口时,可以通过如下方式进行命名: ```Java MyRunnable runnable = new MyRunnable(); @@ -133,6 +132,8 @@ Thread thread = new Thread(runnable, "New Thread"); thread.start(); System.out.println(thread.getName()); ``` + + Notice however, that since the MyRunnable class is not a subclass of Thread, it does not have access to the getName() method of the thread executing it. A reference to the currently executing thread can be obtained using the call ```Java From 096d2f27e019d4d5e27caef0bd13a92da2516832 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 14:57:13 +0800 Subject: [PATCH 090/524] Published with https://stackedit.io/ --- ...5\220\257\345\212\250Java\347\272\277\347\250\213.md" | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index c8901da..990b7b1 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -133,14 +133,7 @@ thread.start(); System.out.println(thread.getName()); ``` - -Notice however, that since the MyRunnable class is not a subclass of Thread, it does not have access to the getName() method of the thread executing it. A reference to the currently executing thread can be obtained using the call - -```Java -Thread.currentThread(); -``` - -Getting the name of the thread currently executing the code can therefore be done like this: +获取当前线程的名字,可以通过一下方式获取: ```Java String threadName = Thread.currentThread().getName(); From c8be56e57ac7957e4363802a6d264a875981430b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 15:10:42 +0800 Subject: [PATCH 091/524] Published with https://stackedit.io/ --- ...14\345\220\257\345\212\250Java\347\272\277\347\250\213.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" index 990b7b1..efcec90 100644 --- "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" +++ "b/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" @@ -140,7 +140,7 @@ String threadName = Thread.currentThread().getName(); ``` ##Java线程示例(Java Thread Example) -Here is a small example. First it prints out the name of the thread executing the main() method. This thread is assigned by the JVM. Then it starts up 10 threads and give them all a number as name ("" + i). Each thread then prints its name out, and then stops executing. +下面的线程例子。首先打印执行main方法线程的名字(这个线程由JVM分配)。然后启动10个线程,并递增赋予它们名字i,每个线程打印自己的名字,最后停止: ```Java public class ThreadExample { @@ -158,4 +158,4 @@ public class ThreadExample { } ``` -Note that even if the threads are started in sequence (1, 2, 3 etc.) they may not execute sequentially, meaning thread 1 may not be the first thread to write its name to System.out. This is because the threads are in principle executing in parallel and not sequentially. The JVM and/or operating system determines the order in which the threads are executed. This order does not have to be the same order in which they were started. \ No newline at end of file +值得注意的是,虽然线程是依次按1,2,3启动,但是它们的执行却不是顺序的,也就说第一个启动的线程,并不一定第一个打印输出。这是因为线程**原则上**是并行执行而不是顺序执行,由JVM或操作系统来决定线程的执行顺序,这个顺序并不需要与它们的启动顺序一致。 \ No newline at end of file From 69a639d4df073f99930828971161f89ad31d16f0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 16:30:17 +0800 Subject: [PATCH 092/524] Published with https://stackedit.io/ --- ...14\344\270\264\347\225\214\345\214\272.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 "\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" diff --git "a/\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" new file mode 100644 index 0000000..0ad642b --- /dev/null +++ "b/\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -0,0 +1,43 @@ + +#资源竞争和临界区(Race Conditions and Critical Sections) + +Running more than one thread inside the same application does not by itself cause problems. The problems arise when multiple threads access the same resources. For instance the same memory (variables, arrays, or objects), systems (databases, web services etc.) or files. In fact, problems only arise if one or more of the threads write to these resources. It is safe to let multiple threads read the same resources, as long as the resources do not change. + +Here is a code example that may fail if executed by multiple threads simultaneously: + +``` +public class Counter { + + protected long count = 0; + + public void add(long value){ + this.count = this.count + value; + } +} +``` +Imagine if two threads, A and B, are executing the add method on the same instance of the Counter class. There is no way to know when the operating system switches between the two threads. The code is not executed as a single instruction by the Java virtual machine. Rather it is executed along the lines of: + +``` +get this.count from memory into register +add value to register +write register to memory +``` + +Observe what happens with the following mixed execution of threads A and B: + +``` +this.count = 0; +A: reads this.count into a register (0) +B: reads this.count into a register (0) +B: adds value 2 to register +B: writes register value (2) back to memory. this.count now equals 2 +A: adds value 3 to register +A: writes register value (3) back to memory. this.count now equals 3 + ``` + +The two threads added the values 2 and 3 to the counter. Thus the value should have been 5 after the two threads complete execution. However, since the execution of the two threads is interleaved, both threads read the value 0 from memory. Then they add their individual values, 2 and 3, to the value, and write the result back to memory. Instead of 5, the value left in this.count will be the value written by the last thread to write its value. In the above case it is thread A, but it could as well have been thread B. Without proper thread synchronization mechanisms there is no way to know exactly how the thread execution is interleaved. + +## Race Conditions & Critical Sections + +The situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions. A code section that leads to race conditions is called a critical section. In the previous example the method add() is a critical section, leading to race conditions. Race conditions can be avoided by proper thread synchronization in critical sections. + From 6040c4954144f16e2d152eeca0504fda23af646e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 16:32:29 +0800 Subject: [PATCH 093/524] Published with https://stackedit.io/ --- ...14\344\270\264\347\225\214\345\214\272.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" diff --git "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" new file mode 100644 index 0000000..0ad642b --- /dev/null +++ "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -0,0 +1,43 @@ + +#资源竞争和临界区(Race Conditions and Critical Sections) + +Running more than one thread inside the same application does not by itself cause problems. The problems arise when multiple threads access the same resources. For instance the same memory (variables, arrays, or objects), systems (databases, web services etc.) or files. In fact, problems only arise if one or more of the threads write to these resources. It is safe to let multiple threads read the same resources, as long as the resources do not change. + +Here is a code example that may fail if executed by multiple threads simultaneously: + +``` +public class Counter { + + protected long count = 0; + + public void add(long value){ + this.count = this.count + value; + } +} +``` +Imagine if two threads, A and B, are executing the add method on the same instance of the Counter class. There is no way to know when the operating system switches between the two threads. The code is not executed as a single instruction by the Java virtual machine. Rather it is executed along the lines of: + +``` +get this.count from memory into register +add value to register +write register to memory +``` + +Observe what happens with the following mixed execution of threads A and B: + +``` +this.count = 0; +A: reads this.count into a register (0) +B: reads this.count into a register (0) +B: adds value 2 to register +B: writes register value (2) back to memory. this.count now equals 2 +A: adds value 3 to register +A: writes register value (3) back to memory. this.count now equals 3 + ``` + +The two threads added the values 2 and 3 to the counter. Thus the value should have been 5 after the two threads complete execution. However, since the execution of the two threads is interleaved, both threads read the value 0 from memory. Then they add their individual values, 2 and 3, to the value, and write the result back to memory. Instead of 5, the value left in this.count will be the value written by the last thread to write its value. In the above case it is thread A, but it could as well have been thread B. Without proper thread synchronization mechanisms there is no way to know exactly how the thread execution is interleaved. + +## Race Conditions & Critical Sections + +The situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions. A code section that leads to race conditions is called a critical section. In the previous example the method add() is a critical section, leading to race conditions. Race conditions can be avoided by proper thread synchronization in critical sections. + From c4b6f014f7686ab6bac956bf6d818ca72e8eaf3e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 16:33:11 +0800 Subject: [PATCH 094/524] =?UTF-8?q?Delete=20=E8=B5=84=E6=BA=90=E7=AB=9E?= =?UTF-8?q?=E4=BA=89=E5=92=8C=E4=B8=B4=E7=95=8C=E5=8C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\344\270\264\347\225\214\345\214\272.md" | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 "\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" diff --git "a/\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" deleted file mode 100644 index 0ad642b..0000000 --- "a/\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" +++ /dev/null @@ -1,43 +0,0 @@ - -#资源竞争和临界区(Race Conditions and Critical Sections) - -Running more than one thread inside the same application does not by itself cause problems. The problems arise when multiple threads access the same resources. For instance the same memory (variables, arrays, or objects), systems (databases, web services etc.) or files. In fact, problems only arise if one or more of the threads write to these resources. It is safe to let multiple threads read the same resources, as long as the resources do not change. - -Here is a code example that may fail if executed by multiple threads simultaneously: - -``` -public class Counter { - - protected long count = 0; - - public void add(long value){ - this.count = this.count + value; - } -} -``` -Imagine if two threads, A and B, are executing the add method on the same instance of the Counter class. There is no way to know when the operating system switches between the two threads. The code is not executed as a single instruction by the Java virtual machine. Rather it is executed along the lines of: - -``` -get this.count from memory into register -add value to register -write register to memory -``` - -Observe what happens with the following mixed execution of threads A and B: - -``` -this.count = 0; -A: reads this.count into a register (0) -B: reads this.count into a register (0) -B: adds value 2 to register -B: writes register value (2) back to memory. this.count now equals 2 -A: adds value 3 to register -A: writes register value (3) back to memory. this.count now equals 3 - ``` - -The two threads added the values 2 and 3 to the counter. Thus the value should have been 5 after the two threads complete execution. However, since the execution of the two threads is interleaved, both threads read the value 0 from memory. Then they add their individual values, 2 and 3, to the value, and write the result back to memory. Instead of 5, the value left in this.count will be the value written by the last thread to write its value. In the above case it is thread A, but it could as well have been thread B. Without proper thread synchronization mechanisms there is no way to know exactly how the thread execution is interleaved. - -## Race Conditions & Critical Sections - -The situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions. A code section that leads to race conditions is called a critical section. In the previous example the method add() is a critical section, leading to race conditions. Race conditions can be avoided by proper thread synchronization in critical sections. - From 2dd05014157020953ed3dd8412afff5ecfb6d55f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 16:55:40 +0800 Subject: [PATCH 095/524] Published with https://stackedit.io/ --- ...11\345\222\214\344\270\264\347\225\214\345\214\272.md" | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" index 0ad642b..42bc1e7 100644 --- "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" +++ "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -1,11 +1,11 @@ #资源竞争和临界区(Race Conditions and Critical Sections) -Running more than one thread inside the same application does not by itself cause problems. The problems arise when multiple threads access the same resources. For instance the same memory (variables, arrays, or objects), systems (databases, web services etc.) or files. In fact, problems only arise if one or more of the threads write to these resources. It is safe to let multiple threads read the same resources, as long as the resources do not change. +在一个应用程序中运行多个线程这本身不会导致什么问题。问题在于多个线程同时对同一资源进行存取,例如同样的内存空间(变量、数组或对象),系统资源(数据库,文件系统等等)。如果是多个线程对同一资源进行读取,则不会有任何问题。 -Here is a code example that may fail if executed by multiple threads simultaneously: +以下的代码,如果有多个线程同时执行,则会导致问题: -``` +```Java public class Counter { protected long count = 0; @@ -15,6 +15,8 @@ public class Counter { } } ``` + + Imagine if two threads, A and B, are executing the add method on the same instance of the Counter class. There is no way to know when the operating system switches between the two threads. The code is not executed as a single instruction by the Java virtual machine. Rather it is executed along the lines of: ``` From 68b2292a2de6b7765342879151eeb10569e75b19 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 17:04:09 +0800 Subject: [PATCH 096/524] Published with https://stackedit.io/ --- ...1\345\222\214\344\270\264\347\225\214\345\214\272.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" index 42bc1e7..937476c 100644 --- "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" +++ "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -16,13 +16,12 @@ public class Counter { } ``` - -Imagine if two threads, A and B, are executing the add method on the same instance of the Counter class. There is no way to know when the operating system switches between the two threads. The code is not executed as a single instruction by the Java virtual machine. Rather it is executed along the lines of: +想象一下,有两个线程:`A`和`B`,同时执行Counter类的实例的一个`add()`方法。操作系统中的线程调度如何进行,我们是无法进行预测的。并且,这个方法的代码在JVM内部并不是作为一个单独的指令执行的,而是有如下步骤: ``` -get this.count from memory into register -add value to register -write register to memory +从内存中获取this.count的值到寄存器 +把value的值加到寄存器 +把寄存器中的值写到内存 ``` Observe what happens with the following mixed execution of threads A and B: From 2593ef8e9ea31ff15aa0894b68e7adfb318b13fe Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 17:16:22 +0800 Subject: [PATCH 097/524] Published with https://stackedit.io/ --- ...222\214\344\270\264\347\225\214\345\214\272.md" | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" index 937476c..a226211 100644 --- "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" +++ "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -19,12 +19,12 @@ public class Counter { 想象一下,有两个线程:`A`和`B`,同时执行Counter类的实例的一个`add()`方法。操作系统中的线程调度如何进行,我们是无法进行预测的。并且,这个方法的代码在JVM内部并不是作为一个单独的指令执行的,而是有如下步骤: ``` -从内存中获取this.count的值到寄存器 -把value的值加到寄存器 -把寄存器中的值写到内存 +get this.count from memory into register +add value to register +write register to memory ``` -Observe what happens with the following mixed execution of threads A and B: +观察下面A线程和B线程的运行过程和结果: ``` this.count = 0; @@ -36,9 +36,11 @@ A: adds value 3 to register A: writes register value (3) back to memory. this.count now equals 3 ``` -The two threads added the values 2 and 3 to the counter. Thus the value should have been 5 after the two threads complete execution. However, since the execution of the two threads is interleaved, both threads read the value 0 from memory. Then they add their individual values, 2 and 3, to the value, and write the result back to memory. Instead of 5, the value left in this.count will be the value written by the last thread to write its value. In the above case it is thread A, but it could as well have been thread B. Without proper thread synchronization mechanisms there is no way to know exactly how the thread execution is interleaved. + 线程A和线程B分别加2和3到counter中,在正常情况下,counter的结果应该为5。然而,由于两个线程的执行是互相交织的,两个线程同时从内存中读取0值到寄存器。然后它们分别把2和3跟0相加,最后由线程A把寄存器中的值写回到内存中,所以执行的最后结果是3。在上面的例子中,最后由线程A把3写到内存中,而实际上也可能是线程B。如果没有适当的同步机制,那么我们无从知晓这两个线程间到底如何交织执行。 + + -## Race Conditions & Critical Sections +## 资源竞争和临界点(Race Conditions & Critical Sections) The situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions. A code section that leads to race conditions is called a critical section. In the previous example the method add() is a critical section, leading to race conditions. Race conditions can be avoided by proper thread synchronization in critical sections. From ee530215deee5f88b47ff38d7586a4aab3d75d50 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 17:28:51 +0800 Subject: [PATCH 098/524] Published with https://stackedit.io/ --- ...272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" index a226211..2e1818f 100644 --- "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" +++ "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -42,5 +42,6 @@ A: writes register value (3) back to memory. this.count now equals 3 ## 资源竞争和临界点(Race Conditions & Critical Sections) -The situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions. A code section that leads to race conditions is called a critical section. In the previous example the method add() is a critical section, leading to race conditions. Race conditions can be avoided by proper thread synchronization in critical sections. +当多个线程对同一个资源进行竞争,访问这个资源的顺序是非常重要的,称之为**资源竞争**(he situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions)。可以引起资源竞争的代码区域,称之为**临界区**。在前面的示例中,`add()`方法就是一个临界区。资源竞争可以通过在临界区进行适当的**线程同步**来避免。 + From 5faef7ffc245af231226d6f1fdc146f7848758ae Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 10 Sep 2014 17:35:59 +0800 Subject: [PATCH 099/524] Published with https://stackedit.io/ --- ...4\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" index 2e1818f..9294181 100644 --- "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" +++ "b/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -7,7 +7,6 @@ ```Java public class Counter { - protected long count = 0; public void add(long value){ From 422b1c2fd2dbf9b3cbba70d8d2624d38dbf331ea Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 15:50:03 +0800 Subject: [PATCH 100/524] Published with https://stackedit.io/ --- Java-NIO/05.Java NIO Scatter, Gather.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Java-NIO/05.Java NIO Scatter, Gather.md b/Java-NIO/05.Java NIO Scatter, Gather.md index 66f3482..55c571f 100644 --- a/Java-NIO/05.Java NIO Scatter, Gather.md +++ b/Java-NIO/05.Java NIO Scatter, Gather.md @@ -7,13 +7,13 @@ A scattering read from a channel is a read operation that reads data into more t A gathering write to a channel is a write operation that writes data from more than one buffer into a single channel. Thus, the channel "gathers" the data from multiple buffers into one channel. Scatter / gather can be really useful in situations where you need to work with various parts of the transmitted data separately. For instance, if a message consists of a header and a body, you might keep the header and body in separate buffers. Doing so may make it easier for you to work with header and body separately. - Scattering Reads A "scattering read" reads data from a single channel into multiple buffers. Here is an illustration of that principle: Here is an illustration of the Scatter principle: +![Java NIO: Scattering Read](http://tutorials.jenkov.com/images/java-nio/scatter.png) Java NIO: Scattering Read Java NIO: Scattering Read Here is a code example that shows how to perform a scattering read: @@ -32,6 +32,7 @@ Gathering Writes A "gathering write" writes data from multiple buffers into a single channel. Here is an illustration of that principle: +![Java NIO: Gathering Write](http://tutorials.jenkov.com/images/java-nio/gather.png) Java NIO: Gathering Write Java NIO: Gathering Write Here is a code example that shows how to perform a gathering write: From 95be54460ddb74d1856d207294199fb1de627aed Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 16:23:14 +0800 Subject: [PATCH 101/524] Published with https://stackedit.io/ --- Java-NIO/05.Java NIO Scatter, Gather.md | 39 +++++++++++++------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/Java-NIO/05.Java NIO Scatter, Gather.md b/Java-NIO/05.Java NIO Scatter, Gather.md index 55c571f..0d14d07 100644 --- a/Java-NIO/05.Java NIO Scatter, Gather.md +++ b/Java-NIO/05.Java NIO Scatter, Gather.md @@ -1,42 +1,43 @@ #05.Java NIO Scatter, Gather -Java NIO comes with built-in scatter / gather support. Scatter / gather are concepts used in reading from, and writing to channels. +Java NIO开始支持scatter/gater。scatter和gather分别用于从Channel中读取数据和写入数据到Channel中。 -A scattering read from a channel is a read operation that reads data into more than one buffer. Thus, the channel "scatters" the data from the channel into multiple buffers. +**分散(Scatter)**操作是指**将同一个通道(Channel)的数据读到多个缓冲区(Buffer)中**。 -A gathering write to a channel is a write operation that writes data from more than one buffer into a single channel. Thus, the channel "gathers" the data from multiple buffers into one channel. +**聚集(Gather)**是指**将多个缓冲区(Buffer)的数据写入到同一个通道(Channel)中**。 -Scatter / gather can be really useful in situations where you need to work with various parts of the transmitted data separately. For instance, if a message consists of a header and a body, you might keep the header and body in separate buffers. Doing so may make it easier for you to work with header and body separately. -Scattering Reads +分散/聚集(scatter/gather)操作非常适用于一些需要把数据分开几个不同的部分进行处理的场景。例如处理固定大小的header和body的数据,你可以将header和body中的数据分别用不同的缓冲区中进行处理。 -A "scattering read" reads data from a single channel into multiple buffers. Here is an illustration of that principle: +##分散读取(Scattering Reads) -Here is an illustration of the Scatter principle: +分散读取是指**将同一个通道中的数据读到不同的缓冲区中**。如下图所示: ![Java NIO: Scattering Read](http://tutorials.jenkov.com/images/java-nio/scatter.png) -Java NIO: Scattering Read -Java NIO: Scattering Read -Here is a code example that shows how to perform a scattering read: +下面的代码演示了如何使用Scatterring Reads: + +```Java ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; -channel.read(buffers); -Notice how the buffers are first inserted into an array, then the array passed as parameter to the channel.read() method. The read() method then writes data from the channel in the sequence the buffers occur in the array. Once a buffer is full, the channel moves on to fill the next buffer. +channel.read(bufferArray ); +``` + +注意首先要将buffers插入到数组中,然后在再数组作为`channel.read()`的参数。`channel.read()`方法会依次将数组的缓冲区填满,上面的例子中,先填满header缓存区,然后再填满body缓冲区。 -The fact that scattering reads fill up one buffer before moving on to the next, means that it is not suited for dynamically sized message parts. In other words, if you have a header and a body, and the header is fixed size (e.g. 128 bytes), then a scattering read works fine. +由于分散读取(Scattering Reads)在移动到下个缓冲区前,必须填满当前的缓冲区,所以分散操作并不适用于大小不固定的数据体。换言之,上面的例子中,header必须填充128个字节,否则无法正常工作。 -Gathering Writes +##(聚集写入)Gathering Writes -A "gathering write" writes data from multiple buffers into a single channel. Here is an illustration of that principle: +**聚集(Gather)**是指**将多个缓冲区(Buffer)的数据写入到同一个通道(Channel)中**。。如下图所示: ![Java NIO: Gathering Write](http://tutorials.jenkov.com/images/java-nio/gather.png) -Java NIO: Gathering Write -Java NIO: Gathering Write -Here is a code example that shows how to perform a gathering write: +下面的代码演示了如何使用Gathering Writes: + +```Java ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); @@ -45,4 +46,6 @@ ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.write(buffers); +``` + The array of buffers are passed into the write() method, which writes the content of the buffers in the sequence they are encountered in the array. Only the data between position and limit of the buffers is written. Thus, if a buffer has a capacity of 128 bytes, but only contains 58 bytes, only 58 bytes are written from that buffer to the channel. Thus, a gathering write works fine with dynamically sized message parts, in contrast to scattering reads. \ No newline at end of file From 966cf31f42683256b3a34532a2fafe35e84e70f4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 16:34:00 +0800 Subject: [PATCH 102/524] Published with https://stackedit.io/ --- Java-NIO/05.Java NIO Scatter, Gather.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java-NIO/05.Java NIO Scatter, Gather.md b/Java-NIO/05.Java NIO Scatter, Gather.md index 0d14d07..f984a50 100644 --- a/Java-NIO/05.Java NIO Scatter, Gather.md +++ b/Java-NIO/05.Java NIO Scatter, Gather.md @@ -48,4 +48,4 @@ ByteBuffer[] bufferArray = { header, body }; channel.write(buffers); ``` -The array of buffers are passed into the write() method, which writes the content of the buffers in the sequence they are encountered in the array. Only the data between position and limit of the buffers is written. Thus, if a buffer has a capacity of 128 bytes, but only contains 58 bytes, only 58 bytes are written from that buffer to the channel. Thus, a gathering write works fine with dynamically sized message parts, in contrast to scattering reads. \ No newline at end of file +缓冲区数组作为参数传递给`channel.write()`方法,这个方法依次从缓冲区中写入数据到通道中。缓冲区中有效数据才会写入到通道中,例如header缓冲区的容量为128字节,但实际有效数据位58字节,所以实际上header缓冲区中只有前58字节写入到了通道。因此,与分散读取操作不同,聚集写入(Gathering Writes)操作适用于大小不固定的数据块。 From 55eca2574a264b929c167e91e87d9e847e3c8f70 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 16:35:40 +0800 Subject: [PATCH 103/524] Published with https://stackedit.io/ --- ...IO\351\200\211\346\213\251\345\231\250.md" | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 "Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" new file mode 100644 index 0000000..e76b551 --- /dev/null +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -0,0 +1,205 @@ +#06.Java NIO选择器 + +A Selector is a Java NIO component which can examine one or more NIO Channel's, and determine which channels are ready for e.g. reading or writing. This way a single thread can manage multiple channels, and thus multiple network connections. + +Why Use a Selector? + +The advantage of using just a single thread to handle multiple channels is that you need less threads to handle the channels. Actually, you can use just one thread to handle all of your channels. Switching between threads is expensive for an operating system, and each thread takes up some resources (memory) in the operating system too. Therefore, the less threads you use, the better. + +Keep in mind though, that modern operating systems and CPU's become better and better at multitasking, so the overheads of multithreading becomes smaller over time. In fact, if a CPU has multiple cores, you might be wasting CPU power by not multitasking. Anyways, that design discussion belongs in a different text. It suffices to say here, that you can handle multiple channels with a single thread, using a Selector. + +Here is an illustration of a thread using a Selector to handle 3 Channel's: + +Java NIO: Selectors +Java NIO: A Thread uses a Selector to handle 3 Channel's +Creating a Selector + +You create a Selector by calling the Selector.open() method, like this: + +Selector selector = Selector.open(); +Registering Channels with the Selector + +In order to use a Channel with a Selector you must register the Channel with the Selector. This is done using the SelectableChannel.register() method, like this: + +channel.configureBlocking(false); + +SelectionKey key = channel.register(selector, SelectionKey.OP_READ); +The Channel must be in non-blocking mode to be used with a Selector. This means that you cannot use FileChannel's with a Selector since FileChannel's cannot be switched into non-blocking mode. Socket channels will work fine though. + +Notice the second parameter of the register() method. This is an "interest set", meaning what events you are interested in listening for in the Channel, via the Selector. There are four different events you can listen for: + +Connect +Accept +Read +Write +A channel that "fires an event" is also said to be "ready" for that event. So, a channel that has connected successfully to another server is "connect ready". A server socket channel which accepts an incoming connection is "accept" ready. A channel that has data ready to be read is "read" ready. A channel that is ready for you to write data to it, is "write" ready. + +These four events are represented by the four SelectionKey constants: + +SelectionKey.OP_CONNECT +SelectionKey.OP_ACCEPT +SelectionKey.OP_READ +SelectionKey.OP_WRITE +If you are interested in more than one event, OR the constants together, like this: + +int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE; +I'll return to the interest set a bit further down in this text. + +SelectionKey's + +As you saw in the previous section, when you register a Channel with a Selector the register() method returns a SelectionKey objects. This SelectionKey object contains a few interesting properties: + +The interest set +The ready set +The Channel +The Selector +An attached object (optional) +I'll describe these properties below. + +Interest Set + +The interest set is the set of events you are interested in "selecting", as described in the section "Registering Channels with the Selector". You can read and write that interest set via the SelectionKey like this: + +int interestSet = selectionKey.interestOps(); + +boolean isInterestedInAccept = interestSet & SelectionKey.OP_ACCEPT; +boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT; +boolean isInterestedInRead = interestSet & SelectionKey.OP_READ; +boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE; +As you can see, you can AND the interest set with the given SelectionKey constant to find out if a certain event is in the interest set. + +Ready Set + +The ready set is the set of operations the channel is ready for. You will primarily be accessing the ready set after a selection. Selection is explained in a later section. You access the ready set like this: + +int readySet = selectionKey.readyOps(); +You can test in the same way as with the interest set, what events / operations the channel is ready for. But, you can also use these four methods instead, which all reaturn a boolean: + +selectionKey.isAcceptable(); +selectionKey.isConnectable(); +selectionKey.isReadable(); +selectionKey.isWritable(); +Channel + Selector + +Accessing the channel + selector from the SelectionKey is trivial. Here is how it's done: + +Channel channel = selectionKey.channel(); + +Selector selector = selectionKey.selector(); +Attaching Objects + +You can attach an object to a SelectionKey this is a handy way of recognizing a given channel, or attaching further information to the channel. For instance, you may attach the Buffer you are using with the channel, or an object containing more aggregate data. Here is how you attach objects: + +selectionKey.attach(theObject); + +Object attachedObj = selectionKey.attachment(); +You can also attach an object already while registering the Channel with the Selector, in the register() method. Here is how that looks: + +SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); +Selecting Channels via a Selector + +Once you have register one or more channels with a Selector you can call one of the select() methods. These methods return the channels that are "ready" for the events you are interested in (connect, accept, read or write). In other words, if you are interested in channels that are ready for reading, you will receive the channels that are ready for reading from the select() methods. + +Here are the select() methods: + +int select() +int select(long timeout) +int selectNow() +select() blocks until at least one channel is ready for the events you registered for. + +select(long timeout) does the same as select() except it blocks for a maximum of timeout milliseconds (the parameter). + +selectNow() doesn't block at all. It returns immediately with whatever channels are ready. + +The int returned by the select() methods tells how many channels are ready. That is, how many channels that became ready since last time you called select(). If you call select() and it returns 1 because one channel has become ready, and you call select() one more time, and one more channel has become ready, it will return 1 again. If you have done nothing with the first channel that was ready, you now have 2 ready channels, but only one channel had become ready between each select() call. + +selectedKeys() + +Once you have called one of the select() methods and its return value has indicated that one or more channels are ready, you can access the ready channels via the "selected key set", by calling the selectors selectedKeys() method. Here is how that looks: + +Set selectedKeys = selector.selectedKeys(); +When you register a channel with a Selector the Channel.register() method returns a SelectionKey object. This key represents that channels registration with that selector. It is these keys you can access via the selectedKeySet() method. From the SelectionKey. + +You can iterate this selected key set to access the ready channels. Here is how that looks: + +Set selectedKeys = selector.selectedKeys(); + +Iterator keyIterator = selectedKeys.iterator(); + +while(keyIterator.hasNext()) { + + SelectionKey key = keyIterator.next(); + + if(key.isAcceptable()) { + // a connection was accepted by a ServerSocketChannel. + + } else if (key.isConnectable()) { + // a connection was established with a remote server. + + } else if (key.isReadable()) { + // a channel is ready for reading + + } else if (key.isWritable()) { + // a channel is ready for writing + } + + keyIterator.remove(); +} +This loop iterates the keys in the selected key set. For each key it tests the key to determine what the channel referenced by the key is ready for. + +Notice the keyIterator.remove() call at the end of each iteration. The Selector does not remove the SelectionKey instances from the selected key set itself. You have to do this, when you are done processing the channel. The next time the channel becomes "ready" the Selector will add it to the selected key set again. + +The channel returned by the SelectionKey.channel() method should be cast to the channel you need to work with, e.g a ServerSocketChannel or SocketChannel etc. + +wakeUp() + +A thread that has called the select() method which is blocked, can be made to leave the select() method, even if no channels are yet ready. This is done by having a different thread call the Selector.wakeup() method on the Selector which the first thread has called select() on. The thread waiting inside select() will then return immediately. + +If a different thread calls wakeup() and no thread is currently blocked inside select(), the next thread that calls select() will "wake up" immediately. + +close() + +When you are finished with the Selector you call its close() method. This closes the Selector and invalidates all SelectionKey instances registered with this Selector. The channels themselves are not closed. + +Full Selector Example + +Here is a full example which opens a Selector, registers a channel with it (the channel instantiation is left out), and keeps monitoring the Selector for "readiness" of the four events (accept, connect, read, write). + +Selector selector = Selector.open(); + +channel.configureBlocking(false); + +SelectionKey key = channel.register(selector, SelectionKey.OP_READ); + + +while(true) { + + int readyChannels = selector.select(); + + if(readyChannels == 0) continue; + + + Set selectedKeys = selector.selectedKeys(); + + Iterator keyIterator = selectedKeys.iterator(); + + while(keyIterator.hasNext()) { + + SelectionKey key = keyIterator.next(); + + if(key.isAcceptable()) { + // a connection was accepted by a ServerSocketChannel. + + } else if (key.isConnectable()) { + // a connection was established with a remote server. + + } else if (key.isReadable()) { + // a channel is ready for reading + + } else if (key.isWritable()) { + // a channel is ready for writing + } + + keyIterator.remove(); + } +} \ No newline at end of file From f0519c572b1b9078fb99e64629fa05badcfa9b15 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 16:36:58 +0800 Subject: [PATCH 104/524] Published with https://stackedit.io/ --- "Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index e76b551..9a8f321 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -11,6 +11,9 @@ Keep in mind though, that modern operating systems and CPU's become better and b Here is an illustration of a thread using a Selector to handle 3 Channel's: Java NIO: Selectors + +![Java NIO: A Thread uses a Selector to handle 3 Channel's](http://tutorials.jenkov.com/images/java-nio/overview-selectors.png) + Java NIO: A Thread uses a Selector to handle 3 Channel's Creating a Selector From 9fe1219ca35a072d673ef39577ad2150d6708ade Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 16:38:45 +0800 Subject: [PATCH 105/524] Published with https://stackedit.io/ --- ...NIO\351\200\211\346\213\251\345\231\250.md" | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index 9a8f321..537b862 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -2,7 +2,7 @@ A Selector is a Java NIO component which can examine one or more NIO Channel's, and determine which channels are ready for e.g. reading or writing. This way a single thread can manage multiple channels, and thus multiple network connections. -Why Use a Selector? +##Why Use a Selector? The advantage of using just a single thread to handle multiple channels is that you need less threads to handle the channels. Actually, you can use just one thread to handle all of your channels. Switching between threads is expensive for an operating system, and each thread takes up some resources (memory) in the operating system too. Therefore, the less threads you use, the better. @@ -10,10 +10,12 @@ Keep in mind though, that modern operating systems and CPU's become better and b Here is an illustration of a thread using a Selector to handle 3 Channel's: -Java NIO: Selectors +##Java NIO: Selectors ![Java NIO: A Thread uses a Selector to handle 3 Channel's](http://tutorials.jenkov.com/images/java-nio/overview-selectors.png) +![enter image description here](http://tutorials.jenkov.com/images/java-nio/overview-selectors.png) + Java NIO: A Thread uses a Selector to handle 3 Channel's Creating a Selector @@ -48,7 +50,7 @@ If you are interested in more than one event, OR the constants together, like th int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE; I'll return to the interest set a bit further down in this text. -SelectionKey's +##SelectionKey's As you saw in the previous section, when you register a Channel with a Selector the register() method returns a SelectionKey objects. This SelectionKey object contains a few interesting properties: @@ -59,7 +61,7 @@ The Selector An attached object (optional) I'll describe these properties below. -Interest Set +###Interest Set The interest set is the set of events you are interested in "selecting", as described in the section "Registering Channels with the Selector". You can read and write that interest set via the SelectionKey like this: @@ -71,7 +73,7 @@ boolean isInterestedInRead = interestSet & SelectionKey.OP_READ; boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE; As you can see, you can AND the interest set with the given SelectionKey constant to find out if a certain event is in the interest set. -Ready Set +###Ready Set The ready set is the set of operations the channel is ready for. You will primarily be accessing the ready set after a selection. Selection is explained in a later section. You access the ready set like this: @@ -154,17 +156,17 @@ Notice the keyIterator.remove() call at the end of each iteration. The Selector The channel returned by the SelectionKey.channel() method should be cast to the channel you need to work with, e.g a ServerSocketChannel or SocketChannel etc. -wakeUp() +###wakeUp() A thread that has called the select() method which is blocked, can be made to leave the select() method, even if no channels are yet ready. This is done by having a different thread call the Selector.wakeup() method on the Selector which the first thread has called select() on. The thread waiting inside select() will then return immediately. If a different thread calls wakeup() and no thread is currently blocked inside select(), the next thread that calls select() will "wake up" immediately. -close() +###close() When you are finished with the Selector you call its close() method. This closes the Selector and invalidates all SelectionKey instances registered with this Selector. The channels themselves are not closed. -Full Selector Example +##Full Selector Example Here is a full example which opens a Selector, registers a channel with it (the channel instantiation is left out), and keeps monitoring the Selector for "readiness" of the four events (accept, connect, read, write). From 9d2946a885342cf044ef199d0573db0afb6adb9c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 17:01:38 +0800 Subject: [PATCH 106/524] Published with https://stackedit.io/ --- ...IO\351\200\211\346\213\251\345\231\250.md" | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index 537b862..bf4e7db 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -1,28 +1,29 @@ #06.Java NIO选择器 -A Selector is a Java NIO component which can examine one or more NIO Channel's, and determine which channels are ready for e.g. reading or writing. This way a single thread can manage multiple channels, and thus multiple network connections. +选择器(Selector)是Java NIO中的一个组件,它用于检测一个或多个通道,并确定哪些通道可以进行读、写。这就是为什么Java NIO中可以使用单个线程对多个通道或网络连接进行管理。 -##Why Use a Selector? -The advantage of using just a single thread to handle multiple channels is that you need less threads to handle the channels. Actually, you can use just one thread to handle all of your channels. Switching between threads is expensive for an operating system, and each thread takes up some resources (memory) in the operating system too. Therefore, the less threads you use, the better. +##为何要使用选择器(Why Use a Selector?) -Keep in mind though, that modern operating systems and CPU's become better and better at multitasking, so the overheads of multithreading becomes smaller over time. In fact, if a CPU has multiple cores, you might be wasting CPU power by not multitasking. Anyways, that design discussion belongs in a different text. It suffices to say here, that you can handle multiple channels with a single thread, using a Selector. +使用选择器的优势在于:**使用单个线程就可以对多个管道进行操作,从而可以减少处理通道的线程数量**。实际上,你可以仅仅使用一个线程来处理所有的通道。在操作系统中,线程的切换是非常昂贵的,并且,每个线程需要消耗一定的系统资源(例如内存)。因此,线程使用越少越好。 -Here is an illustration of a thread using a Selector to handle 3 Channel's: +不过,随着操作系统软硬件的更新迭代,多线程的开销越来越小,性能也越来越优异。而事实上,如果计算机拥有多个CPU内核,这时候如果不采用多线程,反而是对CPU资源的浪费。然而,这已不属于本教程讨论的范畴。 -##Java NIO: Selectors +下面的图片描绘了如何使用一个选择器来处理3个通道: ![Java NIO: A Thread uses a Selector to handle 3 Channel's](http://tutorials.jenkov.com/images/java-nio/overview-selectors.png) -![enter image description here](http://tutorials.jenkov.com/images/java-nio/overview-selectors.png) +##创建选择器(Creating a Selector) -Java NIO: A Thread uses a Selector to handle 3 Channel's -Creating a Selector - -You create a Selector by calling the Selector.open() method, like this: +可以通过`Selector.open()`方法来创建选择器: +```Java Selector selector = Selector.open(); -Registering Channels with the Selector +``` + +#Registering Channels with the Selector + + In order to use a Channel with a Selector you must register the Channel with the Selector. This is done using the SelectableChannel.register() method, like this: From 01b8d93b42fdb45d9cb0c0b7086faaaeafb32acd Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 17:11:36 +0800 Subject: [PATCH 107/524] Published with https://stackedit.io/ --- ...a NIO\351\200\211\346\213\251\345\231\250.md" | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index bf4e7db..308b6aa 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -23,14 +23,22 @@ Selector selector = Selector.open(); #Registering Channels with the Selector +为了让选择器能够处理通道,必须向选择器注册需要处理的通道,调用`SelectableChannel.register()`方法来完成注册: - -In order to use a Channel with a Selector you must register the Channel with the Selector. This is done using the SelectableChannel.register() method, like this: - +``` channel.configureBlocking(false); SelectionKey key = channel.register(selector, SelectionKey.OP_READ); -The Channel must be in non-blocking mode to be used with a Selector. This means that you cannot use FileChannel's with a Selector since FileChannel's cannot be switched into non-blocking mode. Socket channels will work fine though. +``` + +注册的通道必须先设置为**非阻塞模式(non-blocking mode)**。由于**FileChannel**不能设置为非阻塞模式,所以FileChannel不能进行注册,而**SocketChanne**l则可以。 + +注意`SelectableChannel.register()`方法的第二个参数。这个参数代表着**选择器需要监听通道的事件类型**。总共有四种不同的事件类型: + + - Connect + - Accept + - Read + - Write Notice the second parameter of the register() method. This is an "interest set", meaning what events you are interested in listening for in the Channel, via the Selector. There are four different events you can listen for: From 45c62bda1cbfebf936159ebeb1a54d1d16298846 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 17:30:22 +0800 Subject: [PATCH 108/524] Published with https://stackedit.io/ --- ...IO\351\200\211\346\213\251\345\231\250.md" | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index 308b6aa..fe94782 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -35,29 +35,23 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ); 注意`SelectableChannel.register()`方法的第二个参数。这个参数代表着**选择器需要监听通道的事件类型**。总共有四种不同的事件类型: - - Connect - - Accept - - Read - - Write +通道**触发一个事件**,我们称之为**事件就绪**。所以,如果通道跟远程服务器建立了连接,称之为**连接就绪**;服务器socket接受客户端连接,称为**接收就绪**;通道中有数据可读,称为**读就绪**,可向通道中写数据,称为**写就绪**。 -Notice the second parameter of the register() method. This is an "interest set", meaning what events you are interested in listening for in the Channel, via the Selector. There are four different events you can listen for: - -Connect -Accept -Read -Write -A channel that "fires an event" is also said to be "ready" for that event. So, a channel that has connected successfully to another server is "connect ready". A server socket channel which accepts an incoming connection is "accept" ready. A channel that has data ready to be read is "read" ready. A channel that is ready for you to write data to it, is "write" ready. - -These four events are represented by the four SelectionKey constants: +以上四个事件分别由`SelectionKey`类中的四个常量来表示: +```Java SelectionKey.OP_CONNECT SelectionKey.OP_ACCEPT SelectionKey.OP_READ SelectionKey.OP_WRITE -If you are interested in more than one event, OR the constants together, like this: +``` -int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE; -I'll return to the interest set a bit further down in this text. +如果需要监听多个事件,可以使用OR操作符: + +```Java +int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE; +``` +由于SelectionKey中是四个常量OP\_READ、OP\_WRITE、OP\_CONNECT、OP\_ACCEPTF分别用二进制0001、0010、0100、1000表示,所以可以通过interestSet中的二进制判断监听的事件类型。 ##SelectionKey's From 342052f4ebf52897f6139dbeba69ba7d5c30ff77 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 17:35:57 +0800 Subject: [PATCH 109/524] Published with https://stackedit.io/ --- ...va NIO\351\200\211\346\213\251\345\231\250.md" | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index fe94782..8ec980e 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -55,17 +55,20 @@ int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE; ##SelectionKey's -As you saw in the previous section, when you register a Channel with a Selector the register() method returns a SelectionKey objects. This SelectionKey object contains a few interesting properties: +上面的例子中,当调用`SelectableChannel.register()`向选择器注册通道后,该返回会返回一个`SeletionKey`对象。该`SelectionKey`对象包含以下属性: -The interest set -The ready set -The Channel -The Selector +``` +The interest set(监听的事件集合) +The ready set(就绪的事件集合) +The Channel(通道) +The Selector(选择器) An attached object (optional) -I'll describe these properties below. +``` ###Interest Set + + The interest set is the set of events you are interested in "selecting", as described in the section "Registering Channels with the Selector". You can read and write that interest set via the SelectionKey like this: int interestSet = selectionKey.interestOps(); From 1d0e50221f144b6c12b10a4a443c5cc020d12aae Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 17:44:50 +0800 Subject: [PATCH 110/524] Published with https://stackedit.io/ --- ...IO\351\200\211\346\213\251\345\231\250.md" | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index 8ec980e..4d0af7c 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -65,57 +65,71 @@ The Selector(选择器) An attached object (optional) ``` -###Interest Set +###Interest Set(监听的事件集合) +InterestSet表示的是监听的时间集合,可以通过`SelctionKey.interestOPs()`方法获取监听的时间集合,它是一个int类型数据,由于SelectionKey中是四个常量OP\_READ、OP\_WRITE、OP\_CONNECT、OP\_ACCEPTF分别用二进制0001、0010、0100、1000表示,所以,我们可以通过**按位与**操作判断监听的事件类型: - -The interest set is the set of events you are interested in "selecting", as described in the section "Registering Channels with the Selector". You can read and write that interest set via the SelectionKey like this: - +```Java int interestSet = selectionKey.interestOps(); boolean isInterestedInAccept = interestSet & SelectionKey.OP_ACCEPT; boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT; boolean isInterestedInRead = interestSet & SelectionKey.OP_READ; -boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE; -As you can see, you can AND the interest set with the given SelectionKey constant to find out if a certain event is in the interest set. +boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE; +``` -###Ready Set +###Ready Set(就绪集合) -The ready set is the set of operations the channel is ready for. You will primarily be accessing the ready set after a selection. Selection is explained in a later section. You access the ready set like this: +可以通过`SelectionKey.readyOps()`方法获取就绪集合。同样地,通过按位与操作判断就绪的事件类型: +```Java int readySet = selectionKey.readyOps(); -You can test in the same way as with the interest set, what events / operations the channel is ready for. But, you can also use these four methods instead, which all reaturn a boolean: selectionKey.isAcceptable(); selectionKey.isConnectable(); selectionKey.isReadable(); selectionKey.isWritable(); -Channel + Selector +``` + + +###Channel + Selector(通道和选择器) Accessing the channel + selector from the SelectionKey is trivial. Here is how it's done: +```Java Channel channel = selectionKey.channel(); Selector selector = selectionKey.selector(); -Attaching Objects +``` + +###Attaching Objects You can attach an object to a SelectionKey this is a handy way of recognizing a given channel, or attaching further information to the channel. For instance, you may attach the Buffer you are using with the channel, or an object containing more aggregate data. Here is how you attach objects: +```Java selectionKey.attach(theObject); Object attachedObj = selectionKey.attachment(); +``` + You can also attach an object already while registering the Channel with the Selector, in the register() method. Here is how that looks: +```Java SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); -Selecting Channels via a Selector +``` + +##Selecting Channels via a Selector Once you have register one or more channels with a Selector you can call one of the select() methods. These methods return the channels that are "ready" for the events you are interested in (connect, accept, read or write). In other words, if you are interested in channels that are ready for reading, you will receive the channels that are ready for reading from the select() methods. Here are the select() methods: +```Java int select() int select(long timeout) int selectNow() +``` + select() blocks until at least one channel is ready for the events you registered for. select(long timeout) does the same as select() except it blocks for a maximum of timeout milliseconds (the parameter). @@ -128,11 +142,15 @@ selectedKeys() Once you have called one of the select() methods and its return value has indicated that one or more channels are ready, you can access the ready channels via the "selected key set", by calling the selectors selectedKeys() method. Here is how that looks: +```Java Set selectedKeys = selector.selectedKeys(); +``` + When you register a channel with a Selector the Channel.register() method returns a SelectionKey object. This key represents that channels registration with that selector. It is these keys you can access via the selectedKeySet() method. From the SelectionKey. You can iterate this selected key set to access the ready channels. Here is how that looks: +```Java Set selectedKeys = selector.selectedKeys(); Iterator keyIterator = selectedKeys.iterator(); @@ -156,6 +174,8 @@ while(keyIterator.hasNext()) { keyIterator.remove(); } +``` + This loop iterates the keys in the selected key set. For each key it tests the key to determine what the channel referenced by the key is ready for. Notice the keyIterator.remove() call at the end of each iteration. The Selector does not remove the SelectionKey instances from the selected key set itself. You have to do this, when you are done processing the channel. The next time the channel becomes "ready" the Selector will add it to the selected key set again. @@ -182,7 +202,7 @@ channel.configureBlocking(false); SelectionKey key = channel.register(selector, SelectionKey.OP_READ); - +```Java while(true) { int readyChannels = selector.select(); @@ -213,4 +233,5 @@ while(true) { keyIterator.remove(); } -} \ No newline at end of file +} +``` \ No newline at end of file From 8facf9658346d4acbdbdcd4cab8bc599abfbc599 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 17:56:31 +0800 Subject: [PATCH 111/524] Published with https://stackedit.io/ --- ...ava NIO\351\200\211\346\213\251\345\231\250.md" | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index 4d0af7c..d3ee446 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -120,15 +120,13 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); ##Selecting Channels via a Selector -Once you have register one or more channels with a Selector you can call one of the select() methods. These methods return the channels that are "ready" for the events you are interested in (connect, accept, read or write). In other words, if you are interested in channels that are ready for reading, you will receive the channels that are ready for reading from the select() methods. + 当向选择器注册一个或多个通道后,可以调用`Selector.slect(...)`方法,这个返回会当前已经就绪的通道(说明该通道有选择器监听的事件就绪)。换言之,如果选择器监听了一个通道的读事件,当该通道有数据可读时,`Selector.select(...)`操作就会返回该通道。 + +有多个重载的`select()`方法: -Here are the select() methods: - -```Java -int select() -int select(long timeout) -int selectNow() -``` +> int select() +> int select(long timeout) +> int selectNow() select() blocks until at least one channel is ready for the events you registered for. From c7b87e1c9615525ae2ebf5883f8d48d44ad8f0c6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 18:00:01 +0800 Subject: [PATCH 112/524] Published with https://stackedit.io/ --- .../06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index d3ee446..adc4d88 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -128,6 +128,14 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); > int select(long timeout) > int selectNow() +`select()`方法会阻塞直到有通道事件就绪。 + +`select(long timeout)`方法会阻塞直到有通道事件就绪或超时。 + +`selectNow()`方法不管有没有通道事件就绪,都会立即返回。 + + + select() blocks until at least one channel is ready for the events you registered for. select(long timeout) does the same as select() except it blocks for a maximum of timeout milliseconds (the parameter). From 384f28d4ed30382244030794405d9cc206720faf Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 18:13:38 +0800 Subject: [PATCH 113/524] Published with https://stackedit.io/ --- .../06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index adc4d88..d75ada0 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -120,7 +120,7 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); ##Selecting Channels via a Selector - 当向选择器注册一个或多个通道后,可以调用`Selector.slect(...)`方法,这个返回会当前已经就绪的通道(说明该通道有选择器监听的事件就绪)。换言之,如果选择器监听了一个通道的读事件,当该通道有数据可读时,`Selector.select(...)`操作就会返回该通道。 + 当向选择器注册一个或多个通道后,可以调用`Selector.slect(...)`方法,这个返回会当前已经就绪的通道(说明该通道有选择器监听的事件就绪)的个数。换言之,如果选择器监听了一个通道的读事件,当该通道有数据可读时,`Selector.select(...)`操作就会返回 1。 有多个重载的`select()`方法: @@ -142,9 +142,11 @@ select(long timeout) does the same as select() except it blocks for a maximum of selectNow() doesn't block at all. It returns immediately with whatever channels are ready. + + The int returned by the select() methods tells how many channels are ready. That is, how many channels that became ready since last time you called select(). If you call select() and it returns 1 because one channel has become ready, and you call select() one more time, and one more channel has become ready, it will return 1 again. If you have done nothing with the first channel that was ready, you now have 2 ready channels, but only one channel had become ready between each select() call. -selectedKeys() +###selectedKeys() Once you have called one of the select() methods and its return value has indicated that one or more channels are ready, you can access the ready channels via the "selected key set", by calling the selectors selectedKeys() method. Here is how that looks: From 53e0fe2f8ebc19f86166f671176c8a466954a7a4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 18:16:11 +0800 Subject: [PATCH 114/524] Published with https://stackedit.io/ --- ...06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 10 ---------- 1 file changed, 10 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index d75ada0..f8136cd 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -134,16 +134,6 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); `selectNow()`方法不管有没有通道事件就绪,都会立即返回。 - - -select() blocks until at least one channel is ready for the events you registered for. - -select(long timeout) does the same as select() except it blocks for a maximum of timeout milliseconds (the parameter). - -selectNow() doesn't block at all. It returns immediately with whatever channels are ready. - - - The int returned by the select() methods tells how many channels are ready. That is, how many channels that became ready since last time you called select(). If you call select() and it returns 1 because one channel has become ready, and you call select() one more time, and one more channel has become ready, it will return 1 again. If you have done nothing with the first channel that was ready, you now have 2 ready channels, but only one channel had become ready between each select() call. ###selectedKeys() From 830176ab93769ea8c15a0e7a58161b25f3557094 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 18:23:27 +0800 Subject: [PATCH 115/524] Published with https://stackedit.io/ --- "Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index f8136cd..f315a3f 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -134,7 +134,7 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); `selectNow()`方法不管有没有通道事件就绪,都会立即返回。 -The int returned by the select() methods tells how many channels are ready. That is, how many channels that became ready since last time you called select(). If you call select() and it returns 1 because one channel has become ready, and you call select() one more time, and one more channel has become ready, it will return 1 again. If you have done nothing with the first channel that was ready, you now have 2 ready channels, but only one channel had become ready between each select() call. +`select()`返回值为int类型,代表从上次调用`select()`方法到现在的就绪通道数量。当你调用select返回1时,则代表上次调用select方法到这次调用之间有一个通道变成了就绪状态,然后,再次调用select方法,如果返回值为1,则说明又有一个通道变成了就绪状态。如果你没对第一个就绪通道进行处理,则此时共有两个就绪通道,虽然最后一次select的返回值为1。 ###selectedKeys() From 09ce0d13195683d65dcb2e02d79a6e778698f178 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 18:39:15 +0800 Subject: [PATCH 116/524] Published with https://stackedit.io/ --- .../06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index f315a3f..bf8a103 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -134,16 +134,18 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); `selectNow()`方法不管有没有通道事件就绪,都会立即返回。 -`select()`返回值为int类型,代表从上次调用`select()`方法到现在的就绪通道数量。当你调用select返回1时,则代表上次调用select方法到这次调用之间有一个通道变成了就绪状态,然后,再次调用select方法,如果返回值为1,则说明又有一个通道变成了就绪状态。如果你没对第一个就绪通道进行处理,则此时共有两个就绪通道,虽然最后一次select的返回值为1。 +`select()`返回值为int类型,代表从上次调用`select()`方法到这次的就绪通道数量。当你调用select返回1时,则代表上次调用select方法到这次调用之间有一个通道变成了就绪状态,然后,再次调用select方法,如果返回值为1,则说明又有一个通道变成了就绪状态。如果你没对第一个就绪通道进行处理,则此时共有两个就绪通道,虽然最后一次select的返回值为1。 ###selectedKeys() -Once you have called one of the select() methods and its return value has indicated that one or more channels are ready, you can access the ready channels via the "selected key set", by calling the selectors selectedKeys() method. Here is how that looks: +当你调用select()方法返回值不为0时,则说明有一个或多个通道已经就绪。你可以通过调用`selector.selectedKeys()`获取就绪的通道: ```Java Set selectedKeys = selector.selectedKeys(); ``` +当你通过`SelectableChannel.register()`注册通道时,返回一个SeletionKey对象。 + When you register a channel with a Selector the Channel.register() method returns a SelectionKey object. This key represents that channels registration with that selector. It is these keys you can access via the selectedKeySet() method. From the SelectionKey. You can iterate this selected key set to access the ready channels. Here is how that looks: From 378442cbd00d586ddf2e7e99aa9af677c1009569 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 21:07:48 +0800 Subject: [PATCH 117/524] Published with https://stackedit.io/ --- ...04\346\272\220\345\205\261\344\272\253.md" | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" new file mode 100644 index 0000000..a63c446 --- /dev/null +++ "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" @@ -0,0 +1,93 @@ +#06.线程安全与资源共享(Thread Safety and Shared Resources) + +Code that is safe to call by multiple threads simultanously is called thread safe. If a piece of code is thread safe, then it contains no race conditions. Race condition only occur when multiple threads update shared resources. Therefore it is important to know what resources Java threads share when executing. + +##局部变量(Local Variables) + +Local variables are stored in each thread's own stack. That means that local variables are never shared between threads. That also means that all local primitive variables are thread safe. Here is an example of a thread safe local primitive variable: + +public void someMethod(){ + + long threadSafeInt = 0; + + threadSafeInt++; +} + +## 本地变量引用(Local Object References) + +Local references to objects are a bit different. The reference itself is not shared. The object referenced however, is not stored in each threads's local stack. All objects are stored in the shared heap. If an object created locally never escapes the method it was created in, it is thread safe. In fact you can also pass it on to other methods and objects as long as none of these methods or objects make the passed object available to other threads. Here is an example of a thread safe local object: + +public void someMethod(){ + + LocalObject localObject = new LocalObject(); + + localObject.callMethod(); + method2(localObject); +} + +public void method2(LocalObject localObject){ + localObject.setValue("value"); +} + +The LocalObject instance in this example is not returned from the method, nor is it passed to any other objects that are accessible from outside the someMethod() method. Each thread executing the someMethod() method will create its own LocalObject instance and assign it to the localObject reference. Therefore the use of the LocalObject here is thread safe. In fact, the whole method someMethod() is thread safe. Even if the LocalObject instance is passed as parameter to other methods in the same class, or in other classes, the use of it is thread safe. The only exception is of course, if one of the methods called with the LocalObject as parameter, stores the LocalObject instance in a way that allows access to it from other threads. + +##对象成员(Object Members) + +Object members are stored on the heap along with the object. Therefore, if two threads call a method on the same object instance and this method updates object members, the method is not thread safe. Here is an example of a method that is not thread safe: + + +public class NotThreadSafe{ + StringBuilder builder = new StringBuilder(); + + public add(String text){ + this.builder.append(text); + } +} +If two threads call the add() method simultanously on the same NotThreadSafe instance then it leads to race conditions. For instance: + + +NotThreadSafe sharedInstance = new NotThreadSafe(); + +new Thread(new MyRunnable(sharedInstance)).start(); +new Thread(new MyRunnable(sharedInstance)).start(); + +public class MyRunnable implements Runnable{ + NotThreadSafe instance = null; + + public MyRunnable(NotThreadSafe instance){ + this.instance = instance; + } + + public void run(){ + this.instance.add("some text"); + } +} +Notice how the two MyRunnable instances share the same NotThreadSafe instance. Therefore, when they call the add() method on the NotThreadSafe instance it leads to race condition. + +However, if two threads call the add() method simultanously on different instances then it does not lead to race condition. Here is the example from before, but slightly modified: + +new Thread(new MyRunnable(new NotThreadSafe())).start(); +new Thread(new MyRunnable(new NotThreadSafe())).start(); +Now the two threads have each their own instance of NotThreadSafe so their calls to the add method doesn't interfere with each other. The code does not have race condition anymore. So, even if an object is not thread safe it can still be used in a way that doesn't lead to race condition. + +##The Thread Control Escape Rule + +When trying to determine if your code's access of a certain resource is thread safe you can use the thread control escape rule: + +If a resource is created, used and disposed within +the control of the same thread, +and never escapes the control of this thread, +the use of that resource is thread safe. +Resources can be any shared resource like an object, array, file, database connection, socket etc. In Java you do not always explicitly dispose objects, so "disposed" means losing or null'ing the reference to the object. + +Even if the use of an object is thread safe, if that object points to a shared resource like a file or database, your application as a whole may not be thread safe. For instance, if thread 1 and thread 2 each create their own database connections, connection 1 and connection 2, the use of each connection itself is thread safe. But the use of the database the connections point to may not be thread safe. For example, if both threads execute code like this: + +check if record X exists +if not, insert record X +If two threads execute this simultanously, and the record X they are checking for happens to be the same record, there is a risk that both of the threads end up inserting it. This is how: + +Thread 1 checks if record X exists. Result = no +Thread 2 checks if record X exists. Result = no +Thread 1 inserts record X +Thread 2 inserts record X +This could also happen with threads operating on files or other shared resources. Therefore it is important to distinguish between whether an object controlled by a thread is the resource, or if it merely references the resource. \ No newline at end of file From 0c70ea004dfa5ad43bca38afaf708581d7f68530 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 21:12:54 +0800 Subject: [PATCH 118/524] Published with https://stackedit.io/ --- ...14\344\270\215\345\217\230\346\200\247.md" | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" diff --git "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" new file mode 100644 index 0000000..b865b41 --- /dev/null +++ "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" @@ -0,0 +1,64 @@ +#07.线程安全和不变性 + +Race conditions occur only if multiple threads are accessing the same resource, and one or more of the threads write to the resource. If multiple threads read the same resource race conditions do not occur. + +We can make sure that objects shared between threads are never updated by any of the threads by making the shared objects immutable, and thereby thread safe. Here is an example: + +public class ImmutableValue{ + + private int value = 0; + + public ImmutableValue(int value){ + this.value = value; + } + + public int getValue(){ + return this.value; + } +} +Notice how the value for the ImmutableValue instance is passed in the constructor. Notice also how there is no setter method. Once an ImmutableValue instance is created you cannot change its value. It is immutable. You can read it however, using the getValue() method. + +If you need to perform operations on the ImmutableValue instance you can do so by returning a new instance with the value resulting from the operation. Here is an example of an add operation: + +public class ImmutableValue{ + + private int value = 0; + + public ImmutableValue(int value){ + this.value = value; + } + + public int getValue(){ + return this.value; + } + + + public ImmutableValue add(int valueToAdd){ + return new ImmutableValue(this.value + valueToAdd); + } + +} +Notice how the add() method returns a new ImmutableValue instance with the result of the add operation, rather than adding the value to itself. + +The Reference is not Thread Safe! + +It is important to remember, that even if an object is immutable and thereby thread safe, the reference to this object may not be thread safe. Look at this example: + +public class Calculator{ + private ImmutableValue currentValue = null; + + public ImmutableValue getValue(){ + return currentValue; + } + + public void setValue(ImmutableValue newValue){ + this.currentValue = newValue; + } + + public void add(int newValue){ + this.currentValue = this.currentValue.add(newValue); + } +} +The Calculator class holds a reference to an ImmutableValue instance. Notice how it is possible to change that reference through both the setValue() and add() methods. Therefore, even if the Calculator class uses an immutable object internally, it is not itself immutable, and therefore not thread safe. In other words: The ImmutableValue class is thread safe, but the use of it is not. This is something to keep in mind when trying to achieve thread safety through immutability. + +To make the Calculator class thread safe you could have declared the getValue(), setValue(), and add() methods synchronized. That would have done the trick. From ecbfe77e8e3314257587606a526a518862683699 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 21:14:33 +0800 Subject: [PATCH 119/524] Published with https://stackedit.io/ --- ...\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" index b865b41..32f5775 100644 --- "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" +++ "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" @@ -40,7 +40,7 @@ public class ImmutableValue{ } Notice how the add() method returns a new ImmutableValue instance with the result of the add operation, rather than adding the value to itself. -The Reference is not Thread Safe! +##The Reference is not Thread Safe! It is important to remember, that even if an object is immutable and thereby thread safe, the reference to this object may not be thread safe. Look at this example: From 49fc27385eccce564ad7ad25cb95d6427945af55 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 21:16:41 +0800 Subject: [PATCH 120/524] Published with https://stackedit.io/ --- ...va\345\220\214\346\255\245\345\235\227.md" | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" new file mode 100644 index 0000000..2c76b6b --- /dev/null +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -0,0 +1,161 @@ +#08.Java同步块 + +A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. + +The Java synchronized Keyword + +Synchronized blocks in Java are marked with the synchronized keyword. A synchronized block in Java is synchronized on some object. All synchronized blocks synchronized on the same object can only have one thread executing inside them at the same time. All other threads attempting to enter the synchronized block are blocked until the thread inside the synchronized block exits the block. + +The synchronized keyword can be used to mark four different types of blocks: + +Instance methods +Static methods +Code blocks inside instance methods +Code blocks inside static methods +These blocks are synchronized on different objects. Which type of synchronized block you need depends on the concrete situation. + +Synchronized Instance Methods + +Here is a synchronized instance method: + + public synchronized void add(int value){ + this.count += value; + } +Notice the use of the synchronized keyword in the method declaration. This tells Java that the method is synchronized. + +A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. + +Synchronized Static Methods + +Static methods are marked as synchronized just like instance methods using the synchronized keyword. Here is a Java synchronized static method example: + + public static synchronized void add(int value){ + count += value; + } +Also here the synchronized keyword tells Java that the method is synchronized. + +Synchronized static methods are synchronized on the class object of the class the synchronized static method belongs to. Since only one class object exists in the Java VM per class, only one thread can execute inside a static synchronized method in the same class. + +If the static synchronized methods are located in different classes, then one thread can execute inside the static synchronized methods of each class. One thread per class regardless of which static synchronized method it calls. + +Synchronized Blocks in Instance Methods + +You do not have to synchronize a whole method. Sometimes it is preferable to synchronize only part of a method. Java synchronized blocks inside methods makes this possible. + +Here is a synchronized block of Java code inside an unsynchronized Java method: + + public void add(int value){ + + synchronized(this){ + this.count += value; + } + } +This example uses the Java synchronized block construct to mark a block of code as synchronized. This code will now execute as if it was a synchronized method. + +Notice how the Java synchronized block construct takes an object in parentheses. In the example "this" is used, which is the instance the add method is called on. The object taken in the parentheses by the synchronized construct is called a monitor object. The code is said to be synchronized on the monitor object. A synchronized instance method uses the object it belongs to as monitor object. + +Only one thread can execute inside a Java code block synchronized on the same monitor object. + +The following two examples are both synchronized on the instance they are called on. They are therefore equivalent with respect to synchronization: + + + public class MyClass { + + public synchronized void log1(String msg1, String msg2){ + log.writeln(msg1); + log.writeln(msg2); + } + + + public void log2(String msg1, String msg2){ + synchronized(this){ + log.writeln(msg1); + log.writeln(msg2); + } + } + } +Thus only a single thread can execute inside either of the two synchronized blocks in this example. + +Had the second synchronized block been synchronized on a different object than this, then one thread at a time had been able to execute inside each method. + +Synchronized Blocks in Static Methods + +Here are the same two examples as static methods. These methods are synchronized on the class object of the class the methods belong to: + + public class MyClass { + + public static synchronized void log1(String msg1, String msg2){ + log.writeln(msg1); + log.writeln(msg2); + } + + + public static void log2(String msg1, String msg2){ + synchronized(MyClass.class){ + log.writeln(msg1); + log.writeln(msg2); + } + } + } +Only one thread can execute inside any of these two methods at the same time. + +Had the second synchronized block been synchronized on a different object than MyClass.class, then one thread could execute inside each method at the same time. + +Java Synchronized Example + +Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. + + public class Counter{ + + long count = 0; + + public synchronized void add(long value){ + this.count += value; + } + } + public class CounterThread extends Thread{ + + protected Counter counter = null; + + public CounterThread(Counter counter){ + this.counter = counter; + } + + public void run() { + for(int i=0; i<10; i++){ + counter.add(i); + } + } + } + public class Example { + + public static void main(String[] args){ + Counter counter = new Counter(); + Thread threadA = new CounterThread(counter); + Thread threadB = new CounterThread(counter); + + threadA.start(); + threadB.start(); + } + } +Two threads are created. The same Counter instance is passed to both of them in their constructor. The Counter.add() method is synchronized on the instance, because the add method is an instance method, and marked as synchronized. Therefore only one of the threads can call the add() method at a time. The other thread will wait until the first thread leaves the add() method, before it can execute the method itself. + +If the two threads had referenced two separate Counter instances, there would have been no problems calling the add() methods simultaneously. The calls would have been to different objects, so the methods called would also be synchronized on different objects (the object owning the method). Therefore the calls would not block. Here is how that could look: + + public class Example { + + public static void main(String[] args){ + Counter counterA = new Counter(); + Counter counterB = new Counter(); + Thread threadA = new CounterThread(counterA); + Thread threadB = new CounterThread(counterB); + + threadA.start(); + threadB.start(); + } + } +Notice how the two threads, threadA and threadB, no longer reference the same counter instance. The add method of counterA and counterB are synchronized on their two owning instances. Calling add() on counterA will thus not block a call to add() on counterB. + +Java Concurrency Utilities + +The synchronized mechanism was Java's first mechanism for synchronizing access to objects shared by multiple threads. The synchronized mechanism isn't very advanced though. That is why Java 5 got a whole set of concurrency utility classes to help developers implement more fine grained concurrency control than what you get with synchronized. \ No newline at end of file From 2c4aa33b7e6a97943b65d02454440afcb2e4b8c5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 21:18:21 +0800 Subject: [PATCH 121/524] Published with https://stackedit.io/ --- ...08.Java\345\220\214\346\255\245\345\235\227.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" index 2c76b6b..e86ecd1 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -2,7 +2,7 @@ A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. -The Java synchronized Keyword +##The Java synchronized Keyword Synchronized blocks in Java are marked with the synchronized keyword. A synchronized block in Java is synchronized on some object. All synchronized blocks synchronized on the same object can only have one thread executing inside them at the same time. All other threads attempting to enter the synchronized block are blocked until the thread inside the synchronized block exits the block. @@ -14,7 +14,7 @@ Code blocks inside instance methods Code blocks inside static methods These blocks are synchronized on different objects. Which type of synchronized block you need depends on the concrete situation. -Synchronized Instance Methods +##Synchronized Instance Methods Here is a synchronized instance method: @@ -25,7 +25,7 @@ Notice the use of the synchronized keyword in the method declaration. This tells A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. -Synchronized Static Methods +##Synchronized Static Methods Static methods are marked as synchronized just like instance methods using the synchronized keyword. Here is a Java synchronized static method example: @@ -38,7 +38,7 @@ Synchronized static methods are synchronized on the class object of the class th If the static synchronized methods are located in different classes, then one thread can execute inside the static synchronized methods of each class. One thread per class regardless of which static synchronized method it calls. -Synchronized Blocks in Instance Methods +##Synchronized Blocks in Instance Methods You do not have to synchronize a whole method. Sometimes it is preferable to synchronize only part of a method. Java synchronized blocks inside methods makes this possible. @@ -78,7 +78,7 @@ Thus only a single thread can execute inside either of the two synchronized bloc Had the second synchronized block been synchronized on a different object than this, then one thread at a time had been able to execute inside each method. -Synchronized Blocks in Static Methods +##Synchronized Blocks in Static Methods Here are the same two examples as static methods. These methods are synchronized on the class object of the class the methods belong to: @@ -101,7 +101,7 @@ Only one thread can execute inside any of these two methods at the same time. Had the second synchronized block been synchronized on a different object than MyClass.class, then one thread could execute inside each method at the same time. -Java Synchronized Example +##Java Synchronized Example Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. @@ -156,6 +156,6 @@ If the two threads had referenced two separate Counter instances, there would ha } Notice how the two threads, threadA and threadB, no longer reference the same counter instance. The add method of counterA and counterB are synchronized on their two owning instances. Calling add() on counterA will thus not block a call to add() on counterB. -Java Concurrency Utilities +##Java Concurrency Utilities The synchronized mechanism was Java's first mechanism for synchronizing access to objects shared by multiple threads. The synchronized mechanism isn't very advanced though. That is why Java 5 got a whole set of concurrency utility classes to help developers implement more fine grained concurrency control than what you get with synchronized. \ No newline at end of file From f5e563fb51c8b750debb9db3091f2b8fba14ddc4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 21:20:50 +0800 Subject: [PATCH 122/524] Published with https://stackedit.io/ --- ...va\345\220\214\346\255\245\345\235\227.md" | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" index e86ecd1..e3e6196 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -18,9 +18,12 @@ These blocks are synchronized on different objects. Which type of synchronized b Here is a synchronized instance method: +```Java public synchronized void add(int value){ this.count += value; } +``` + Notice the use of the synchronized keyword in the method declaration. This tells Java that the method is synchronized. A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. @@ -29,9 +32,12 @@ A synchronized instance method in Java is synchronized on the instance (object) Static methods are marked as synchronized just like instance methods using the synchronized keyword. Here is a Java synchronized static method example: +```Java public static synchronized void add(int value){ count += value; } +``` + Also here the synchronized keyword tells Java that the method is synchronized. Synchronized static methods are synchronized on the class object of the class the synchronized static method belongs to. Since only one class object exists in the Java VM per class, only one thread can execute inside a static synchronized method in the same class. @@ -44,12 +50,15 @@ You do not have to synchronize a whole method. Sometimes it is preferable to syn Here is a synchronized block of Java code inside an unsynchronized Java method: +```Java public void add(int value){ synchronized(this){ this.count += value; } } +``` + This example uses the Java synchronized block construct to mark a block of code as synchronized. This code will now execute as if it was a synchronized method. Notice how the Java synchronized block construct takes an object in parentheses. In the example "this" is used, which is the instance the add method is called on. The object taken in the parentheses by the synchronized construct is called a monitor object. The code is said to be synchronized on the monitor object. A synchronized instance method uses the object it belongs to as monitor object. @@ -58,7 +67,7 @@ Only one thread can execute inside a Java code block synchronized on the same mo The following two examples are both synchronized on the instance they are called on. They are therefore equivalent with respect to synchronization: - +```Java public class MyClass { public synchronized void log1(String msg1, String msg2){ @@ -74,6 +83,8 @@ The following two examples are both synchronized on the instance they are called } } } +``` + Thus only a single thread can execute inside either of the two synchronized blocks in this example. Had the second synchronized block been synchronized on a different object than this, then one thread at a time had been able to execute inside each method. @@ -82,6 +93,7 @@ Had the second synchronized block been synchronized on a different object than t Here are the same two examples as static methods. These methods are synchronized on the class object of the class the methods belong to: +```Java public class MyClass { public static synchronized void log1(String msg1, String msg2){ @@ -97,6 +109,8 @@ Here are the same two examples as static methods. These methods are synchronized } } } +``` + Only one thread can execute inside any of these two methods at the same time. Had the second synchronized block been synchronized on a different object than MyClass.class, then one thread could execute inside each method at the same time. @@ -105,6 +119,7 @@ Had the second synchronized block been synchronized on a different object than M Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. +```Java public class Counter{ long count = 0; @@ -138,10 +153,13 @@ Here is an example that starts 2 threads and have both of them call the add meth threadB.start(); } } +``` + Two threads are created. The same Counter instance is passed to both of them in their constructor. The Counter.add() method is synchronized on the instance, because the add method is an instance method, and marked as synchronized. Therefore only one of the threads can call the add() method at a time. The other thread will wait until the first thread leaves the add() method, before it can execute the method itself. If the two threads had referenced two separate Counter instances, there would have been no problems calling the add() methods simultaneously. The calls would have been to different objects, so the methods called would also be synchronized on different objects (the object owning the method). Therefore the calls would not block. Here is how that could look: +```Java public class Example { public static void main(String[] args){ @@ -154,6 +172,8 @@ If the two threads had referenced two separate Counter instances, there would ha threadB.start(); } } +``` + Notice how the two threads, threadA and threadB, no longer reference the same counter instance. The add method of counterA and counterB are synchronized on their two owning instances. Calling add() on counterA will thus not block a call to add() on counterB. ##Java Concurrency Utilities From 5769ab676127cff8ec99e95ea0248b673209abe5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 21:22:57 +0800 Subject: [PATCH 123/524] Published with https://stackedit.io/ --- ...6\350\265\204\346\272\220\345\205\261\344\272\253.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" index a63c446..17ea14e 100644 --- "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" +++ "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" @@ -86,8 +86,9 @@ check if record X exists if not, insert record X If two threads execute this simultanously, and the record X they are checking for happens to be the same record, there is a risk that both of the threads end up inserting it. This is how: -Thread 1 checks if record X exists. Result = no -Thread 2 checks if record X exists. Result = no -Thread 1 inserts record X -Thread 2 inserts record X +> Thread 1 checks if record X exists. Result = no +> Thread 2 checks if record X exists. Result = no +> Thread 1 inserts record X +> Thread 2 inserts record X + This could also happen with threads operating on files or other shared resources. Therefore it is important to distinguish between whether an object controlled by a thread is the resource, or if it merely references the resource. \ No newline at end of file From 138a0ec077abe669cc9c4bcb0d5d08aeda512de2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 22:56:03 +0800 Subject: [PATCH 124/524] Published with https://stackedit.io/ --- ...04\346\272\220\345\205\261\344\272\253.md" | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" index 17ea14e..432d4dc 100644 --- "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" +++ "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" @@ -1,24 +1,29 @@ #06.线程安全与资源共享(Thread Safety and Shared Resources) -Code that is safe to call by multiple threads simultanously is called thread safe. If a piece of code is thread safe, then it contains no race conditions. Race condition only occur when multiple threads update shared resources. Therefore it is important to know what resources Java threads share when executing. + +如果一段代码可以安全地由多个线程并行调用,则称这段代码是**线程安全**的。如果一段代码是线程安全的,则这段代码不会引起**资源竞争**。只有当多个线程更新共享资源时才会发生**资源竞争**问题。因此,重要是要知道程序执行过程中哪些资源是线程共享的。 ##局部变量(Local Variables) -Local variables are stored in each thread's own stack. That means that local variables are never shared between threads. That also means that all local primitive variables are thread safe. Here is an example of a thread safe local primitive variable: +局部变量存储在各自线程的栈中,这意味着局部变量不是线程共享的,这同样意味着所有的局部基本类型变量都是线程安全的。如下代码代码线程安全的: +```Java public void someMethod(){ long threadSafeInt = 0; threadSafeInt++; } +``` -## 本地变量引用(Local Object References) +## 局部对象引用(Local Object References) -Local references to objects are a bit different. The reference itself is not shared. The object referenced however, is not stored in each threads's local stack. All objects are stored in the shared heap. If an object created locally never escapes the method it was created in, it is thread safe. In fact you can also pass it on to other methods and objects as long as none of these methods or objects make the passed object available to other threads. Here is an example of a thread safe local object: + 局部对象的引用有一些差异。引用本身是不同享的,然而,引用的对象并不是存储在线程栈中,所有的对象都存储在Java堆,如果一个对象始终不逃逸出创建它的方法作用域之外,则它是线程安全的(If an object created locally never escapes the method it was created in, it is thread safe. )。而实际上,你也可以把这个对象引用传递给其他对象或者方法,只要传递的对象没有被其他线程处理,则它也是线程安全的。 -public void someMethod(){ +下面这个例子中的局部对象是线程安全的: +```Java +public void someMethod(){ LocalObject localObject = new LocalObject(); localObject.callMethod(); @@ -28,14 +33,17 @@ public void someMethod(){ public void method2(LocalObject localObject){ localObject.setValue("value"); } +``` + +在这个例子中,LocalObject的实例并没有从`someMethod()`方法中返回,也没有传递给其他在`someMethod()`作用域外的对象。每个执行`someMethod()`的线程都会创建各自的LocalObject实例,然后将引用传递给localObject引用变量。因此,这里的LocalObject的使用是线程安全的,实际上,整个`someMethod()`方法都是线程安全的,即使LocalObject实例作为参数传给本身对象或其他对象的方法,它都是线程安全的。唯一意外的情况就是:当localObject传递给其他的方法,而这些方法是可以被多线程访问的,则会导致线程安全问题。 -The LocalObject instance in this example is not returned from the method, nor is it passed to any other objects that are accessible from outside the someMethod() method. Each thread executing the someMethod() method will create its own LocalObject instance and assign it to the localObject reference. Therefore the use of the LocalObject here is thread safe. In fact, the whole method someMethod() is thread safe. Even if the LocalObject instance is passed as parameter to other methods in the same class, or in other classes, the use of it is thread safe. The only exception is of course, if one of the methods called with the LocalObject as parameter, stores the LocalObject instance in a way that allows access to it from other threads. -##对象成员(Object Members) +##对象成员变量(Object Members) -Object members are stored on the heap along with the object. Therefore, if two threads call a method on the same object instance and this method updates object members, the method is not thread safe. Here is an example of a method that is not thread safe: +对象的成员变量跟随对象本身存储在Java共享堆中。因此,如果两个变量调用同一个对象的一个方法,而这个方法会对对象的成员变量进行修改,则这个方法是**线程不安全**的。如下面这个例子: +```Java public class NotThreadSafe{ StringBuilder builder = new StringBuilder(); @@ -43,9 +51,11 @@ public class NotThreadSafe{ this.builder.append(text); } } -If two threads call the add() method simultanously on the same NotThreadSafe instance then it leads to race conditions. For instance: +``` +如果两个线程同时调用同一个NotThreadSafe实例的`add(String texty)`方法,则会导致资源竞争: +```Java NotThreadSafe sharedInstance = new NotThreadSafe(); new Thread(new MyRunnable(sharedInstance)).start(); @@ -62,15 +72,22 @@ public class MyRunnable implements Runnable{ this.instance.add("some text"); } } -Notice how the two MyRunnable instances share the same NotThreadSafe instance. Therefore, when they call the add() method on the NotThreadSafe instance it leads to race condition. +``` -However, if two threads call the add() method simultanously on different instances then it does not lead to race condition. Here is the example from before, but slightly modified: +注意两个MyRunnable实例共享同一个NoThreadSafe实例。因此,当两个线程同时调用`add()` 方法时则会导致资源竞争。 +然而,如果两个线程同时调用不同NoThreadSafe实例的`add()`方法则不会导致资源竞争。如下面这个例子: + + +```Java new Thread(new MyRunnable(new NotThreadSafe())).start(); new Thread(new MyRunnable(new NotThreadSafe())).start(); -Now the two threads have each their own instance of NotThreadSafe so their calls to the add method doesn't interfere with each other. The code does not have race condition anymore. So, even if an object is not thread safe it can still be used in a way that doesn't lead to race condition. +``` + +现在两个线程都拥有各自的NoThreadSafe实例,它们调用`add()`方法时并不会互相干扰,所以并没有导致资源竞争。因此,即使一个对象不是线程安全的,它们也可以用在不会引起资源竞争的代码中。 + -##The Thread Control Escape Rule +##The Thread Control Escape Rule(线程控制逃逸规则) When trying to determine if your code's access of a certain resource is thread safe you can use the thread control escape rule: From 5aaefb298e85bb36845093327570e7ca22f3f8ff Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 23:06:58 +0800 Subject: [PATCH 125/524] Published with https://stackedit.io/ --- ...5\204\346\272\220\345\205\261\344\272\253.md" | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" index 432d4dc..dc6955c 100644 --- "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" +++ "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" @@ -89,18 +89,20 @@ new Thread(new MyRunnable(new NotThreadSafe())).start(); ##The Thread Control Escape Rule(线程控制逃逸规则) -When trying to determine if your code's access of a certain resource is thread safe you can use the thread control escape rule: +如果想知道你的代码是否线程安全,可以使用以下规则: + +> 如果一个资源的创建和使用始终在同一个线程的控制下,并且从没有逃逸出这个线程的控制,则认为是线程安全的。 + + +>If a resource is created, used and disposed within the control of the same thread, and never escapes the control of this thread, the use of that resource is thread safe. -If a resource is created, used and disposed within -the control of the same thread, -and never escapes the control of this thread, -the use of that resource is thread safe. Resources can be any shared resource like an object, array, file, database connection, socket etc. In Java you do not always explicitly dispose objects, so "disposed" means losing or null'ing the reference to the object. Even if the use of an object is thread safe, if that object points to a shared resource like a file or database, your application as a whole may not be thread safe. For instance, if thread 1 and thread 2 each create their own database connections, connection 1 and connection 2, the use of each connection itself is thread safe. But the use of the database the connections point to may not be thread safe. For example, if both threads execute code like this: -check if record X exists -if not, insert record X +> check if record X exists +> if not, insert record X + If two threads execute this simultanously, and the record X they are checking for happens to be the same record, there is a risk that both of the threads end up inserting it. This is how: > Thread 1 checks if record X exists. Result = no From 5fdda034dd21810cbe1f7f2980e22ad7ef1b621d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 23:08:04 +0800 Subject: [PATCH 126/524] Published with https://stackedit.io/ --- ...5\204\346\272\220\345\205\261\344\272\253.md" | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" index dc6955c..c3c6c05 100644 --- "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" +++ "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" @@ -100,14 +100,18 @@ Resources can be any shared resource like an object, array, file, database conne Even if the use of an object is thread safe, if that object points to a shared resource like a file or database, your application as a whole may not be thread safe. For instance, if thread 1 and thread 2 each create their own database connections, connection 1 and connection 2, the use of each connection itself is thread safe. But the use of the database the connections point to may not be thread safe. For example, if both threads execute code like this: -> check if record X exists -> if not, insert record X +```txt +check if record X exists +if not, insert record X +``` If two threads execute this simultanously, and the record X they are checking for happens to be the same record, there is a risk that both of the threads end up inserting it. This is how: -> Thread 1 checks if record X exists. Result = no -> Thread 2 checks if record X exists. Result = no -> Thread 1 inserts record X -> Thread 2 inserts record X +```txt +Thread 1 checks if record X exists. Result = no +Thread 2 checks if record X exists. Result = no +Thread 1 inserts record X +Thread 2 inserts record X +``` This could also happen with threads operating on files or other shared resources. Therefore it is important to distinguish between whether an object controlled by a thread is the resource, or if it merely references the resource. \ No newline at end of file From 5f856a296f0d35f1942bfd0cb24bb1a02d0d4923 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 11 Sep 2014 23:11:10 +0800 Subject: [PATCH 127/524] Published with https://stackedit.io/ --- ...70\216\350\265\204\346\272\220\345\205\261\344\272\253.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" index c3c6c05..cacbcbe 100644 --- "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" +++ "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" @@ -100,14 +100,14 @@ Resources can be any shared resource like an object, array, file, database conne Even if the use of an object is thread safe, if that object points to a shared resource like a file or database, your application as a whole may not be thread safe. For instance, if thread 1 and thread 2 each create their own database connections, connection 1 and connection 2, the use of each connection itself is thread safe. But the use of the database the connections point to may not be thread safe. For example, if both threads execute code like this: -```txt +``` check if record X exists if not, insert record X ``` If two threads execute this simultanously, and the record X they are checking for happens to be the same record, there is a risk that both of the threads end up inserting it. This is how: -```txt +``` Thread 1 checks if record X exists. Result = no Thread 2 checks if record X exists. Result = no Thread 1 inserts record X From 838e210e1a59cb83308e02ee0ec04e4c8a819a54 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 00:36:44 +0800 Subject: [PATCH 128/524] Published with https://stackedit.io/ --- ...250\345\222\214\344\270\215\345\217\230\346\200\247.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" index 32f5775..8918592 100644 --- "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" +++ "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" @@ -1,9 +1,10 @@ #07.线程安全和不变性 -Race conditions occur only if multiple threads are accessing the same resource, and one or more of the threads write to the resource. If multiple threads read the same resource race conditions do not occur. +只有当多个线程访问共享资源,并且一个线程或多个线程对资源进行写操作时,才会发生资源竞争。如果多个线程同时只对共享资源进行读操作,则不会发生资源竞争。 -We can make sure that objects shared between threads are never updated by any of the threads by making the shared objects immutable, and thereby thread safe. Here is an example: +我们可以通过把共享对象设置为不可变以至于让线程不能对对象进行改动,从而保证了线程安全。如下面这个例子: +```Java public class ImmutableValue{ private int value = 0; @@ -16,6 +17,8 @@ public class ImmutableValue{ return this.value; } } +``` + Notice how the value for the ImmutableValue instance is passed in the constructor. Notice also how there is no setter method. Once an ImmutableValue instance is created you cannot change its value. It is immutable. You can read it however, using the getValue() method. If you need to perform operations on the ImmutableValue instance you can do so by returning a new instance with the value resulting from the operation. Here is an example of an add operation: From 1d553539a6d52f94ccc82ecd515ac3c7e5cb5106 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 01:10:05 +0800 Subject: [PATCH 129/524] Published with https://stackedit.io/ --- ...14\344\270\215\345\217\230\346\200\247.md" | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" index 8918592..9352541 100644 --- "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" +++ "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" @@ -19,10 +19,12 @@ public class ImmutableValue{ } ``` -Notice how the value for the ImmutableValue instance is passed in the constructor. Notice also how there is no setter method. Once an ImmutableValue instance is created you cannot change its value. It is immutable. You can read it however, using the getValue() method. +注意value的值是通过构造函数进行设置的,并且value没有提供setter方法,所以一旦ImmutableValue实例被创建后,value的值就不能进行更改了。可以通过`getValue()`获取value的值,但不能进行改动。 -If you need to perform operations on the ImmutableValue instance you can do so by returning a new instance with the value resulting from the operation. Here is an example of an add operation: +如果想要对ImmutableValue对象进行操作,可以通过返回一个新的实例来完成。例如下面这个 + +```Java public class ImmutableValue{ private int value = 0; @@ -34,19 +36,21 @@ public class ImmutableValue{ public int getValue(){ return this.value; } - - public ImmutableValue add(int valueToAdd){ - return new ImmutableValue(this.value + valueToAdd); - } + public ImmutableValue add(int valueToAdd){ + return new ImmutableValue(this.value + valueToAdd); + } } -Notice how the add() method returns a new ImmutableValue instance with the result of the add operation, rather than adding the value to itself. +``` -##The Reference is not Thread Safe! +注意这里返回了一个新的ImmutableValue实例,而不是对value的值进行修改。 -It is important to remember, that even if an object is immutable and thereby thread safe, the reference to this object may not be thread safe. Look at this example: +##引用不是线程安全的!(The Reference is not Thread Safe!) +有一点需要谨记:**即使一个对象是线程安全的不可变对象,指向这个对象的引用也可能不是线程安全的。** + +```Java public class Calculator{ private ImmutableValue currentValue = null; @@ -62,6 +66,8 @@ public class Calculator{ this.currentValue = this.currentValue.add(newValue); } } +``` + The Calculator class holds a reference to an ImmutableValue instance. Notice how it is possible to change that reference through both the setValue() and add() methods. Therefore, even if the Calculator class uses an immutable object internally, it is not itself immutable, and therefore not thread safe. In other words: The ImmutableValue class is thread safe, but the use of it is not. This is something to keep in mind when trying to achieve thread safety through immutability. To make the Calculator class thread safe you could have declared the getValue(), setValue(), and add() methods synchronized. That would have done the trick. From 98aa8de252436336dc7f19c620133e75d8c8eaf4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 01:16:52 +0800 Subject: [PATCH 130/524] Published with https://stackedit.io/ --- ...\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" index 9352541..1264207 100644 --- "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" +++ "b/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" @@ -1,6 +1,6 @@ #07.线程安全和不变性 -只有当多个线程访问共享资源,并且一个线程或多个线程对资源进行写操作时,才会发生资源竞争。如果多个线程同时只对共享资源进行读操作,则不会发生资源竞争。 +只有当多个线程访问共享资源,并且一个线程或多个线程对资源进行写操作时,才会发生竞态条件。如果多个线程同时只对共享资源进行读操作,则不会发生**竞态条件**。 我们可以通过把共享对象设置为不可变以至于让线程不能对对象进行改动,从而保证了线程安全。如下面这个例子: From 91efbf3473d72db16c295eca48d9f540bd9d3ae1 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 01:17:23 +0800 Subject: [PATCH 131/524] Published with https://stackedit.io/ --- ...350\265\204\346\272\220\345\205\261\344\272\253.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" index cacbcbe..96a66b9 100644 --- "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" +++ "b/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" @@ -1,7 +1,7 @@ #06.线程安全与资源共享(Thread Safety and Shared Resources) -如果一段代码可以安全地由多个线程并行调用,则称这段代码是**线程安全**的。如果一段代码是线程安全的,则这段代码不会引起**资源竞争**。只有当多个线程更新共享资源时才会发生**资源竞争**问题。因此,重要是要知道程序执行过程中哪些资源是线程共享的。 +如果一段代码可以安全地由多个线程并行调用,则称这段代码是**线程安全**的。如果一段代码是线程安全的,则这段代码不会引起**竞态条件**。只有当多个线程更新共享资源时才会发生**竞态条件**问题。因此,重要是要知道程序执行过程中哪些资源是线程共享的。 ##局部变量(Local Variables) @@ -53,7 +53,7 @@ public class NotThreadSafe{ } ``` -如果两个线程同时调用同一个NotThreadSafe实例的`add(String texty)`方法,则会导致资源竞争: +如果两个线程同时调用同一个NotThreadSafe实例的`add(String texty)`方法,则会导致竞态条件: ```Java NotThreadSafe sharedInstance = new NotThreadSafe(); @@ -74,9 +74,9 @@ public class MyRunnable implements Runnable{ } ``` -注意两个MyRunnable实例共享同一个NoThreadSafe实例。因此,当两个线程同时调用`add()` 方法时则会导致资源竞争。 +注意两个MyRunnable实例共享同一个NoThreadSafe实例。因此,当两个线程同时调用`add()` 方法时则会导致竞态条件。 -然而,如果两个线程同时调用不同NoThreadSafe实例的`add()`方法则不会导致资源竞争。如下面这个例子: +然而,如果两个线程同时调用不同NoThreadSafe实例的`add()`方法则不会导致竞态条件。如下面这个例子: ```Java @@ -84,7 +84,7 @@ new Thread(new MyRunnable(new NotThreadSafe())).start(); new Thread(new MyRunnable(new NotThreadSafe())).start(); ``` -现在两个线程都拥有各自的NoThreadSafe实例,它们调用`add()`方法时并不会互相干扰,所以并没有导致资源竞争。因此,即使一个对象不是线程安全的,它们也可以用在不会引起资源竞争的代码中。 +现在两个线程都拥有各自的NoThreadSafe实例,它们调用`add()`方法时并不会互相干扰,所以并没有导致竞态条件。因此,即使一个对象不是线程安全的,它们也可以用在不会引起竞态条件的代码中。 ##The Thread Control Escape Rule(线程控制逃逸规则) From 235f4610402cc45bffe3fae827002fa56a2f88af Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 01:19:04 +0800 Subject: [PATCH 132/524] =?UTF-8?q?Update=20and=20rename=2005.=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E7=AB=9E=E4=BA=89=E5=92=8C=E4=B8=B4=E7=95=8C=E5=8C=BA?= =?UTF-8?q?.md=20to=2005.=E7=AB=9E=E6=80=81=E6=9D=A1=E4=BB=B6=E5=92=8C?= =?UTF-8?q?=E4=B8=B4=E7=95=8C=E5=8C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\266\345\222\214\344\270\264\347\225\214\345\214\272.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename "Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" => "Java-Concurrency-Multithreading/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" (86%) diff --git "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency-Multithreading/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" similarity index 86% rename from "Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" rename to "Java-Concurrency-Multithreading/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" index 9294181..3aa7154 100644 --- "a/Java-Concurrency-Multithreading/05.\350\265\204\346\272\220\347\253\236\344\272\211\345\222\214\344\270\264\347\225\214\345\214\272.md" +++ "b/Java-Concurrency-Multithreading/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" @@ -1,5 +1,5 @@ -#资源竞争和临界区(Race Conditions and Critical Sections) +#05.竞态条件和临界区(Race Conditions and Critical Sections) 在一个应用程序中运行多个线程这本身不会导致什么问题。问题在于多个线程同时对同一资源进行存取,例如同样的内存空间(变量、数组或对象),系统资源(数据库,文件系统等等)。如果是多个线程对同一资源进行读取,则不会有任何问题。 @@ -39,8 +39,8 @@ A: writes register value (3) back to memory. this.count now equals 3 -## 资源竞争和临界点(Race Conditions & Critical Sections) +## 竞态条件和临界点(Race Conditions & Critical Sections) -当多个线程对同一个资源进行竞争,访问这个资源的顺序是非常重要的,称之为**资源竞争**(he situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions)。可以引起资源竞争的代码区域,称之为**临界区**。在前面的示例中,`add()`方法就是一个临界区。资源竞争可以通过在临界区进行适当的**线程同步**来避免。 +当多个线程对同一个资源进行竞争,访问这个资源的顺序是非常重要的,称之为**竞态条件**(he situation where two threads compete for the same resource, where the sequence in which the resource is accessed is significant, is called race conditions)。可以引起竞态条件的代码区域,称之为**临界区**。在前面的示例中,`add()`方法就是一个临界区。竞态条件可以通过在临界区进行适当的**线程同步**来避免。 From 2bcc9a91620ec1c1d93fa9fec93939f77a08a041 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 01:22:29 +0800 Subject: [PATCH 133/524] Published with https://stackedit.io/ --- ...8.Java\345\220\214\346\255\245\345\235\227.md" | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" index e3e6196..a8276ea 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -2,7 +2,10 @@ A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. -##The Java synchronized Keyword +Java synchronized block(Java同步块)用来对方法或代码块进行标记,表明这个方法或代码块是同步的。Java同步块可以避免**竞态条件**。 + + +##synchronized关键字(The Java synchronized Keyword) Synchronized blocks in Java are marked with the synchronized keyword. A synchronized block in Java is synchronized on some object. All synchronized blocks synchronized on the same object can only have one thread executing inside them at the same time. All other threads attempting to enter the synchronized block are blocked until the thread inside the synchronized block exits the block. @@ -14,7 +17,7 @@ Code blocks inside instance methods Code blocks inside static methods These blocks are synchronized on different objects. Which type of synchronized block you need depends on the concrete situation. -##Synchronized Instance Methods +##同步实例方法(Synchronized Instance Methods) Here is a synchronized instance method: @@ -28,7 +31,7 @@ Notice the use of the synchronized keyword in the method declaration. This tells A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. -##Synchronized Static Methods +##同步静态方法(Synchronized Static Methods) Static methods are marked as synchronized just like instance methods using the synchronized keyword. Here is a Java synchronized static method example: @@ -44,7 +47,7 @@ Synchronized static methods are synchronized on the class object of the class th If the static synchronized methods are located in different classes, then one thread can execute inside the static synchronized methods of each class. One thread per class regardless of which static synchronized method it calls. -##Synchronized Blocks in Instance Methods +##实例方法中的同步块(Synchronized Blocks in Instance Methods) You do not have to synchronize a whole method. Sometimes it is preferable to synchronize only part of a method. Java synchronized blocks inside methods makes this possible. @@ -89,7 +92,7 @@ Thus only a single thread can execute inside either of the two synchronized bloc Had the second synchronized block been synchronized on a different object than this, then one thread at a time had been able to execute inside each method. -##Synchronized Blocks in Static Methods +##静态方法中的同步块(Synchronized Blocks in Static Methods) Here are the same two examples as static methods. These methods are synchronized on the class object of the class the methods belong to: @@ -115,7 +118,7 @@ Only one thread can execute inside any of these two methods at the same time. Had the second synchronized block been synchronized on a different object than MyClass.class, then one thread could execute inside each method at the same time. -##Java Synchronized Example +##Java同步示例(Java Synchronized Example) Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. From 91680c3828959580c8ad0a910e52f72b245551c4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 01:44:13 +0800 Subject: [PATCH 134/524] Published with https://stackedit.io/ --- ...8.Java\345\220\214\346\255\245\345\235\227.md" | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" index a8276ea..40668d6 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -7,15 +7,16 @@ Java synchronized block(Java同步块)用来对方法或代码块进行标 ##synchronized关键字(The Java synchronized Keyword) -Synchronized blocks in Java are marked with the synchronized keyword. A synchronized block in Java is synchronized on some object. All synchronized blocks synchronized on the same object can only have one thread executing inside them at the same time. All other threads attempting to enter the synchronized block are blocked until the thread inside the synchronized block exits the block. +Java中的同步块使用关键字**synchronized**进行标记**。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同一时间只能被一个线程进入并执行里面的代码。**其他所有试图进入该对象同步块的线程将被阻塞,直到执行该同步块中的线程退出。 -The synchronized keyword can be used to mark four different types of blocks: +**synchronized**关键字可以被用于标记以下四种不同类型的块: -Instance methods -Static methods -Code blocks inside instance methods -Code blocks inside static methods -These blocks are synchronized on different objects. Which type of synchronized block you need depends on the concrete situation. +- 实例方法(Instance methods) +- 静态方法(Static methods) +- 实例方法中的代码块(Code blocks inside instance methods) +- 静态方法中的代码块(Code blocks inside static methods) + +上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。 ##同步实例方法(Synchronized Instance Methods) From a62051a7e6dd1bc6c70ca12a846947170048dfed Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 09:52:09 +0800 Subject: [PATCH 135/524] Published with https://stackedit.io/ --- ....Java\345\220\214\346\255\245\345\235\227" | 185 ++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" new file mode 100644 index 0000000..40668d6 --- /dev/null +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" @@ -0,0 +1,185 @@ +#08.Java同步块 + +A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. + +Java synchronized block(Java同步块)用来对方法或代码块进行标记,表明这个方法或代码块是同步的。Java同步块可以避免**竞态条件**。 + + +##synchronized关键字(The Java synchronized Keyword) + +Java中的同步块使用关键字**synchronized**进行标记**。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同一时间只能被一个线程进入并执行里面的代码。**其他所有试图进入该对象同步块的线程将被阻塞,直到执行该同步块中的线程退出。 + +**synchronized**关键字可以被用于标记以下四种不同类型的块: + +- 实例方法(Instance methods) +- 静态方法(Static methods) +- 实例方法中的代码块(Code blocks inside instance methods) +- 静态方法中的代码块(Code blocks inside static methods) + +上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。 + +##同步实例方法(Synchronized Instance Methods) + +Here is a synchronized instance method: + +```Java + public synchronized void add(int value){ + this.count += value; + } +``` + +Notice the use of the synchronized keyword in the method declaration. This tells Java that the method is synchronized. + +A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. + +##同步静态方法(Synchronized Static Methods) + +Static methods are marked as synchronized just like instance methods using the synchronized keyword. Here is a Java synchronized static method example: + +```Java + public static synchronized void add(int value){ + count += value; + } +``` + +Also here the synchronized keyword tells Java that the method is synchronized. + +Synchronized static methods are synchronized on the class object of the class the synchronized static method belongs to. Since only one class object exists in the Java VM per class, only one thread can execute inside a static synchronized method in the same class. + +If the static synchronized methods are located in different classes, then one thread can execute inside the static synchronized methods of each class. One thread per class regardless of which static synchronized method it calls. + +##实例方法中的同步块(Synchronized Blocks in Instance Methods) + +You do not have to synchronize a whole method. Sometimes it is preferable to synchronize only part of a method. Java synchronized blocks inside methods makes this possible. + +Here is a synchronized block of Java code inside an unsynchronized Java method: + +```Java + public void add(int value){ + + synchronized(this){ + this.count += value; + } + } +``` + +This example uses the Java synchronized block construct to mark a block of code as synchronized. This code will now execute as if it was a synchronized method. + +Notice how the Java synchronized block construct takes an object in parentheses. In the example "this" is used, which is the instance the add method is called on. The object taken in the parentheses by the synchronized construct is called a monitor object. The code is said to be synchronized on the monitor object. A synchronized instance method uses the object it belongs to as monitor object. + +Only one thread can execute inside a Java code block synchronized on the same monitor object. + +The following two examples are both synchronized on the instance they are called on. They are therefore equivalent with respect to synchronization: + +```Java + public class MyClass { + + public synchronized void log1(String msg1, String msg2){ + log.writeln(msg1); + log.writeln(msg2); + } + + + public void log2(String msg1, String msg2){ + synchronized(this){ + log.writeln(msg1); + log.writeln(msg2); + } + } + } +``` + +Thus only a single thread can execute inside either of the two synchronized blocks in this example. + +Had the second synchronized block been synchronized on a different object than this, then one thread at a time had been able to execute inside each method. + +##静态方法中的同步块(Synchronized Blocks in Static Methods) + +Here are the same two examples as static methods. These methods are synchronized on the class object of the class the methods belong to: + +```Java + public class MyClass { + + public static synchronized void log1(String msg1, String msg2){ + log.writeln(msg1); + log.writeln(msg2); + } + + + public static void log2(String msg1, String msg2){ + synchronized(MyClass.class){ + log.writeln(msg1); + log.writeln(msg2); + } + } + } +``` + +Only one thread can execute inside any of these two methods at the same time. + +Had the second synchronized block been synchronized on a different object than MyClass.class, then one thread could execute inside each method at the same time. + +##Java同步示例(Java Synchronized Example) + +Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. + +```Java + public class Counter{ + + long count = 0; + + public synchronized void add(long value){ + this.count += value; + } + } + public class CounterThread extends Thread{ + + protected Counter counter = null; + + public CounterThread(Counter counter){ + this.counter = counter; + } + + public void run() { + for(int i=0; i<10; i++){ + counter.add(i); + } + } + } + public class Example { + + public static void main(String[] args){ + Counter counter = new Counter(); + Thread threadA = new CounterThread(counter); + Thread threadB = new CounterThread(counter); + + threadA.start(); + threadB.start(); + } + } +``` + +Two threads are created. The same Counter instance is passed to both of them in their constructor. The Counter.add() method is synchronized on the instance, because the add method is an instance method, and marked as synchronized. Therefore only one of the threads can call the add() method at a time. The other thread will wait until the first thread leaves the add() method, before it can execute the method itself. + +If the two threads had referenced two separate Counter instances, there would have been no problems calling the add() methods simultaneously. The calls would have been to different objects, so the methods called would also be synchronized on different objects (the object owning the method). Therefore the calls would not block. Here is how that could look: + +```Java + public class Example { + + public static void main(String[] args){ + Counter counterA = new Counter(); + Counter counterB = new Counter(); + Thread threadA = new CounterThread(counterA); + Thread threadB = new CounterThread(counterB); + + threadA.start(); + threadB.start(); + } + } +``` + +Notice how the two threads, threadA and threadB, no longer reference the same counter instance. The add method of counterA and counterB are synchronized on their two owning instances. Calling add() on counterA will thus not block a call to add() on counterB. + +##Java Concurrency Utilities + +The synchronized mechanism was Java's first mechanism for synchronizing access to objects shared by multiple threads. The synchronized mechanism isn't very advanced though. That is why Java 5 got a whole set of concurrency utility classes to help developers implement more fine grained concurrency control than what you get with synchronized. \ No newline at end of file From 5059947266b9d2ce1d173d17d49dbcd81c9fabd5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 10:14:52 +0800 Subject: [PATCH 136/524] Published with https://stackedit.io/ --- .../08.Java\345\220\214\346\255\245\345\235\227" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" index 40668d6..b96e826 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" @@ -20,7 +20,7 @@ Java中的同步块使用关键字**synchronized**进行标记**。同步块在J ##同步实例方法(Synchronized Instance Methods) -Here is a synchronized instance method: +下面是一个同步的实例方法: ```Java public synchronized void add(int value){ @@ -28,7 +28,9 @@ Here is a synchronized instance method: } ``` -Notice the use of the synchronized keyword in the method declaration. This tells Java that the method is synchronized. +使用**synchronized**关键字对方法进行声明,告诉JVM这是一个同步的方法。 + + A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. From 8954d32d369e53c818d5216f5962438113886a2a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 10:34:42 +0800 Subject: [PATCH 137/524] Published with https://stackedit.io/ --- .../08.Java\345\220\214\346\255\245\345\235\227" | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" index b96e826..5ac7f75 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" @@ -30,9 +30,7 @@ Java中的同步块使用关键字**synchronized**进行标记**。同步块在J 使用**synchronized**关键字对方法进行声明,告诉JVM这是一个同步的方法。 - - -A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. +Java中的同步实例方法是基于这个方法所属的实例对象上进行同步的。因此,每一个同步实例方法都是基于各自的实例对象进行同步的。同一时间,只有一个线程可以访问一个实例对象的同步实例方法。如果有多个实例存在,那么每个线程都可以同时访问各自不同实例对象的同步实例方法,一个实例对象对应一个线程。 ##同步静态方法(Synchronized Static Methods) From 44abb99d3b62b93869db27ce7c769043fcf13d11 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 11:11:54 +0800 Subject: [PATCH 138/524] Published with https://stackedit.io/ --- ....Java\345\220\214\346\255\245\345\235\227" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" index 5ac7f75..ae64565 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" @@ -30,11 +30,11 @@ Java中的同步块使用关键字**synchronized**进行标记**。同步块在J 使用**synchronized**关键字对方法进行声明,告诉JVM这是一个同步的方法。 -Java中的同步实例方法是基于这个方法所属的实例对象上进行同步的。因此,每一个同步实例方法都是基于各自的实例对象进行同步的。同一时间,只有一个线程可以访问一个实例对象的同步实例方法。如果有多个实例存在,那么每个线程都可以同时访问各自不同实例对象的同步实例方法,一个实例对象对应一个线程。 +Java中的**同步实例方法是基于这个方法所属的实例对象上进行同步的**。因此,每一个同步实例方法都是基于各自的实例对象进行同步的。同一时间,只有一个线程可以访问一个实例对象的同步实例方法。如果有多个实例存在,那么每个线程都可以同时访问各自不同实例对象的同步实例方法,一个实例对象对应一个线程。 ##同步静态方法(Synchronized Static Methods) -Static methods are marked as synchronized just like instance methods using the synchronized keyword. Here is a Java synchronized static method example: +静态方法的同步与实例方法一致,都是使用**synchronized**在方法放进行声明。 ```Java public static synchronized void add(int value){ @@ -42,17 +42,17 @@ Static methods are marked as synchronized just like instance methods using the s } ``` -Also here the synchronized keyword tells Java that the method is synchronized. +同样的,这里的**synchronized**关键字用于告诉JVM这个静态方法是同步的。 -Synchronized static methods are synchronized on the class object of the class the synchronized static method belongs to. Since only one class object exists in the Java VM per class, only one thread can execute inside a static synchronized method in the same class. +**同步静态方法是基于这个静态方法所属的类对象进行同步的**。由于在JVM中,每个类有且只有一个类对象,因此,在同一时间内,只有一个线程能够访问同一个类的同步静态方法。 -If the static synchronized methods are located in different classes, then one thread can execute inside the static synchronized methods of each class. One thread per class regardless of which static synchronized method it calls. +如果同步静态方法位于不同的类中,那么每个线程都可以访问各自对应的类的同步静态方法,一个线程对应一个类。 ##实例方法中的同步块(Synchronized Blocks in Instance Methods) -You do not have to synchronize a whole method. Sometimes it is preferable to synchronize only part of a method. Java synchronized blocks inside methods makes this possible. +有些时候,你并不需要同步整一个方法,而只需要同步这个方法下的一小部分代码块。你可以在方法里面使用同步代码块。 -Here is a synchronized block of Java code inside an unsynchronized Java method: +下面这个例子就是在非同步方法里面使用了同步代码块: ```Java public void add(int value){ @@ -63,11 +63,11 @@ Here is a synchronized block of Java code inside an unsynchronized Java method: } ``` -This example uses the Java synchronized block construct to mark a block of code as synchronized. This code will now execute as if it was a synchronized method. +这个例子里,用了Java的同步代码块来使代码进行同步,让这个方法像同步方法一样执行。 -Notice how the Java synchronized block construct takes an object in parentheses. In the example "this" is used, which is the instance the add method is called on. The object taken in the parentheses by the synchronized construct is called a monitor object. The code is said to be synchronized on the monitor object. A synchronized instance method uses the object it belongs to as monitor object. +注意在Java的同步代码块里,需要在括号里传递一个对象。这个例子中,这个对象是**this**,this指的是这个实例对象本身。在Java同步代码块括号中的对象称为**监听器对象**。意味着,这个同步块是基于这个监听器对象进行同步的。同步实例方法使用其所在实例对象作为监听器对象。 -Only one thread can execute inside a Java code block synchronized on the same monitor object. +**同一时间,只有一个线程能够访问基于同一个监听器对象的同步代码块。** The following two examples are both synchronized on the instance they are called on. They are therefore equivalent with respect to synchronization: From 60a25560c8b2d5e362a31e1f11cdb73ebc2dd338 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 11:35:48 +0800 Subject: [PATCH 139/524] Published with https://stackedit.io/ --- .../08.Java\345\220\214\346\255\245\345\235\227" | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" index ae64565..55fd149 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" @@ -67,9 +67,9 @@ Java中的**同步实例方法是基于这个方法所属的实例对象上进 注意在Java的同步代码块里,需要在括号里传递一个对象。这个例子中,这个对象是**this**,this指的是这个实例对象本身。在Java同步代码块括号中的对象称为**监听器对象**。意味着,这个同步块是基于这个监听器对象进行同步的。同步实例方法使用其所在实例对象作为监听器对象。 -**同一时间,只有一个线程能够访问基于同一个监听器对象的同步代码块。** +**同一时间,只有一个线程能够访问基于同一个监听器对象的同步代码。** -The following two examples are both synchronized on the instance they are called on. They are therefore equivalent with respect to synchronization: +下面这个例子,两个同步代码都是基于同一个实例对象进行同步的: ```Java public class MyClass { @@ -89,13 +89,13 @@ The following two examples are both synchronized on the instance they are called } ``` -Thus only a single thread can execute inside either of the two synchronized blocks in this example. +因此,在这个例子中,每次仅能有一个线程能够访问这两个同步代码的任意一个同步代码。 -Had the second synchronized block been synchronized on a different object than this, then one thread at a time had been able to execute inside each method. +如果第二个同步块是基于其他监听器对象,例如`synchronized (this.getClass()) {}`,则此时第一个和第二个同步代码的监听器对象分别为:当前实例对象和当前类对象。因此,这两个同步代码可以同时由不同的线程进行访问。 ##静态方法中的同步块(Synchronized Blocks in Static Methods) -Here are the same two examples as static methods. These methods are synchronized on the class object of the class the methods belong to: +下面这个例子中,两个同步代码都是基于当前的类对象进行同步的: ```Java public class MyClass { @@ -115,9 +115,10 @@ Here are the same two examples as static methods. These methods are synchronized } ``` -Only one thread can execute inside any of these two methods at the same time. +同一时间,只有一个线程能够访问这两个同步代码的任意一个同步代码。 + +如果第二个方法的监听器对象非MyClass.class对象,则两个同步代码可以同时被两个线程访问。 -Had the second synchronized block been synchronized on a different object than MyClass.class, then one thread could execute inside each method at the same time. ##Java同步示例(Java Synchronized Example) From 1e2f71a6abe318d8191f15a915e55570cdabc96f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:03:20 +0800 Subject: [PATCH 140/524] Published with https://stackedit.io/ --- ....Java\345\220\214\346\255\245\345\235\227" | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" index 55fd149..9edb617 100644 --- "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" +++ "b/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" @@ -125,39 +125,37 @@ Java中的**同步实例方法是基于这个方法所属的实例对象上进 Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. ```Java - public class Counter{ - - long count = 0; - - public synchronized void add(long value){ - this.count += value; - } - } - public class CounterThread extends Thread{ - - protected Counter counter = null; - - public CounterThread(Counter counter){ - this.counter = counter; - } - - public void run() { - for(int i=0; i<10; i++){ - counter.add(i); - } - } - } - public class Example { - - public static void main(String[] args){ - Counter counter = new Counter(); - Thread threadA = new CounterThread(counter); - Thread threadB = new CounterThread(counter); - - threadA.start(); - threadB.start(); - } +public class Counter{ + long count = 0; + + public synchronized void add(long value){ + this.count += value; + } +} +public class CounterThread extends Thread{ + protected Counter counter = null; + + public CounterThread(Counter counter){ + this.counter = counter; + } + + public void run() { +for(int i=0; i<10; i++){ + counter.add(i); + } + } +} +public class Example { + + public static void main(String[] args){ + Counter counter = new Counter(); + Thread threadA = new CounterThread(counter); + Thread threadB = new CounterThread(counter); + + threadA.start(); + threadB.start(); } +} ``` Two threads are created. The same Counter instance is passed to both of them in their constructor. The Counter.add() method is synchronized on the instance, because the add method is an instance method, and marked as synchronized. Therefore only one of the threads can call the add() method at a time. The other thread will wait until the first thread leaves the add() method, before it can execute the method itself. @@ -165,22 +163,22 @@ Two threads are created. The same Counter instance is passed to both of them in If the two threads had referenced two separate Counter instances, there would have been no problems calling the add() methods simultaneously. The calls would have been to different objects, so the methods called would also be synchronized on different objects (the object owning the method). Therefore the calls would not block. Here is how that could look: ```Java - public class Example { - - public static void main(String[] args){ - Counter counterA = new Counter(); - Counter counterB = new Counter(); - Thread threadA = new CounterThread(counterA); - Thread threadB = new CounterThread(counterB); - - threadA.start(); - threadB.start(); - } +public class Example { + public static void main(String[] args){ + Counter counterA = new Counter(); + Counter counterB = new Counter(); + Thread threadA = new CounterThread(counterA); + Thread threadB = new CounterThread(counterB); + + threadA.start(); + threadB.start(); } +} ``` Notice how the two threads, threadA and threadB, no longer reference the same counter instance. The add method of counterA and counterB are synchronized on their two owning instances. Calling add() on counterA will thus not block a call to add() on counterB. ##Java Concurrency Utilities -The synchronized mechanism was Java's first mechanism for synchronizing access to objects shared by multiple threads. The synchronized mechanism isn't very advanced though. That is why Java 5 got a whole set of concurrency utility classes to help developers implement more fine grained concurrency control than what you get with synchronized. \ No newline at end of file +`synchronized`机制是Java第一个引进的用于同步多线程资源共享的机制。然而`synchroniez`机制并不高效。这就是为什么Java 5提供了一整套的并发工具类,以帮助开发人员实现更细粒度的并发控制 +。 \ No newline at end of file From 2dd033021d74dd2d92c1c4472626302d223b9ed6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:08:05 +0800 Subject: [PATCH 141/524] Published with https://stackedit.io/ --- ...77\347\250\213\351\200\232\344\277\241.md" | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" new file mode 100644 index 0000000..f81ed30 --- /dev/null +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -0,0 +1,189 @@ +#09.线程通讯 + +The purpose of thread signaling is to enable threads to send signals to each other. Additionally, thread signaling enables threads to wait for signals from other threads. For instance, a thread B might wait for a signal from thread A indicating that data is ready to be processed. + +Signaling via Shared Objects + +A simple way for threads to send signals to each other is by setting the signal values in some shared object variable. Thread A may set the boolean member variable hasDataToProcess to true from inside a synchronized block, and thread B may read the hasDataToProcess member variable, also inside a synchronized block. Here is a simple example of an object that can hold such a signal, and provide methods to set and check it: + +public class MySignal{ + + protected boolean hasDataToProcess = false; + + public synchronized boolean hasDataToProcess(){ + return this.hasDataToProcess; + } + + public synchronized void setHasDataToProcess(boolean hasData){ + this.hasDataToProcess = hasData; + } + +} +Thread A and B must have a reference to a shared MySignal instance for the signaling to work. If thread A and B has references to different MySignal instance, they will not detect each others signals. The data to be processed can be located in a shared buffer separate from the MySignal instance. + +Busy Wait + +Thread B which is to process the data is waiting for data to become available for processing. In other words, it is waiting for a signal from thread A which causes hasDataToProcess() to return true. Here is the loop that thread B is running in, while waiting for this signal: + +protected MySignal sharedSignal = ... + +... + +while(!sharedSignal.hasDataToProcess()){ + //do nothing... busy waiting +} +Notice how the while loop keeps executing until hasDataToProcess() returns true. This is called busy waiting. The thread is busy while waiting. + +wait(), notify() and notifyAll() + +Busy waiting is not a very efficient utilization of the CPU in the computer running the waiting thread, except if the average waiting time is very small. Else, it would be smarter if the waiting thread could somehow sleep or become inactive until it receives the signal it is waiting for. + +Java has a builtin wait mechanism that enable threads to become inactive while waiting for signals. The class java.lang.Object defines three methods, wait(), notify(), and notifyAll(), to facilitate this. + +A thread that calls wait() on any object becomes inactive until another thread calls notify() on that object. In order to call either wait() or notify the calling thread must first obtain the lock on that object. In other words, the calling thread must call wait() or notify() from inside a synchronized block. Here is a modified version of MySignal called MyWaitNotify that uses wait() and notify(). + + +public class MonitorObject{ +} + +public class MyWaitNotify{ + + MonitorObject myMonitorObject = new MonitorObject(); + + public void doWait(){ + synchronized(myMonitorObject){ + try{ + myMonitorObject.wait(); + } catch(InterruptedException e){...} + } + } + + public void doNotify(){ + synchronized(myMonitorObject){ + myMonitorObject.notify(); + } + } +} +The waiting thread would call doWait(), and the notifying thread would call doNotify(). When a thread calls notify() on an object, one of the threads waiting on that object are awakened and allowed to execute. There is also a notifyAll() method that will wake all threads waiting on a given object. + +As you can see both the waiting and notifying thread calls wait() and notify() from within a synchronized block. This is mandatory! A thread cannot call wait(), notify() or notifyAll() without holding the lock on the object the method is called on. If it does, an IllegalMonitorStateException is thrown. + +But, how is this possible? Wouldn't the waiting thread keep the lock on the monitor object (myMonitorObject) as long as it is executing inside a synchronized block? Will the waiting thread not block the notifying thread from ever entering the synchronized block in doNotify()? The answer is no. Once a thread calls wait() it releases the lock it holds on the monitor object. This allows other threads to call wait() or notify() too, since these methods must be called from inside a synchronized block. + +Once a thread is awakened it cannot exit the wait() call until the thread calling notify() has left its synchronized block. In other words: The awakened thread must reobtain the lock on the monitor object before it can exit the wait() call, because the wait call is nested inside a synchronized block. If multiple threads are awakened using notifyAll() only one awakened thread at a time can exit the wait() method, since each thread must obtain the lock on the monitor object in turn before exiting wait(). + +Missed Signals + +The methods notify() and notifyAll() do not save the method calls to them in case no threads are waiting when they are called. The notify signal is then just lost. Therefore, if a thread calls notify() before the thread to signal has called wait(), the signal will be missed by the waiting thread. This may or may not be a problem, but in some cases this may result in the waiting thread waiting forever, never waking up, because the signal to wake up was missed. + +To avoid losing signals they should be stored inside the signal class. In the MyWaitNotify example the notify signal should be stored in a member variable inside the MyWaitNotify instance. Here is a modified version of MyWaitNotify that does this: + +public class MyWaitNotify2{ + + MonitorObject myMonitorObject = new MonitorObject(); + boolean wasSignalled = false; + + public void doWait(){ + synchronized(myMonitorObject){ + if(!wasSignalled){ + try{ + myMonitorObject.wait(); + } catch(InterruptedException e){...} + } + //clear signal and continue running. + wasSignalled = false; + } + } + + public void doNotify(){ + synchronized(myMonitorObject){ + wasSignalled = true; + myMonitorObject.notify(); + } + } +} +Notice how the doNotify() method now sets the wasSignalled variable to true before calling notify(). Also, notice how the doWait() method now checks the wasSignalled variable before calling wait(). In fact it only calls wait() if no signal was received in between the previous doWait() call and this. + +Spurious Wakeups + +For inexplicable reasons it is possible for threads to wake up even if notify() and notifyAll() has not been called. This is known as spurious wakeups. Wakeups without any reason. + +If a spurious wakeup occurs in the MyWaitNofity2 class's doWait() method the waiting thread may continue processing without having received a proper signal to do so! This could cause serious problems in your application. + +To guard against spurious wakeups the signal member variable is checked inside a while loop instead of inside an if-statement. Such a while loop is also called a spin lock. The thread awakened spins around until the condition in the spin lock (while loop) becomes false. Here is a modified version of MyWaitNotify2 that shows this: + +public class MyWaitNotify3{ + + MonitorObject myMonitorObject = new MonitorObject(); + boolean wasSignalled = false; + + public void doWait(){ + synchronized(myMonitorObject){ + while(!wasSignalled){ + try{ + myMonitorObject.wait(); + } catch(InterruptedException e){...} + } + //clear signal and continue running. + wasSignalled = false; + } + } + + public void doNotify(){ + synchronized(myMonitorObject){ + wasSignalled = true; + myMonitorObject.notify(); + } + } +} +Notice how the wait() call is now nested inside a while loop instead of an if-statement. If the waiting thread wakes up without having received a signal, the wasSignalled member will still be false, and the while loop will execute once more, causing the awakened thread to go back to waiting. + +Multiple Threads Waiting for the Same Signals + +The while loop is also a nice solution if you have multiple threads waiting, which are all awakened using notifyAll(), but only one of them should be allowed to continue. Only one thread at a time will be able to obtain the lock on the monitor object, meaning only one thread can exit the wait() call and clear the wasSignalled flag. Once this thread then exits the synchronized block in the doWait() method, the other threads can exit the wait() call and check the wasSignalled member variable inside the while loop. However, this flag was cleared by the first thread waking up, so the rest of the awakened threads go back to waiting, until the next signal arrives. + + +Don't call wait() on constant String's or global objects + +An earlier version of this text had an edition of the MyWaitNotify example class which used a constant string ( "" ) as monitor object. Here is how that example looked: + +public class MyWaitNotify{ + + String myMonitorObject = ""; + boolean wasSignalled = false; + + public void doWait(){ + synchronized(myMonitorObject){ + while(!wasSignalled){ + try{ + myMonitorObject.wait(); + } catch(InterruptedException e){...} + } + //clear signal and continue running. + wasSignalled = false; + } + } + + public void doNotify(){ + synchronized(myMonitorObject){ + wasSignalled = true; + myMonitorObject.notify(); + } + } +} +The problem with calling wait() and notify() on the empty string, or any other constant string is, that the JVM/Compiler internally translates constant strings into the same object. That means, that even if you have two different MyWaitNotify instances, they both reference the same empty string instance. This also means that threads calling doWait() on the first MyWaitNotify instance risk being awakened by doNotify() calls on the second MyWaitNotify instance. + +The situation is sketched in the diagram below: + +Calling wait()/notify() on string constants +Remember, that even if the 4 threads call wait() and notify() on the same shared string instance, the signals from the doWait() and doNotify() calls are stored individually in the two MyWaitNotify instances. A doNotify() call on the MyWaitNotify 1 may wake threads waiting in MyWaitNotify 2, but the signal will only be stored in MyWaitNotify 1. + +At first this may not seem like a big problem. After all, if doNotify() is called on the second MyWaitNotify instance all that can really happen is that Thread A and B are awakened by mistake. This awakened thread (A or B) will check its signal in the while loop, and go back to waiting because doNotify() was not called on the first MyWaitNotify instance, in which they are waiting. This situation is equal to a provoked spurious wakeup. Thread A or B awakens without having been signaled. But the code can handle this, so the threads go back to waiting. + +The problem is, that since the doNotify() call only calls notify() and not notifyAll(), only one thread is awakened even if 4 threads are waiting on the same string instance (the empty string). So, if one of the threads A or B is awakened when really the signal was for C or D, the awakened thread (A or B) will check its signal, see that no signal was received, and go back to waiting. Neither C or D wakes up to check the signal they had actually received, so the signal is missed. This situation is equal to the missed signals problem described earlier. C and D were sent a signal but fail to respond to it. + +If the doNotify() method had called notifyAll() instead of notify(), all waiting threads had been awakened and checked for signals in turn. Thread A and B would have gone back to waiting, but one of either C or D would have noticed the signal and left the doWait() method call. The other of C and D would go back to waiting, because the thread discovering the signal clears it on the way out of doWait(). + +You may be tempted then to always call notifyAll() instead notify(), but this is a bad idea performance wise. There is no reason to wake up all threads waiting when only one of them can respond to the signal. + +So: Don't use global objects, string constants etc. for wait() / notify() mechanisms. Use an object that is unique to the construct using it. For instance, each MyWaitNotify3 (example from earlier sections) instance has its own MonitorObject instance rather than using the empty string for wait() / notify() calls. \ No newline at end of file From 2b8797e957f29b99b61cc455e1413872ce21c73f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:09:29 +0800 Subject: [PATCH 142/524] Published with https://stackedit.io/ --- ...272\277\347\250\213\351\200\232\344\277\241.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index f81ed30..a9695c9 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -1,8 +1,8 @@ -#09.线程通讯 +#09.线程通信 The purpose of thread signaling is to enable threads to send signals to each other. Additionally, thread signaling enables threads to wait for signals from other threads. For instance, a thread B might wait for a signal from thread A indicating that data is ready to be processed. -Signaling via Shared Objects +##Signaling via Shared Objects A simple way for threads to send signals to each other is by setting the signal values in some shared object variable. Thread A may set the boolean member variable hasDataToProcess to true from inside a synchronized block, and thread B may read the hasDataToProcess member variable, also inside a synchronized block. Here is a simple example of an object that can hold such a signal, and provide methods to set and check it: @@ -21,7 +21,7 @@ public class MySignal{ } Thread A and B must have a reference to a shared MySignal instance for the signaling to work. If thread A and B has references to different MySignal instance, they will not detect each others signals. The data to be processed can be located in a shared buffer separate from the MySignal instance. -Busy Wait +##Busy Wait Thread B which is to process the data is waiting for data to become available for processing. In other words, it is waiting for a signal from thread A which causes hasDataToProcess() to return true. Here is the loop that thread B is running in, while waiting for this signal: @@ -72,7 +72,7 @@ But, how is this possible? Wouldn't the waiting thread keep the lock on the moni Once a thread is awakened it cannot exit the wait() call until the thread calling notify() has left its synchronized block. In other words: The awakened thread must reobtain the lock on the monitor object before it can exit the wait() call, because the wait call is nested inside a synchronized block. If multiple threads are awakened using notifyAll() only one awakened thread at a time can exit the wait() method, since each thread must obtain the lock on the monitor object in turn before exiting wait(). -Missed Signals +##Missed Signals The methods notify() and notifyAll() do not save the method calls to them in case no threads are waiting when they are called. The notify signal is then just lost. Therefore, if a thread calls notify() before the thread to signal has called wait(), the signal will be missed by the waiting thread. This may or may not be a problem, but in some cases this may result in the waiting thread waiting forever, never waking up, because the signal to wake up was missed. @@ -104,7 +104,7 @@ public class MyWaitNotify2{ } Notice how the doNotify() method now sets the wasSignalled variable to true before calling notify(). Also, notice how the doWait() method now checks the wasSignalled variable before calling wait(). In fact it only calls wait() if no signal was received in between the previous doWait() call and this. -Spurious Wakeups +##Spurious Wakeups For inexplicable reasons it is possible for threads to wake up even if notify() and notifyAll() has not been called. This is known as spurious wakeups. Wakeups without any reason. @@ -143,7 +143,7 @@ Multiple Threads Waiting for the Same Signals The while loop is also a nice solution if you have multiple threads waiting, which are all awakened using notifyAll(), but only one of them should be allowed to continue. Only one thread at a time will be able to obtain the lock on the monitor object, meaning only one thread can exit the wait() call and clear the wasSignalled flag. Once this thread then exits the synchronized block in the doWait() method, the other threads can exit the wait() call and check the wasSignalled member variable inside the while loop. However, this flag was cleared by the first thread waking up, so the rest of the awakened threads go back to waiting, until the next signal arrives. -Don't call wait() on constant String's or global objects +##Don't call wait() on constant String's or global objects An earlier version of this text had an edition of the MyWaitNotify example class which used a constant string ( "" ) as monitor object. Here is how that example looked: @@ -173,7 +173,7 @@ public class MyWaitNotify{ } The problem with calling wait() and notify() on the empty string, or any other constant string is, that the JVM/Compiler internally translates constant strings into the same object. That means, that even if you have two different MyWaitNotify instances, they both reference the same empty string instance. This also means that threads calling doWait() on the first MyWaitNotify instance risk being awakened by doNotify() calls on the second MyWaitNotify instance. -The situation is sketched in the diagram below: +##The situation is sketched in the diagram below: Calling wait()/notify() on string constants Remember, that even if the 4 threads call wait() and notify() on the same shared string instance, the signals from the doWait() and doNotify() calls are stored individually in the two MyWaitNotify instances. A doNotify() call on the MyWaitNotify 1 may wake threads waiting in MyWaitNotify 2, but the signal will only be stored in MyWaitNotify 1. From 22e23673fbe0182318e61faa797aedb8467333e0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:14:59 +0800 Subject: [PATCH 143/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index a9695c9..61e6747 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -173,7 +173,9 @@ public class MyWaitNotify{ } The problem with calling wait() and notify() on the empty string, or any other constant string is, that the JVM/Compiler internally translates constant strings into the same object. That means, that even if you have two different MyWaitNotify instances, they both reference the same empty string instance. This also means that threads calling doWait() on the first MyWaitNotify instance risk being awakened by doNotify() calls on the second MyWaitNotify instance. -##The situation is sketched in the diagram below: +The situation is sketched in the diagram below: + +![enter image description here](http://tutorials.jenkov.com/images/java-concurrency/strings-wait-notify.png) Calling wait()/notify() on string constants Remember, that even if the 4 threads call wait() and notify() on the same shared string instance, the signals from the doWait() and doNotify() calls are stored individually in the two MyWaitNotify instances. A doNotify() call on the MyWaitNotify 1 may wake threads waiting in MyWaitNotify 2, but the signal will only be stored in MyWaitNotify 1. From fa0c19000f8945b85c3c51142c795fc562147f2d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:25:29 +0800 Subject: [PATCH 144/524] Published with https://stackedit.io/ --- ...9.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index 61e6747..246b466 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -1,8 +1,8 @@ #09.线程通信 -The purpose of thread signaling is to enable threads to send signals to each other. Additionally, thread signaling enables threads to wait for signals from other threads. For instance, a thread B might wait for a signal from thread A indicating that data is ready to be processed. +线程通信的目的在于:让线程之间可以彼此发送信号。因此,线程通信也让线程等待其他线程发送的信号。举个例子,线程B等待线程A的信号,这个信号用于通知线程B数据已经准备就绪。 -##Signaling via Shared Objects +##通过共享对象通信(Signaling via Shared Objects) A simple way for threads to send signals to each other is by setting the signal values in some shared object variable. Thread A may set the boolean member variable hasDataToProcess to true from inside a synchronized block, and thread B may read the hasDataToProcess member variable, also inside a synchronized block. Here is a simple example of an object that can hold such a signal, and provide methods to set and check it: @@ -21,7 +21,7 @@ public class MySignal{ } Thread A and B must have a reference to a shared MySignal instance for the signaling to work. If thread A and B has references to different MySignal instance, they will not detect each others signals. The data to be processed can be located in a shared buffer separate from the MySignal instance. -##Busy Wait +##忙等待(Busy Wait) Thread B which is to process the data is waiting for data to become available for processing. In other words, it is waiting for a signal from thread A which causes hasDataToProcess() to return true. Here is the loop that thread B is running in, while waiting for this signal: @@ -34,7 +34,7 @@ while(!sharedSignal.hasDataToProcess()){ } Notice how the while loop keeps executing until hasDataToProcess() returns true. This is called busy waiting. The thread is busy while waiting. -wait(), notify() and notifyAll() +##wait(), notify() and notifyAll() Busy waiting is not a very efficient utilization of the CPU in the computer running the waiting thread, except if the average waiting time is very small. Else, it would be smarter if the waiting thread could somehow sleep or become inactive until it receives the signal it is waiting for. From 54a679d744ee4a8fe2ac43b4b49d8f69f0a7e27c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:27:02 +0800 Subject: [PATCH 145/524] Published with https://stackedit.io/ --- ...77\347\250\213\351\200\232\344\277\241.md" | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index 246b466..8984f6a 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -6,6 +6,7 @@ A simple way for threads to send signals to each other is by setting the signal values in some shared object variable. Thread A may set the boolean member variable hasDataToProcess to true from inside a synchronized block, and thread B may read the hasDataToProcess member variable, also inside a synchronized block. Here is a simple example of an object that can hold such a signal, and provide methods to set and check it: +```Java public class MySignal{ protected boolean hasDataToProcess = false; @@ -19,12 +20,15 @@ public class MySignal{ } } +``` + Thread A and B must have a reference to a shared MySignal instance for the signaling to work. If thread A and B has references to different MySignal instance, they will not detect each others signals. The data to be processed can be located in a shared buffer separate from the MySignal instance. ##忙等待(Busy Wait) Thread B which is to process the data is waiting for data to become available for processing. In other words, it is waiting for a signal from thread A which causes hasDataToProcess() to return true. Here is the loop that thread B is running in, while waiting for this signal: +```Java protected MySignal sharedSignal = ... ... @@ -32,6 +36,8 @@ protected MySignal sharedSignal = ... while(!sharedSignal.hasDataToProcess()){ //do nothing... busy waiting } +``` + Notice how the while loop keeps executing until hasDataToProcess() returns true. This is called busy waiting. The thread is busy while waiting. ##wait(), notify() and notifyAll() @@ -42,7 +48,7 @@ Java has a builtin wait mechanism that enable threads to become inactive while w A thread that calls wait() on any object becomes inactive until another thread calls notify() on that object. In order to call either wait() or notify the calling thread must first obtain the lock on that object. In other words, the calling thread must call wait() or notify() from inside a synchronized block. Here is a modified version of MySignal called MyWaitNotify that uses wait() and notify(). - +```Java public class MonitorObject{ } @@ -64,6 +70,8 @@ public class MyWaitNotify{ } } } +``` + The waiting thread would call doWait(), and the notifying thread would call doNotify(). When a thread calls notify() on an object, one of the threads waiting on that object are awakened and allowed to execute. There is also a notifyAll() method that will wake all threads waiting on a given object. As you can see both the waiting and notifying thread calls wait() and notify() from within a synchronized block. This is mandatory! A thread cannot call wait(), notify() or notifyAll() without holding the lock on the object the method is called on. If it does, an IllegalMonitorStateException is thrown. @@ -78,6 +86,7 @@ The methods notify() and notifyAll() do not save the method calls to them in cas To avoid losing signals they should be stored inside the signal class. In the MyWaitNotify example the notify signal should be stored in a member variable inside the MyWaitNotify instance. Here is a modified version of MyWaitNotify that does this: +```Java public class MyWaitNotify2{ MonitorObject myMonitorObject = new MonitorObject(); @@ -102,6 +111,8 @@ public class MyWaitNotify2{ } } } +``` + Notice how the doNotify() method now sets the wasSignalled variable to true before calling notify(). Also, notice how the doWait() method now checks the wasSignalled variable before calling wait(). In fact it only calls wait() if no signal was received in between the previous doWait() call and this. ##Spurious Wakeups @@ -112,6 +123,7 @@ If a spurious wakeup occurs in the MyWaitNofity2 class's doWait() method the wai To guard against spurious wakeups the signal member variable is checked inside a while loop instead of inside an if-statement. Such a while loop is also called a spin lock. The thread awakened spins around until the condition in the spin lock (while loop) becomes false. Here is a modified version of MyWaitNotify2 that shows this: +```Java public class MyWaitNotify3{ MonitorObject myMonitorObject = new MonitorObject(); @@ -136,9 +148,11 @@ public class MyWaitNotify3{ } } } +``` + Notice how the wait() call is now nested inside a while loop instead of an if-statement. If the waiting thread wakes up without having received a signal, the wasSignalled member will still be false, and the while loop will execute once more, causing the awakened thread to go back to waiting. -Multiple Threads Waiting for the Same Signals +##Multiple Threads Waiting for the Same Signals The while loop is also a nice solution if you have multiple threads waiting, which are all awakened using notifyAll(), but only one of them should be allowed to continue. Only one thread at a time will be able to obtain the lock on the monitor object, meaning only one thread can exit the wait() call and clear the wasSignalled flag. Once this thread then exits the synchronized block in the doWait() method, the other threads can exit the wait() call and check the wasSignalled member variable inside the while loop. However, this flag was cleared by the first thread waking up, so the rest of the awakened threads go back to waiting, until the next signal arrives. @@ -147,6 +161,7 @@ The while loop is also a nice solution if you have multiple threads waiting, whi An earlier version of this text had an edition of the MyWaitNotify example class which used a constant string ( "" ) as monitor object. Here is how that example looked: +```Java public class MyWaitNotify{ String myMonitorObject = ""; @@ -171,6 +186,8 @@ public class MyWaitNotify{ } } } +``` + The problem with calling wait() and notify() on the empty string, or any other constant string is, that the JVM/Compiler internally translates constant strings into the same object. That means, that even if you have two different MyWaitNotify instances, they both reference the same empty string instance. This also means that threads calling doWait() on the first MyWaitNotify instance risk being awakened by doNotify() calls on the second MyWaitNotify instance. The situation is sketched in the diagram below: From 5219b2ab21d3cca5fd0d9e2c58f06facb06812c7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:29:07 +0800 Subject: [PATCH 146/524] Published with https://stackedit.io/ --- .../10.\346\255\273\351\224\201.md" | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 "Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" diff --git "a/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" "b/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" new file mode 100644 index 0000000..3d73037 --- /dev/null +++ "b/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" @@ -0,0 +1,80 @@ +#10.死锁 + +A deadlock is when two or more threads are blocked waiting to obtain locks that some of the other threads in the deadlock are holding. Deadlock can occur when multiple threads need the same locks, at the same time, but obtain them in different order. + +For instance, if thread 1 locks A, and tries to lock B, and thread 2 has already locked B, and tries to lock A, a deadlock arises. Thread 1 can never get B, and thread 2 can never get A. In addition, neither of them will ever know. They will remain blocked on each their object, A and B, forever. This situation is a deadlock. + +The situation is illustrated below: + +Thread 1 locks A, waits for B +Thread 2 locks B, waits for A +Here is an example of a TreeNode class that call synchronized methods in different instances: + +public class TreeNode { + + TreeNode parent = null; + List children = new ArrayList(); + + public synchronized void addChild(TreeNode child){ + if(!this.children.contains(child)) { + this.children.add(child); + child.setParentOnly(this); + } + } + + public synchronized void addChildOnly(TreeNode child){ + if(!this.children.contains(child){ + this.children.add(child); + } + } + + public synchronized void setParent(TreeNode parent){ + this.parent = parent; + parent.addChildOnly(this); + } + + public synchronized void setParentOnly(TreeNode parent){ + this.parent = parent; + } +} +If a thread (1) calls the parent.addChild(child) method at the same time as another thread (2) calls the child.setParent(parent) method, on the same parent and child instances, a deadlock can occur. Here is some pseudo code that illustrates this: + +Thread 1: parent.addChild(child); //locks parent + --> child.setParentOnly(parent); + +Thread 2: child.setParent(parent); //locks child + --> parent.addChildOnly() +First thread 1 calls parent.addChild(child). Since addChild() is synchronized thread 1 effectively locks the parent object for access from other treads. + +Then thread 2 calls child.setParent(parent). Since setParent() is synchronized thread 2 effectively locks the child object for acces from other threads. + +Now both child and parent objects are locked by two different threads. Next thread 1 tries to call child.setParentOnly() method, but the child object is locked by thread 2, so the method call just blocks. Thread 2 also tries to call parent.addChildOnly() but the parent object is locked by thread 1, causing thread 2 to block on that method call. Now both threads are blocked waiting to obtain locks the other thread holds. + +Note: The two threads must call parent.addChild(child) and child.setParent(parent) at the same time as described above, and on the same two parent and child instances for a deadlock to occur. The code above may execute fine for a long time until all of a sudden it deadlocks. + +The threads really need to take the locks *at the same time*. For instance, if thread 1 is a bit ahead of thread2, and thus locks both A and B, then thread 2 will be blocked already when trying to lock B. Then no deadlock occurs. Since thread scheduling often is unpredictable there is no way to predict *when* a deadlock occurs. Only that it *can* occur. + + +More Complicated Deadlocks + +Deadlock can also include more than two threads. This makes it harder to detect. Here is an example in which four threads have deadlocked: + +Thread 1 locks A, waits for B +Thread 2 locks B, waits for C +Thread 3 locks C, waits for D +Thread 4 locks D, waits for A +Thread 1 waits for thread 2, thread 2 waits for thread 3, thread 3 waits for thread 4, and thread 4 waits for thread 1. + +Database Deadlocks + +A more complicated situation in which deadlocks can occur, is a database transaction. A database transaction may consist of many SQL update requests. When a record is updated during a transaction, that record is locked for updates from other transactions, until the first transaction completes. Each update request within the same transaction may therefore lock some records in the database. + +If multiple transactions are running at the same time that need to update the same records, there is a risk of them ending up in a deadlock. + +For example + +Transaction 1, request 1, locks record 1 for update +Transaction 2, request 1, locks record 2 for update +Transaction 1, request 2, tries to lock record 2 for update. +Transaction 2, request 2, tries to lock record 1 for update. +Since the locks are taken in different requests, and not all locks needed for a given transaction are known ahead of time, it is hard to detect or prevent deadlocks in database transactions. \ No newline at end of file From 7eedddae2c51093841f0f33325141a292f7c3a6c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:38:06 +0800 Subject: [PATCH 147/524] Published with https://stackedit.io/ --- .../10.\346\255\273\351\224\201.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" "b/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" index 3d73037..080a210 100644 --- "a/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" @@ -55,7 +55,7 @@ Note: The two threads must call parent.addChild(child) and child.setParent(paren The threads really need to take the locks *at the same time*. For instance, if thread 1 is a bit ahead of thread2, and thus locks both A and B, then thread 2 will be blocked already when trying to lock B. Then no deadlock occurs. Since thread scheduling often is unpredictable there is no way to predict *when* a deadlock occurs. Only that it *can* occur. -More Complicated Deadlocks +##More Complicated Deadlocks Deadlock can also include more than two threads. This makes it harder to detect. Here is an example in which four threads have deadlocked: @@ -65,7 +65,7 @@ Thread 3 locks C, waits for D Thread 4 locks D, waits for A Thread 1 waits for thread 2, thread 2 waits for thread 3, thread 3 waits for thread 4, and thread 4 waits for thread 1. -Database Deadlocks +##Database Deadlocks A more complicated situation in which deadlocks can occur, is a database transaction. A database transaction may consist of many SQL update requests. When a record is updated during a transaction, that record is locked for updates from other transactions, until the first transaction completes. Each update request within the same transaction may therefore lock some records in the database. @@ -73,8 +73,11 @@ If multiple transactions are running at the same time that need to update the sa For example +``` Transaction 1, request 1, locks record 1 for update Transaction 2, request 1, locks record 2 for update Transaction 1, request 2, tries to lock record 2 for update. Transaction 2, request 2, tries to lock record 1 for update. +``` + Since the locks are taken in different requests, and not all locks needed for a given transaction are known ahead of time, it is hard to detect or prevent deadlocks in database transactions. \ No newline at end of file From 45dec4b31f1494d44a1571ab820f2f768e0b32ec Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:41:59 +0800 Subject: [PATCH 148/524] Published with https://stackedit.io/ --- .../10.\346\255\273\351\224\201.md" | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" "b/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" index 080a210..b28a67e 100644 --- "a/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" @@ -5,11 +5,13 @@ A deadlock is when two or more threads are blocked waiting to obtain locks that For instance, if thread 1 locks A, and tries to lock B, and thread 2 has already locked B, and tries to lock A, a deadlock arises. Thread 1 can never get B, and thread 2 can never get A. In addition, neither of them will ever know. They will remain blocked on each their object, A and B, forever. This situation is a deadlock. The situation is illustrated below: - +``` Thread 1 locks A, waits for B Thread 2 locks B, waits for A +``` Here is an example of a TreeNode class that call synchronized methods in different instances: +```Java public class TreeNode { TreeNode parent = null; @@ -37,13 +39,18 @@ public class TreeNode { this.parent = parent; } } +``` + If a thread (1) calls the parent.addChild(child) method at the same time as another thread (2) calls the child.setParent(parent) method, on the same parent and child instances, a deadlock can occur. Here is some pseudo code that illustrates this: +``` Thread 1: parent.addChild(child); //locks parent --> child.setParentOnly(parent); Thread 2: child.setParent(parent); //locks child --> parent.addChildOnly() +``` + First thread 1 calls parent.addChild(child). Since addChild() is synchronized thread 1 effectively locks the parent object for access from other treads. Then thread 2 calls child.setParent(parent). Since setParent() is synchronized thread 2 effectively locks the child object for acces from other threads. @@ -58,11 +65,12 @@ The threads really need to take the locks *at the same time*. For instance, if t ##More Complicated Deadlocks Deadlock can also include more than two threads. This makes it harder to detect. Here is an example in which four threads have deadlocked: - +``` Thread 1 locks A, waits for B Thread 2 locks B, waits for C Thread 3 locks C, waits for D Thread 4 locks D, waits for A +``` Thread 1 waits for thread 2, thread 2 waits for thread 3, thread 3 waits for thread 4, and thread 4 waits for thread 1. ##Database Deadlocks From e1bb70e66f5a2cee0c93999d6c75b206ab4b85dd Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 14:42:53 +0800 Subject: [PATCH 149/524] Published with https://stackedit.io/ From 95ae6702d72b04a20bd0458eb918ae2ae2fbe614 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 16:04:25 +0800 Subject: [PATCH 150/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index 8984f6a..e34fc97 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -8,7 +8,6 @@ A simple way for threads to send signals to each other is by setting the signal ```Java public class MySignal{ - protected boolean hasDataToProcess = false; public synchronized boolean hasDataToProcess(){ @@ -18,7 +17,6 @@ public class MySignal{ public synchronized void setHasDataToProcess(boolean hasData){ this.hasDataToProcess = hasData; } - } ``` @@ -26,13 +24,13 @@ Thread A and B must have a reference to a shared MySignal instance for the signa ##忙等待(Busy Wait) + + Thread B which is to process the data is waiting for data to become available for processing. In other words, it is waiting for a signal from thread A which causes hasDataToProcess() to return true. Here is the loop that thread B is running in, while waiting for this signal: ```Java protected MySignal sharedSignal = ... -... - while(!sharedSignal.hasDataToProcess()){ //do nothing... busy waiting } From 30f48437211fe20ba43b68294bd3d77f6870f258 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 16:32:22 +0800 Subject: [PATCH 151/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index e34fc97..e61ddc8 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -4,7 +4,7 @@ ##通过共享对象通信(Signaling via Shared Objects) -A simple way for threads to send signals to each other is by setting the signal values in some shared object variable. Thread A may set the boolean member variable hasDataToProcess to true from inside a synchronized block, and thread B may read the hasDataToProcess member variable, also inside a synchronized block. Here is a simple example of an object that can hold such a signal, and provide methods to set and check it: +线程间进行通信,一个简单的做法就是**通过共享对象存储信号值**。线程A在同步代码块中将`hasDataToProcess`的值设为`true`,然后线程B在同步代码块中读取`hasDataToProcess`的值,这就完成了一次线程通信。下面的这个示例MySignal类用于保存信号值,并提供方法获取这个信号值: ```Java public class MySignal{ @@ -20,7 +20,7 @@ public class MySignal{ } ``` -Thread A and B must have a reference to a shared MySignal instance for the signaling to work. If thread A and B has references to different MySignal instance, they will not detect each others signals. The data to be processed can be located in a shared buffer separate from the MySignal instance. +为了进行通信,线程A和线程B必须拥有共享的MySignal的实例对象的引用。如果线程A和线程B拥有的是不同的MySignal实例引用,它们将不会检测到彼此的信号。The data to be processed can be located in a shared buffer separate from the MySignal instance. ##忙等待(Busy Wait) From bc32358fa456aae51587e3a1123a6d6ee8606ca0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 16:47:03 +0800 Subject: [PATCH 152/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index e61ddc8..6418ae6 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -25,8 +25,7 @@ public class MySignal{ ##忙等待(Busy Wait) - -Thread B which is to process the data is waiting for data to become available for processing. In other words, it is waiting for a signal from thread A which causes hasDataToProcess() to return true. Here is the loop that thread B is running in, while waiting for this signal: +线程B等待数据可用,然后对数据进行处理。换言之,线程B等待线程A发送的信号量,通过检测`hasDataToProcess() `的返回值,如果返回值为true,则证明此时数据准备就绪。下面的循环用于检测信号: ```Java protected MySignal sharedSignal = ... @@ -36,7 +35,8 @@ while(!sharedSignal.hasDataToProcess()){ } ``` -Notice how the while loop keeps executing until hasDataToProcess() returns true. This is called busy waiting. The thread is busy while waiting. +注意这个while循环直至`hasDataToProcess() `返回`true`才退出,这种做法称为**忙等待(Busy Waiting)**。线程在等待过程中一直处于忙碌状态。 + ##wait(), notify() and notifyAll() From a1968b8331cdc41b4d90f05e4fdf091c17af6036 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 17:11:13 +0800 Subject: [PATCH 153/524] Published with https://stackedit.io/ --- ...\272\277\347\250\213\351\200\232\344\277\241.md" | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index 6418ae6..22f9f38 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -38,14 +38,23 @@ while(!sharedSignal.hasDataToProcess()){ 注意这个while循环直至`hasDataToProcess() `返回`true`才退出,这种做法称为**忙等待(Busy Waiting)**。线程在等待过程中一直处于忙碌状态。 -##wait(), notify() and notifyAll() +##wait(), notify()和notifyAll() + +忙等待对计算机的CPU利用率并不友好,除非平均等待时间十分短暂。更好的做法是,让等待的线程处于休眠状态或非活动状态直至它收到信号。 + -Busy waiting is not a very efficient utilization of the CPU in the computer running the waiting thread, except if the average waiting time is very small. Else, it would be smarter if the waiting thread could somehow sleep or become inactive until it receives the signal it is waiting for. Java has a builtin wait mechanism that enable threads to become inactive while waiting for signals. The class java.lang.Object defines three methods, wait(), notify(), and notifyAll(), to facilitate this. A thread that calls wait() on any object becomes inactive until another thread calls notify() on that object. In order to call either wait() or notify the calling thread must first obtain the lock on that object. In other words, the calling thread must call wait() or notify() from inside a synchronized block. Here is a modified version of MySignal called MyWaitNotify that uses wait() and notify(). +忙等待是没有运行的等待线程,但如果把平均轮候时间是非常少的CPU在电脑中的一个非常有效的利用。否则,这将是更明智的,如果等待的线程可以在某种程度上睡觉或处于非活动状态,直到它接收它正在等待信号。 + +Java有一个内置的等待机制,使主题变得不活跃,同时等待信号。本类java.lang.Object定义了三个方法,等(),通知()和notifyAll(),以方便这一点。 + +调用wait()有任何对象的线程处于非活动状态,直到另一个线程调用notify()的对象。为了调用或者等待()或通知调用线程必须首先获得该对象的锁。换句话说,调用线程必须调用wait()或通知()从一个同步块内。这里是MySignal的使用等()和notify()修改后的版本称为MyWaitNotify。 + + ```Java public class MonitorObject{ } From c13c0c5bd035a57756c03de755de3c6e3e3b8024 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 17:17:45 +0800 Subject: [PATCH 154/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index 22f9f38..a38d4b0 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -42,10 +42,9 @@ while(!sharedSignal.hasDataToProcess()){ 忙等待对计算机的CPU利用率并不友好,除非平均等待时间十分短暂。更好的做法是,让等待的线程处于休眠状态或非活动状态直至它收到信号。 +Java内置了等待机制可以让线程处于非活动状态直至收到信号。`java.lang.Object`中定义了三个方法:**wait()**,**notify()**和**notifyAll**用来实现这个机制。 -Java has a builtin wait mechanism that enable threads to become inactive while waiting for signals. The class java.lang.Object defines three methods, wait(), notify(), and notifyAll(), to facilitate this. - A thread that calls wait() on any object becomes inactive until another thread calls notify() on that object. In order to call either wait() or notify the calling thread must first obtain the lock on that object. In other words, the calling thread must call wait() or notify() from inside a synchronized block. Here is a modified version of MySignal called MyWaitNotify that uses wait() and notify(). 忙等待是没有运行的等待线程,但如果把平均轮候时间是非常少的CPU在电脑中的一个非常有效的利用。否则,这将是更明智的,如果等待的线程可以在某种程度上睡觉或处于非活动状态,直到它接收它正在等待信号。 From 0a925f6c53052b4a11bcc3ac73405a9ed28cbb57 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 17:39:42 +0800 Subject: [PATCH 155/524] Published with https://stackedit.io/ --- ...347\272\277\347\250\213\351\200\232\344\277\241.md" | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index a38d4b0..da45ef4 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -44,15 +44,7 @@ while(!sharedSignal.hasDataToProcess()){ Java内置了等待机制可以让线程处于非活动状态直至收到信号。`java.lang.Object`中定义了三个方法:**wait()**,**notify()**和**notifyAll**用来实现这个机制。 - -A thread that calls wait() on any object becomes inactive until another thread calls notify() on that object. In order to call either wait() or notify the calling thread must first obtain the lock on that object. In other words, the calling thread must call wait() or notify() from inside a synchronized block. Here is a modified version of MySignal called MyWaitNotify that uses wait() and notify(). - -忙等待是没有运行的等待线程,但如果把平均轮候时间是非常少的CPU在电脑中的一个非常有效的利用。否则,这将是更明智的,如果等待的线程可以在某种程度上睡觉或处于非活动状态,直到它接收它正在等待信号。 - -Java有一个内置的等待机制,使主题变得不活跃,同时等待信号。本类java.lang.Object定义了三个方法,等(),通知()和notifyAll(),以方便这一点。 - -调用wait()有任何对象的线程处于非活动状态,直到另一个线程调用notify()的对象。为了调用或者等待()或通知调用线程必须首先获得该对象的锁。换句话说,调用线程必须调用wait()或通知()从一个同步块内。这里是MySignal的使用等()和notify()修改后的版本称为MyWaitNotify。 - +在线程内部调用任意对象的`wait()`会使该线程变成暂停状态,直到其他线程调用同一个对象的`notify()`或`notifyAll()`方法。如果想要调用对象的wait()/notify()方法,线程先必须取的该对象的同步锁。换言之,**wait()和notify()方法的调用必须在同步代码内部**。上面例子的wait()/notify()版本: ```Java public class MonitorObject{ From 51d7d6c6411f7850807b39fc4c7ff05c87638efa Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 17:41:33 +0800 Subject: [PATCH 156/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index da45ef4..f2aec15 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -70,6 +70,8 @@ public class MyWaitNotify{ } ``` + + The waiting thread would call doWait(), and the notifying thread would call doNotify(). When a thread calls notify() on an object, one of the threads waiting on that object are awakened and allowed to execute. There is also a notifyAll() method that will wake all threads waiting on a given object. As you can see both the waiting and notifying thread calls wait() and notify() from within a synchronized block. This is mandatory! A thread cannot call wait(), notify() or notifyAll() without holding the lock on the object the method is called on. If it does, an IllegalMonitorStateException is thrown. From 763536e755e88b1ccb9c59ca646ffeb2b1fe76f9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 12 Sep 2014 17:50:38 +0800 Subject: [PATCH 157/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index f2aec15..b2353a7 100644 --- "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -70,7 +70,7 @@ public class MyWaitNotify{ } ``` - +等待通知的线程调用`doWait()`方法,而通知线程调用`doNotify()`方法。当一个线程调用一个对象的`notify()`方法后,等待这个对象的其中一个线程就被唤醒并执行。与`notify()`方法不同的是,`notifyAll()`会唤醒所有等待这个对象的线程。 The waiting thread would call doWait(), and the notifying thread would call doNotify(). When a thread calls notify() on an object, one of the threads waiting on that object are awakened and allowed to execute. There is also a notifyAll() method that will wake all threads waiting on a given object. From a755c07ce67a262442f627ea2610f887b52c4423 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 00:58:27 +0800 Subject: [PATCH 158/524] rename directory --- ...45\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" | 0 ...47\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" | 0 ...47\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" | 0 ...22\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" | 0 ...44\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" | 0 ...44\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" | 0 ...45\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" | 0 .../08.Java\345\220\214\346\255\245\345\235\227" | 0 .../08.Java\345\220\214\346\255\245\345\235\227.md" | 0 .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 0 .../10.\346\255\273\351\224\201.md" | 0 {Java-Concurrency-Multithreading => Java-Concurrency}/README.md | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename "Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" => "Java-Concurrency/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" (100%) rename "Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" => "Java-Concurrency/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" (100%) rename "Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" => "Java-Concurrency/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" (100%) rename "Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" => "Java-Concurrency/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" (100%) rename "Java-Concurrency-Multithreading/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" => "Java-Concurrency/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" (100%) rename "Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" => "Java-Concurrency/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" (100%) rename "Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" => "Java-Concurrency/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" (100%) rename "Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" => "Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227" (100%) rename "Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" => "Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" (100%) rename "Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" => "Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" (100%) rename "Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" => "Java-Concurrency/10.\346\255\273\351\224\201.md" (100%) rename {Java-Concurrency-Multithreading => Java-Concurrency}/README.md (100%) diff --git "a/Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" "b/Java-Concurrency/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" similarity index 100% rename from "Java-Concurrency-Multithreading/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" rename to "Java-Concurrency/01.Java \345\271\266\345\217\221\344\270\216\345\244\232\347\272\277\347\250\213.md" diff --git "a/Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" "b/Java-Concurrency/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" similarity index 100% rename from "Java-Concurrency-Multithreading/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" rename to "Java-Concurrency/02.\345\244\232\347\272\277\347\250\213\347\232\204\345\245\275\345\244\204.md" diff --git "a/Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" "b/Java-Concurrency/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" similarity index 100% rename from "Java-Concurrency-Multithreading/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" rename to "Java-Concurrency/03.\345\244\232\347\272\277\347\250\213\347\232\204\346\210\220\346\234\254.md" diff --git "a/Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" "b/Java-Concurrency/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" similarity index 100% rename from "Java-Concurrency-Multithreading/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" rename to "Java-Concurrency/04.\345\210\233\345\273\272\345\222\214\345\220\257\345\212\250Java\347\272\277\347\250\213.md" diff --git "a/Java-Concurrency-Multithreading/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" "b/Java-Concurrency/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" similarity index 100% rename from "Java-Concurrency-Multithreading/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" rename to "Java-Concurrency/05.\347\253\236\346\200\201\346\235\241\344\273\266\345\222\214\344\270\264\347\225\214\345\214\272.md" diff --git "a/Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" "b/Java-Concurrency/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" similarity index 100% rename from "Java-Concurrency-Multithreading/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" rename to "Java-Concurrency/06.\347\272\277\347\250\213\345\256\211\345\205\250\344\270\216\350\265\204\346\272\220\345\205\261\344\272\253.md" diff --git "a/Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" "b/Java-Concurrency/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" similarity index 100% rename from "Java-Concurrency-Multithreading/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" rename to "Java-Concurrency/07.\347\272\277\347\250\213\345\256\211\345\205\250\345\222\214\344\270\215\345\217\230\346\200\247.md" diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227" similarity index 100% rename from "Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227" rename to "Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227" diff --git "a/Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" similarity index 100% rename from "Java-Concurrency-Multithreading/08.Java\345\220\214\346\255\245\345\235\227.md" rename to "Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" diff --git "a/Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" similarity index 100% rename from "Java-Concurrency-Multithreading/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" rename to "Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" diff --git "a/Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" similarity index 100% rename from "Java-Concurrency-Multithreading/10.\346\255\273\351\224\201.md" rename to "Java-Concurrency/10.\346\255\273\351\224\201.md" diff --git a/Java-Concurrency-Multithreading/README.md b/Java-Concurrency/README.md similarity index 100% rename from Java-Concurrency-Multithreading/README.md rename to Java-Concurrency/README.md From b6a4ddc406d33d391be6041838e176e439b3e1cf Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 01:08:42 +0800 Subject: [PATCH 159/524] Published with https://stackedit.io/ From 709313d6f6e6610bd3350b7ef31e2665fe3075ff Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 02:23:32 +0800 Subject: [PATCH 160/524] Published with https://stackedit.io/ --- ...9.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index b2353a7..11f2071 100644 --- "a/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -72,15 +72,13 @@ public class MyWaitNotify{ 等待通知的线程调用`doWait()`方法,而通知线程调用`doNotify()`方法。当一个线程调用一个对象的`notify()`方法后,等待这个对象的其中一个线程就被唤醒并执行。与`notify()`方法不同的是,`notifyAll()`会唤醒所有等待这个对象的线程。 -The waiting thread would call doWait(), and the notifying thread would call doNotify(). When a thread calls notify() on an object, one of the threads waiting on that object are awakened and allowed to execute. There is also a notifyAll() method that will wake all threads waiting on a given object. - -As you can see both the waiting and notifying thread calls wait() and notify() from within a synchronized block. This is mandatory! A thread cannot call wait(), notify() or notifyAll() without holding the lock on the object the method is called on. If it does, an IllegalMonitorStateException is thrown. +正如你所看到的,`wait()`和`notify()`的调用都在同步块中。这是强制性的要求。如果线程没有拥有对象的锁,则不能调用该对象的`wait()`,`notify()`和`notifyAll()`方法,否则将会抛出`IlleageMonitorStateException` 异常。 But, how is this possible? Wouldn't the waiting thread keep the lock on the monitor object (myMonitorObject) as long as it is executing inside a synchronized block? Will the waiting thread not block the notifying thread from ever entering the synchronized block in doNotify()? The answer is no. Once a thread calls wait() it releases the lock it holds on the monitor object. This allows other threads to call wait() or notify() too, since these methods must be called from inside a synchronized block. -Once a thread is awakened it cannot exit the wait() call until the thread calling notify() has left its synchronized block. In other words: The awakened thread must reobtain the lock on the monitor object before it can exit the wait() call, because the wait call is nested inside a synchronized block. If multiple threads are awakened using notifyAll() only one awakened thread at a time can exit the wait() method, since each thread must obtain the lock on the monitor object in turn before exiting wait(). +当一个等待的线程被唤醒之后并不会立即离开`wait()`方法直至调用`notify()`方法的线程退出代码块。换言之,因为`wait()`方法嵌套在同步代码块内部,所以被唤醒的线程需要重新获得模拟器对象的锁才能够离开`wait()`方法。如果有多个线程通过`notifyAll()`方法被唤醒,同一时间也只能有一个线程能够离开`wait()`方法并重新进入同步代码块,因为每一个线程都必须先获得模拟器对象的锁才能够离开`wait()`方法。 -##Missed Signals +##错过的信号(Missed Signals) The methods notify() and notifyAll() do not save the method calls to them in case no threads are waiting when they are called. The notify signal is then just lost. Therefore, if a thread calls notify() before the thread to signal has called wait(), the signal will be missed by the waiting thread. This may or may not be a problem, but in some cases this may result in the waiting thread waiting forever, never waking up, because the signal to wake up was missed. From 5383e30ddcd29444b6dd5858dc92f6a0ff937961 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 03:34:33 +0800 Subject: [PATCH 161/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index 11f2071..b63cb40 100644 --- "a/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -78,10 +78,12 @@ But, how is this possible? Wouldn't the waiting thread keep the lock on the moni 当一个等待的线程被唤醒之后并不会立即离开`wait()`方法直至调用`notify()`方法的线程退出代码块。换言之,因为`wait()`方法嵌套在同步代码块内部,所以被唤醒的线程需要重新获得模拟器对象的锁才能够离开`wait()`方法。如果有多个线程通过`notifyAll()`方法被唤醒,同一时间也只能有一个线程能够离开`wait()`方法并重新进入同步代码块,因为每一个线程都必须先获得模拟器对象的锁才能够离开`wait()`方法。 -##错过的信号(Missed Signals) +##信号丢失(Missed Signals) The methods notify() and notifyAll() do not save the method calls to them in case no threads are waiting when they are called. The notify signal is then just lost. Therefore, if a thread calls notify() before the thread to signal has called wait(), the signal will be missed by the waiting thread. This may or may not be a problem, but in some cases this may result in the waiting thread waiting forever, never waking up, because the signal to wake up was missed. +该方法的通知()和notifyAll()不救的方法调用它们的情况下没有线程在等待的时候,他们被称为。该通知信号然后就失去了。因此,如果一个线程调用notify()的线程之前,信号调用wait()时,信号将被等待的线程被错过。这可能会或可能不会成为问题,但在某些情况下,这可能会导致等待线程永远等待,从未苏醒,因为该信号被错过醒来。 + To avoid losing signals they should be stored inside the signal class. In the MyWaitNotify example the notify signal should be stored in a member variable inside the MyWaitNotify instance. Here is a modified version of MyWaitNotify that does this: ```Java From 2598da3e4feda5e3e892e07fe414dbba4e9db8a9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 04:26:12 +0800 Subject: [PATCH 162/524] Published with https://stackedit.io/ --- .../09.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" index b63cb40..126f4a0 100644 --- "a/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -115,7 +115,7 @@ public class MyWaitNotify2{ Notice how the doNotify() method now sets the wasSignalled variable to true before calling notify(). Also, notice how the doWait() method now checks the wasSignalled variable before calling wait(). In fact it only calls wait() if no signal was received in between the previous doWait() call and this. -##Spurious Wakeups +##假唤醒(Spurious Wakeups) For inexplicable reasons it is possible for threads to wake up even if notify() and notifyAll() has not been called. This is known as spurious wakeups. Wakeups without any reason. From 6f37e1cb710dda39291916da791bc331aa65aaf2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 15:33:49 +0800 Subject: [PATCH 163/524] Published with https://stackedit.io/ From 33c35c3324e5a3d7336cb4fd564c19a743c0b94d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 15:35:04 +0800 Subject: [PATCH 164/524] Published with https://stackedit.io/ From d73e88e920a3573ddd7a379c4f39acb6bf5805c7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 15:36:14 +0800 Subject: [PATCH 165/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index b28a67e..10543a1 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -5,10 +5,12 @@ A deadlock is when two or more threads are blocked waiting to obtain locks that For instance, if thread 1 locks A, and tries to lock B, and thread 2 has already locked B, and tries to lock A, a deadlock arises. Thread 1 can never get B, and thread 2 can never get A. In addition, neither of them will ever know. They will remain blocked on each their object, A and B, forever. This situation is a deadlock. The situation is illustrated below: + ``` Thread 1 locks A, waits for B Thread 2 locks B, waits for A ``` + Here is an example of a TreeNode class that call synchronized methods in different instances: ```Java From 59028173e3a9bf4db1fe5a4c1b7283e6458a48ca Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 15:36:20 +0800 Subject: [PATCH 166/524] Published with https://stackedit.io/ From b1571689af66ebd19d86a81ba76377e93a222d25 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 17:15:13 +0800 Subject: [PATCH 167/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index 10543a1..071f43c 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -1,21 +1,20 @@ #10.死锁 -A deadlock is when two or more threads are blocked waiting to obtain locks that some of the other threads in the deadlock are holding. Deadlock can occur when multiple threads need the same locks, at the same time, but obtain them in different order. +死锁是指两个或多个线程等待其他处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。 -For instance, if thread 1 locks A, and tries to lock B, and thread 2 has already locked B, and tries to lock A, a deadlock arises. Thread 1 can never get B, and thread 2 can never get A. In addition, neither of them will ever know. They will remain blocked on each their object, A and B, forever. This situation is a deadlock. +例如,如果线程1持有锁A,但试图去获取锁B,而此时线程1持有锁B,却试图去获取锁A,这时死锁就发生了。线程1永远得不到锁B,线程2也永远得不到线程A,并且它们永远也不知道发生了什么事。为了获得彼此所持有的锁,它们将永远阻塞下去。这种情况就是一个死锁。 -The situation is illustrated below: +这种情况描述如下: ``` Thread 1 locks A, waits for B Thread 2 locks B, waits for A ``` -Here is an example of a TreeNode class that call synchronized methods in different instances: +这里有一个TreeNode类的例子,它调用了不同实例的synchronized方法: ```Java public class TreeNode { - TreeNode parent = null; List children = new ArrayList(); @@ -43,7 +42,9 @@ public class TreeNode { } ``` -If a thread (1) calls the parent.addChild(child) method at the same time as another thread (2) calls the child.setParent(parent) method, on the same parent and child instances, a deadlock can occur. Here is some pseudo code that illustrates this: + 如果线程1调用`parent.addChild(child)`方法,而与此同时线程2调用`child.setParent(parent)`方法,两个线程中的parent和child都是同一个对象实例,此时死锁就发生了。 + +下面的伪代码说明了这个过程: ``` Thread 1: parent.addChild(child); //locks parent From 200f42e500f8da636f5a8b460864be007fb0f3a7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 17:25:51 +0800 Subject: [PATCH 168/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index 071f43c..47209cf 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -54,6 +54,10 @@ Thread 2: child.setParent(parent); //locks child --> parent.addChildOnly() ``` +首先线程1调用`parent.addChild(child)`方法,由于这个方法是同步的,所以线程1锁住了parent对象以防止其他线程访问。 + +然后线程2调用`child.setParent(parent)`方法,由于这个方法的同步的,所以线程2锁住了child对象以防止其他线程访问。 + First thread 1 calls parent.addChild(child). Since addChild() is synchronized thread 1 effectively locks the parent object for access from other treads. Then thread 2 calls child.setParent(parent). Since setParent() is synchronized thread 2 effectively locks the child object for acces from other threads. From b54c28260e234fd85577b4aad245aa7ca3224800 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 17:37:01 +0800 Subject: [PATCH 169/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index 47209cf..465d411 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -58,11 +58,7 @@ Thread 2: child.setParent(parent); //locks child 然后线程2调用`child.setParent(parent)`方法,由于这个方法的同步的,所以线程2锁住了child对象以防止其他线程访问。 -First thread 1 calls parent.addChild(child). Since addChild() is synchronized thread 1 effectively locks the parent object for access from other treads. - -Then thread 2 calls child.setParent(parent). Since setParent() is synchronized thread 2 effectively locks the child object for acces from other threads. - -Now both child and parent objects are locked by two different threads. Next thread 1 tries to call child.setParentOnly() method, but the child object is locked by thread 2, so the method call just blocks. Thread 2 also tries to call parent.addChildOnly() but the parent object is locked by thread 1, causing thread 2 to block on that method call. Now both threads are blocked waiting to obtain locks the other thread holds. +现在parent对象和child对象都分别被线程1和线程2锁住了。下一步,线程1试图调用`child.setParentOnly()`方法,但child方法已经被线程2锁住,所以这个方法会阻塞。线程2也试图调用`parent.addChildOnly()`方法,但parent对象此时已被线程1锁住,所以这个方法也会阻塞。现在两个线程都试图获取对方所持有的锁而进入阻塞状态。 Note: The two threads must call parent.addChild(child) and child.setParent(parent) at the same time as described above, and on the same two parent and child instances for a deadlock to occur. The code above may execute fine for a long time until all of a sudden it deadlocks. From 3b53bf6292c6b7373f2782d19304173ed9550313 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 18:10:55 +0800 Subject: [PATCH 170/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index 465d411..6b39892 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -60,10 +60,9 @@ Thread 2: child.setParent(parent); //locks child 现在parent对象和child对象都分别被线程1和线程2锁住了。下一步,线程1试图调用`child.setParentOnly()`方法,但child方法已经被线程2锁住,所以这个方法会阻塞。线程2也试图调用`parent.addChildOnly()`方法,但parent对象此时已被线程1锁住,所以这个方法也会阻塞。现在两个线程都试图获取对方所持有的锁而进入阻塞状态。 -Note: The two threads must call parent.addChild(child) and child.setParent(parent) at the same time as described above, and on the same two parent and child instances for a deadlock to occur. The code above may execute fine for a long time until all of a sudden it deadlocks. - -The threads really need to take the locks *at the same time*. For instance, if thread 1 is a bit ahead of thread2, and thus locks both A and B, then thread 2 will be blocked already when trying to lock B. Then no deadlock occurs. Since thread scheduling often is unpredictable there is no way to predict *when* a deadlock occurs. Only that it *can* occur. +注意:两个线程必须同时调用`parent.addChild(child)`和`child.setParent(parent)`方法,而且并需是在同一个parent和child对象上,死锁才有可能发生。上面的代码可能要运行一段时间才可能出现死锁。 +这两个线程必须要同时获得锁。举个例子,如果线程1稍微先与线程2获得A和B的锁,这时线程2在试图获取B的锁时就会阻塞,这时不会产生死锁。由于线程的调度不可预测,所以我们无法预测什么时候会产生死锁,仅仅是可能会发生。 ##More Complicated Deadlocks From 026c00a8533f55314a3f3b0e719d54b31226b4fd Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 18:13:10 +0800 Subject: [PATCH 171/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index 6b39892..d397274 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -64,7 +64,7 @@ Thread 2: child.setParent(parent); //locks child 这两个线程必须要同时获得锁。举个例子,如果线程1稍微先与线程2获得A和B的锁,这时线程2在试图获取B的锁时就会阻塞,这时不会产生死锁。由于线程的调度不可预测,所以我们无法预测什么时候会产生死锁,仅仅是可能会发生。 -##More Complicated Deadlocks +##更加复杂的死锁(More Complicated Deadlocks) Deadlock can also include more than two threads. This makes it harder to detect. Here is an example in which four threads have deadlocked: ``` From a28e2a99d1d90b94a1d6dc340ac972d7ce6cbad7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 18:15:59 +0800 Subject: [PATCH 172/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index d397274..f08d8b4 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -66,16 +66,19 @@ Thread 2: child.setParent(parent); //locks child ##更加复杂的死锁(More Complicated Deadlocks) -Deadlock can also include more than two threads. This makes it harder to detect. Here is an example in which four threads have deadlocked: +死锁的发生可能由多于两个线程造成,在这种情况下,很难对死锁进行检测。下面的例子演示了多个线程造成的死锁: + ``` Thread 1 locks A, waits for B Thread 2 locks B, waits for C Thread 3 locks C, waits for D Thread 4 locks D, waits for A ``` + +线程1等待线程2,线程2等待线程3,线程3等待线程4,而线程4等待线程1. Thread 1 waits for thread 2, thread 2 waits for thread 3, thread 3 waits for thread 4, and thread 4 waits for thread 1. -##Database Deadlocks +##数据库死锁(Database Deadlocks) A more complicated situation in which deadlocks can occur, is a database transaction. A database transaction may consist of many SQL update requests. When a record is updated during a transaction, that record is locked for updates from other transactions, until the first transaction completes. Each update request within the same transaction may therefore lock some records in the database. @@ -83,6 +86,8 @@ If multiple transactions are running at the same time that need to update the sa For example +举个例子: + ``` Transaction 1, request 1, locks record 1 for update Transaction 2, request 1, locks record 2 for update From 5fc2f91a00f1fa0178eb07e8cbe4de47290998b4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 18:48:30 +0800 Subject: [PATCH 173/524] Published with https://stackedit.io/ --- "Java-Concurrency/10.\346\255\273\351\224\201.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/10.\346\255\273\351\224\201.md" index f08d8b4..be1ac0a 100644 --- "a/Java-Concurrency/10.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/10.\346\255\273\351\224\201.md" @@ -80,11 +80,9 @@ Thread 1 waits for thread 2, thread 2 waits for thread 3, thread 3 waits for thr ##数据库死锁(Database Deadlocks) -A more complicated situation in which deadlocks can occur, is a database transaction. A database transaction may consist of many SQL update requests. When a record is updated during a transaction, that record is locked for updates from other transactions, until the first transaction completes. Each update request within the same transaction may therefore lock some records in the database. +更加复杂的死锁场景发生在数据库中。一个数据库事务通常包含多条SQL更新请求。当一条记录被事务更新时,这条记录就会被这个事务锁住,以防止其他事务更新,直到当前事务结束。同一个事务中的多个更新语句都有可能需要锁住一些记录。 -If multiple transactions are running at the same time that need to update the same records, there is a risk of them ending up in a deadlock. - -For example +当多个事务同时需要对一些相同的记录做更新操作时,就很有可能发生死锁,例如: 举个例子: @@ -95,4 +93,4 @@ Transaction 1, request 2, tries to lock record 2 for update. Transaction 2, request 2, tries to lock record 1 for update. ``` -Since the locks are taken in different requests, and not all locks needed for a given transaction are known ahead of time, it is hard to detect or prevent deadlocks in database transactions. \ No newline at end of file +因为锁发生在不同的请求中,并且对于一个事务来说不可能提前知道所有它需要的锁,因此很难检测和避免数据库事务中的死锁。 \ No newline at end of file From 34b3d3a0adff2b97b274b0f1d0f273391625b069 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 13 Sep 2014 18:54:18 +0800 Subject: [PATCH 174/524] Published with https://stackedit.io/ --- ...04\351\230\262\346\255\273\351\224\201.md" | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 "Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" diff --git "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" new file mode 100644 index 0000000..919878b --- /dev/null +++ "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" @@ -0,0 +1,92 @@ +#11.预防死锁 + +In some situations it is possible to prevent deadlocks. I'll describe three techniques in this text: + +Lock Ordering +Lock Timeout +Deadlock Detection + + +##Lock Ordering + +Deadlock occurs when multiple threads need the same locks but obtain them in different order. + +If you make sure that all locks are always taken in the same order by any thread, deadlocks cannot occur. Look at this example: + +``` +Thread 1: + + lock A + lock B + + +Thread 2: + + wait for A + lock C (when A locked) + + +Thread 3: + + wait for A + wait for B + wait for C +``` + +If a thread, like Thread 3, needs several locks, it must take them in the decided order. It cannot take a lock later in the sequence until it has obtained the earlier locks. + +For instance, neither Thread 2 or Thread 3 can lock C until they have locked A first. Since Thread 1 holds lock A, Thread 2 and 3 must first wait until lock A is unlocked. Then they must succeed in locking A, before they can attempt to lock B or C. + +Lock ordering is a simple yet effective deadlock prevention mechanism. However, it can only be used if you know about all locks needed ahead of taking any of the locks. This is not always the case. + +##Lock Timeout + +Another deadlock prevention mechanism is to put a timeout on lock attempts meaning a thread trying to obtain a lock will only try for so long before giving up. If a thread does not succeed in taking all necessary locks within the given timeout, it will backup, free all locks taken, wait for a random amount of time and then retry. The random amount of time waited serves to give other threads trying to take the same locks a chance to take all locks, and thus let the application continue running without locking. + +Here is an example of two threads trying to take the same two locks in different order, where the threads back up and retry: + +``` +Thread 1 locks A +Thread 2 locks B + +Thread 1 attempts to lock B but is blocked +Thread 2 attempts to lock A but is blocked + +Thread 1's lock attempt on B times out +Thread 1 backs up and releases A as well +Thread 1 waits randomly (e.g. 257 millis) before retrying. + +Thread 2's lock attempt on A times out +Thread 2 backs up and releases B as well +Thread 2 waits randomly (e.g. 43 millis) before retrying. +``` + +In the above example Thread 2 will retry taking the locks about 200 millis before Thread 1 and will therefore likely succeed at taking both locks. Thread 1 will then wait already trying to take lock A. When Thread 2 finishes, Thread 1 will be able to take both locks too (unless Thread 2 or another thread takes the locks in between). + +An issue to keep in mind is, that just because a lock times out it does not necessarily mean that the threads had deadlocked. It could also just mean that the thread holding the lock (causing the other thread to time out) takes a long time to complete its task. + +Additionally, if enough threads compete for the same resources they still risk trying to take the threads at the same time again and again, even if timing out and backing up. This may not occur with 2 threads each waiting between 0 and 500 millis before retrying, but with 10 or 20 threads the situation is different. Then the likeliness of two threads waiting the same time before retrying (or close enough to cause problems) is a lot higher. + +A problem with the lock timeout mechanism is that it is not possible to set a timeout for entering a synchronized block in Java. You will have to create a custom lock class or use one of the Java 5 concurrency constructs in the java.util.concurrency package. Writing custom locks isn't difficult but it is outside the scope of this text. Later texts in the Java concurrency trails will cover custom locks. + +#Deadlock Detection + +Deadlock detection is a heavier deadlock prevention mechanism aimed at cases in which lock ordering isn't possible, and lock timeout isn't feasible. + +Every time a thread takes a lock it is noted in a data structure (map, graph etc.) of threads and locks. Additionally, whenever a thread requests a lock this is also noted in this data structure. + +When a thread requests a lock but the request is denied, the thread can traverse the lock graph to check for deadlocks. For instance, if a Thread A requests lock 7, but lock 7 is held by Thread B, then Thread A can check if Thread B has requested any of the locks Thread A holds (if any). If Thread B has requested so, a deadlock has occurred (Thread A having taken lock 1, requesting lock 7, Thread B having taken lock 7, requesting lock 1). + +Of course a deadlock scenario may be a lot more complicated than two threads holding each others locks. Thread A may wait for Thread B, Thread B waits for Thread C, Thread C waits for Thread D, and Thread D waits for Thread A. In order for Thread A to detect a deadlock it must transitively examine all requested locks by Thread B. From Thread B's requested locks Thread A will get to Thread C, and then to Thread D, from which it finds one of the locks Thread A itself is holding. Then it knows a deadlock has occurred. + +Below is a graph of locks taken and requested by 4 threads (A, B, C and D). A data structure like this that can be used to detect deadlocks. + +Deadlock Detection Data Structure + +![enter image description here](http://tutorials.jenkov.com/images/java-concurrency/deadlock-detection-graph.png) + +So what do the threads do if a deadlock is detected? + +One possible action is to release all locks, backup, wait a random amount of time and then retry. This is similar to the simpler lock timeout mechanism except threads only backup when a deadlock has actually occurred. Not just because their lock requests timed out. However, if a lot of threads are competing for the same locks they may repeatedly end up in a deadlock even if they back up and wait. + +A better option is to determine or assign a priority of the threads so that only one (or a few) thread backs up. The rest of the threads continue taking the locks they need as if no deadlock had occurred. If the priority assigned to the threads is fixed, the same threads will always be given higher priority. To avoid this you may assign the priority randomly whenever a deadlock is detected. \ No newline at end of file From 16aa72aa720cd23e5c79d3859f0ae7dc3ac8dfb2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 00:01:29 +0800 Subject: [PATCH 175/524] Published with https://stackedit.io/ --- ...351\242\204\351\230\262\346\255\273\351\224\201.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" index 919878b..930a45c 100644 --- "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" @@ -1,13 +1,13 @@ #11.预防死锁 -In some situations it is possible to prevent deadlocks. I'll describe three techniques in this text: +在某些情况,死锁是可以预防的。下面介绍三种可以预防死锁的技术: -Lock Ordering -Lock Timeout -Deadlock Detection +* 加锁顺序 +* 加锁时限 +* 死锁检测 -##Lock Ordering +##加锁顺序(Lock Ordering) Deadlock occurs when multiple threads need the same locks but obtain them in different order. From eae525d13db23086cd14e4e09db99cbdd81e0ae9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 00:17:48 +0800 Subject: [PATCH 176/524] Published with https://stackedit.io/ --- ...351\242\204\351\230\262\346\255\273\351\224\201.md" | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" index 930a45c..42b8d75 100644 --- "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" @@ -9,23 +9,21 @@ ##加锁顺序(Lock Ordering) -Deadlock occurs when multiple threads need the same locks but obtain them in different order. +当多个线程需要相同的锁,但以不同的顺序获取锁时,这时死锁就很容易发生。 -If you make sure that all locks are always taken in the same order by any thread, deadlocks cannot occur. Look at this example: +如果所有的锁都是按照相同的顺序获取,那么死锁是不会出现的。看下下面的例子: ``` Thread 1: lock A lock B - - +--------------------- Thread 2: wait for A lock C (when A locked) - - +--------------------- Thread 3: wait for A From 08e261a6250b5c719aff80b701b3f3135d59e2aa Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 00:45:08 +0800 Subject: [PATCH 177/524] Published with https://stackedit.io/ --- ...51\242\204\351\230\262\346\255\273\351\224\201.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" index 42b8d75..bad470c 100644 --- "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" @@ -3,7 +3,7 @@ 在某些情况,死锁是可以预防的。下面介绍三种可以预防死锁的技术: * 加锁顺序 -* 加锁时限 +* 加锁超时 * 死锁检测 @@ -31,13 +31,14 @@ Thread 3: wait for C ``` -If a thread, like Thread 3, needs several locks, it must take them in the decided order. It cannot take a lock later in the sequence until it has obtained the earlier locks. +如果一个线程,例如线程3,需要一些锁,那么她必须按照一定的顺序获取锁。只有按照顺序获取前面的锁,才能够依次获取后面的锁。 -For instance, neither Thread 2 or Thread 3 can lock C until they have locked A first. Since Thread 1 holds lock A, Thread 2 and 3 must first wait until lock A is unlocked. Then they must succeed in locking A, before they can attempt to lock B or C. +例如,线程2和线程3,只有当它们获得锁A后才能够去尝试获取锁C。由于线程1持有锁A,线程2和线程3都会阻塞直至锁A被线程1释放。 -Lock ordering is a simple yet effective deadlock prevention mechanism. However, it can only be used if you know about all locks needed ahead of taking any of the locks. This is not always the case. +顺序加锁是一个非常有效的用于预防死锁的机制。然而,它只有预先知道所有的加锁顺序时才能很好的地工作,它并不适用于所有情况。(However, it can only be used if you know about all locks needed ahead of taking any of the locks. This is not always the case.) -##Lock Timeout + +##加锁超时(Lock Timeout) Another deadlock prevention mechanism is to put a timeout on lock attempts meaning a thread trying to obtain a lock will only try for so long before giving up. If a thread does not succeed in taking all necessary locks within the given timeout, it will backup, free all locks taken, wait for a random amount of time and then retry. The random amount of time waited serves to give other threads trying to take the same locks a chance to take all locks, and thus let the application continue running without locking. From 765a24993b3aa4777b44f2bedb269832c77104b5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 01:48:35 +0800 Subject: [PATCH 178/524] Published with https://stackedit.io/ --- ...04\351\230\262\346\255\273\351\224\201.md" | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" index bad470c..83b3dd0 100644 --- "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" @@ -40,9 +40,9 @@ Thread 3: ##加锁超时(Lock Timeout) -Another deadlock prevention mechanism is to put a timeout on lock attempts meaning a thread trying to obtain a lock will only try for so long before giving up. If a thread does not succeed in taking all necessary locks within the given timeout, it will backup, free all locks taken, wait for a random amount of time and then retry. The random amount of time waited serves to give other threads trying to take the same locks a chance to take all locks, and thus let the application continue running without locking. +另一种预防死锁的机制就是试图获取锁时设置超时。如果线程在规定时间内没有获得锁,则会放弃,并释放自身锁持有的锁,等待一个随机时间,然后重试。在随机等待时间内,给予其他线程获取相同的锁,从而避免死锁发生。 -Here is an example of two threads trying to take the same two locks in different order, where the threads back up and retry: +下面是两个线程尝试以不同的顺序获取两个锁,在超时回退后进行重试的例子: ``` Thread 1 locks A @@ -60,6 +60,14 @@ Thread 2 backs up and releases B as well Thread 2 waits randomly (e.g. 43 millis) before retrying. ``` +在上面的例子中,线程2比线程1早大约200ms进行重新加锁,因此很有可能可以取到全部的锁。线程1尝试获取锁A,由于2持有所有A,所以线程1进入等待状态。当线程2执行完释放所有的锁,线程1就可以持有所有的锁了。(除非有其他线程也在争夺锁A和锁B) + +有个问题需要注意的就是,如果出现了加锁超时,并不意味着出现了死锁。加锁超时可能是因为某个持有锁的线程需要大量的时间来执行任务。 + +另外,如果有大量的线程去争夺相同的资源,即使有加锁超时和重试机制,也有可能会导致线程不停地重试但却无法获取所需的锁。如果只有两个线程,且重试时间在0-500ms之间,也许死锁不会发生。但如果线程在10-20之间情况则有可能不同,因为这些线程中的超时重试时间很大概率生是相同或相近的。 + + + In the above example Thread 2 will retry taking the locks about 200 millis before Thread 1 and will therefore likely succeed at taking both locks. Thread 1 will then wait already trying to take lock A. When Thread 2 finishes, Thread 1 will be able to take both locks too (unless Thread 2 or another thread takes the locks in between). An issue to keep in mind is, that just because a lock times out it does not necessarily mean that the threads had deadlocked. It could also just mean that the thread holding the lock (causing the other thread to time out) takes a long time to complete its task. @@ -68,6 +76,14 @@ Additionally, if enough threads compete for the same resources they still risk t A problem with the lock timeout mechanism is that it is not possible to set a timeout for entering a synchronized block in Java. You will have to create a custom lock class or use one of the Java 5 concurrency constructs in the java.util.concurrency package. Writing custom locks isn't difficult but it is outside the scope of this text. Later texts in the Java concurrency trails will cover custom locks. +在上面的例子中,线程2将重试走约200毫锁螺纹1日之前,因此将有可能在服用这两种锁成功。线程1然后等待已经试图把锁A.当线程2结束后,线程1就可以采取两种锁过(除非线程2或另一个线程需要的锁之间)。 + +一个问题需要注意的,那只是因为锁超时并不一定意味着该线程已陷入僵局。它也可能只是意味着线程持有锁(导致其他线程超时)需要很长的时间来完成其任务。 + +此外,如果有足够的线程竞争相同的资源,他们仍然冒险试图采取同时线程连连,即使超时和备份。这可能不是与2个线程在重试之前0和500毫之间相互等待发生,但与10或20个线程的情况是不同的。然后两个线程的likeliness等待的同时重试之前(或非常接近造成的问题)是高了很多。 + +与锁超时机制的一个问题是,它是不是可以设置超时进入Java中的synchronized块。你必须创建一个自定义锁类,或使用在java.util.concurrency包在Java5并发构造之一。编写自定义锁并不难,但它 + #Deadlock Detection Deadlock detection is a heavier deadlock prevention mechanism aimed at cases in which lock ordering isn't possible, and lock timeout isn't feasible. From a2d232e198931b2037f5be210ea73a40e6f65093 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 02:09:34 +0800 Subject: [PATCH 179/524] Published with https://stackedit.io/ --- ...04\351\230\262\346\255\273\351\224\201.md" | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" index 83b3dd0..3f6bcf2 100644 --- "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" @@ -66,25 +66,9 @@ Thread 2 waits randomly (e.g. 43 millis) before retrying. 另外,如果有大量的线程去争夺相同的资源,即使有加锁超时和重试机制,也有可能会导致线程不停地重试但却无法获取所需的锁。如果只有两个线程,且重试时间在0-500ms之间,也许死锁不会发生。但如果线程在10-20之间情况则有可能不同,因为这些线程中的超时重试时间很大概率生是相同或相近的。 +加锁超时机制的一个缺点是:Java并不提供进入synchronized块的超时设置。你可以自定义锁或使用Java 5提供的在`java.util.concurrency`包中的工具类。自定义锁并不困难,但是超出了本文的内容。后面的教程会做详细讲解。 - -In the above example Thread 2 will retry taking the locks about 200 millis before Thread 1 and will therefore likely succeed at taking both locks. Thread 1 will then wait already trying to take lock A. When Thread 2 finishes, Thread 1 will be able to take both locks too (unless Thread 2 or another thread takes the locks in between). - -An issue to keep in mind is, that just because a lock times out it does not necessarily mean that the threads had deadlocked. It could also just mean that the thread holding the lock (causing the other thread to time out) takes a long time to complete its task. - -Additionally, if enough threads compete for the same resources they still risk trying to take the threads at the same time again and again, even if timing out and backing up. This may not occur with 2 threads each waiting between 0 and 500 millis before retrying, but with 10 or 20 threads the situation is different. Then the likeliness of two threads waiting the same time before retrying (or close enough to cause problems) is a lot higher. - -A problem with the lock timeout mechanism is that it is not possible to set a timeout for entering a synchronized block in Java. You will have to create a custom lock class or use one of the Java 5 concurrency constructs in the java.util.concurrency package. Writing custom locks isn't difficult but it is outside the scope of this text. Later texts in the Java concurrency trails will cover custom locks. - -在上面的例子中,线程2将重试走约200毫锁螺纹1日之前,因此将有可能在服用这两种锁成功。线程1然后等待已经试图把锁A.当线程2结束后,线程1就可以采取两种锁过(除非线程2或另一个线程需要的锁之间)。 - -一个问题需要注意的,那只是因为锁超时并不一定意味着该线程已陷入僵局。它也可能只是意味着线程持有锁(导致其他线程超时)需要很长的时间来完成其任务。 - -此外,如果有足够的线程竞争相同的资源,他们仍然冒险试图采取同时线程连连,即使超时和备份。这可能不是与2个线程在重试之前0和500毫之间相互等待发生,但与10或20个线程的情况是不同的。然后两个线程的likeliness等待的同时重试之前(或非常接近造成的问题)是高了很多。 - -与锁超时机制的一个问题是,它是不是可以设置超时进入Java中的synchronized块。你必须创建一个自定义锁类,或使用在java.util.concurrency包在Java5并发构造之一。编写自定义锁并不难,但它 - -#Deadlock Detection +##死锁检测(Deadlock Detection) Deadlock detection is a heavier deadlock prevention mechanism aimed at cases in which lock ordering isn't possible, and lock timeout isn't feasible. From 6fefd0682ba4b435687572cd968b5c8001a2c379 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 02:12:10 +0800 Subject: [PATCH 180/524] Published with https://stackedit.io/ --- ...77\345\222\214\345\205\254\345\271\263.md" | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 "Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" new file mode 100644 index 0000000..f0f7c53 --- /dev/null +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -0,0 +1,172 @@ +#饥饿和公平(Starvation and Fairness) + +If a thread is not granted CPU time because other threads grab it all, it is called "starvation". The thread is "starved to death" because other threads are allowed the CPU time instead of it. The solution to starvation is called "fairness" - that all threads are fairly granted a chance to execute. + +Causes of Starvation in Java + +The following three common causes can lead to starvation of threads in Java: + +Threads with high priority swallow all CPU time from threads with lower priority. + +Threads are blocked indefinately waiting to enter a synchronized block, because other threads are constantly allowed access before it. + +Threads waiting on an object (called wait() on it) remain waiting indefinitely because other threads are constantly awakened instead of it. +Threads with high priority swallow all CPU time from threads with lower priority + +You can set the thread priority of each thread individually. The higher the priority the more CPU time the thread is granted. You can set the priority of threads between 1 and 10. Exactly how this is interpreted depends on the operating system your application is running on. For most applications you are better off leaving the priority unchanged. + +Threads are blocked indefinitely waiting to enter a synchronized block + +Java's synchronized code blocks can be another cause of starvation. Java's synchronized code block makes no guarantee about the sequence in which threads waiting to enter the synchronized block are allowed to enter. This means that there is a theoretical risk that a thread remains blocked forever trying to enter the block, because other threads are constantly granted access before it. This problem is called "starvation", that a thread is "starved to death" by because other threads are allowed the CPU time instead of it. + +Threads waiting on an object (called wait() on it) remain waiting indefinitely + +The notify() method makes no guarantee about what thread is awakened if multiple thread have called wait() on the object notify() is called on. It could be any of the threads waiting. Therefore there is a risk that a thread waiting on a certain object is never awakened because other waiting threads are always awakened instead of it. + +Implementing Fairness in Java + +While it is not possible to implement 100% fairness in Java we can still implement our synchronization constructs to increase fairness between threads. + +First lets study a simple synchronized code block: + +public class Synchronizer{ + + public synchronized void doSynchronized(){ + //do a lot of work which takes a long time + } + +} +If more than one thread call the doSynchronized() method, some of them will be blocked until the first thread granted access has left the method. If more than one thread are blocked waiting for access there is no guarantee about which thread is granted access next. + +Using Locks Instead of Synchronized Blocks + +To increase the fairness of waiting threads first we will change the code block to be guarded by a lock rather than a synchronized block: + +public class Synchronizer{ + Lock lock = new Lock(); + + public void doSynchronized() throws InterruptedException{ + this.lock.lock(); + //critical section, do a lot of work which takes a long time + this.lock.unlock(); + } + +} +Notice how the doSynchronized() method is no longer declared synchronized. Instead the critical section is guarded by the lock.lock() and lock.unlock() calls. + +A simple implementation of the Lock class could look like this: + +public class Lock{ + private boolean isLocked = false; + private Thread lockingThread = null; + + public synchronized void lock() throws InterruptedException{ + while(isLocked){ + wait(); + } + isLocked = true; + lockingThread = Thread.currentThread(); + } + + public synchronized void unlock(){ + if(this.lockingThread != Thread.currentThread()){ + throw new IllegalMonitorStateException( + "Calling thread has not locked this lock"); + } + isLocked = false; + lockingThread = null; + notify(); + } +} +If you look at the Synchronizer class above and look into this Lock implementation you will notice that threads are now blocked trying to access the lock() method, if more than one thread calls lock() simultanously. Second, if the lock is locked, the threads are blocked in the wait() call inside the while(isLocked) loop in the lock() method. Remember that a thread calling wait() releases the synchronization lock on the Lock instance, so threads waiting to enter lock() can now do so. The result is that multiple threads can end up having called wait() inside lock(). + +If you look back at the doSynchronized() method you will notice that the comment between lock() and unlock() states, that the code in between these two calls take a "long" time to execute. Let us further assume that this code takes long time to execute compared to entering the lock() method and calling wait() because the lock is locked. This means that the majority of the time waited to be able to lock the lock and enter the critical section is spent waiting in the wait() call inside the lock() method, not being blocked trying to enter the lock() method. + +As stated earlier synchronized blocks makes no guarantees about what thread is being granted access if more than one thread is waiting to enter. Nor does wait() make any guarantees about what thread is awakened when notify() is called. So, the current version of the Lock class makes no different guarantees with respect to fairness than synchronized version of doSynchronized(). But we can change that. + +The current version of the Lock class calls its own wait() method. If instead each thread calls wait() on a separate object, so that only one thread has called wait() on each object, the Lock class can decide which of these objects to call notify() on, thereby effectively selecting exactly what thread to awaken. + +A Fair Lock + +Below is shown the previous Lock class turned into a fair lock called FairLock. You will notice that the implementation has changed a bit with respect to synchronization and wait() / notify() compared to the Lock class shown earlier. + +Exactly how I arrived at this design beginning from the previous Lock class is a longer story involving several incremental design steps, each fixing the problem of the previous step: Nested Monitor Lockout, Slipped Conditions, and Missed Signals. That discussion is left out of this text to keep the text short, but each of the steps are discussed in the appropriate texts on the topic ( see the links above). What is important is, that every thread calling lock() is now queued, and only the first thread in the queue is allowed to lock the FairLock instance, if it is unlocked. All other threads are parked waiting until they reach the top of the queue. + +public class FairLock { + private boolean isLocked = false; + private Thread lockingThread = null; + private List waitingThreads = + new ArrayList(); + + public void lock() throws InterruptedException{ + QueueObject queueObject = new QueueObject(); + boolean isLockedForThisThread = true; + synchronized(this){ + waitingThreads.add(queueObject); + } + + while(isLockedForThisThread){ + synchronized(this){ + isLockedForThisThread = + isLocked || waitingThreads.get(0) != queueObject; + if(!isLockedForThisThread){ + isLocked = true; + waitingThreads.remove(queueObject); + lockingThread = Thread.currentThread(); + return; + } + } + try{ + queueObject.doWait(); + }catch(InterruptedException e){ + synchronized(this) { waitingThreads.remove(queueObject); } + throw e; + } + } + } + + public synchronized void unlock(){ + if(this.lockingThread != Thread.currentThread()){ + throw new IllegalMonitorStateException( + "Calling thread has not locked this lock"); + } + isLocked = false; + lockingThread = null; + if(waitingThreads.size() > 0){ + waitingThreads.get(0).doNotify(); + } + } +} +public class QueueObject { + + private boolean isNotified = false; + + public synchronized void doWait() throws InterruptedException { + while(!isNotified){ + this.wait(); + } + this.isNotified = false; + } + + public synchronized void doNotify() { + this.isNotified = true; + this.notify(); + } + + public boolean equals(Object o) { + return this == o; + } +} +First you might notice that the lock() method is no longer declared synchronized. Instead only the blocks necessary to synchronize are nested inside synchronized blocks. + +FairLock creates a new instance of QueueObject and enqueue it for each thread calling lock(). The thread calling unlock() will take the top QueueObject in the queue and call doNotify() on it, to awaken the thread waiting on that object. This way only one waiting thread is awakened at a time, rather than all waiting threads. This part is what governs the fairness of the FairLock. + +Notice how the state of the lock is still tested and set within the same synchronized block to avoid slipped conditions. + +Also notice that the QueueObject is really a semaphore. The doWait() and doNotify() methods store the signal internally in the QueueObject. This is done to avoid missed signals caused by a thread being preempted just before calling queueObject.doWait(), by another thread which calls unlock() and thereby queueObject.doNotify(). The queueObject.doWait() call is placed outside the synchronized(this) block to avoid nested monitor lockout, so another thread can actually call unlock() when no thread is executing inside the synchronized(this) block in lock() method. + +Finally, notice how the queueObject.doWait() is called inside a try - catch block. In case an InterruptedException is thrown the thread leaves the lock() method, and we need to dequeue it. + +A Note on Performance + +If you compare the Lock and FairLock classes you will notice that there is somewhat more going on inside the lock() and unlock() in the FairLock class. This extra code will cause the FairLock to be a sligtly slower synchronization mechanism than Lock. How much impact this will have on your application depends on how long time the code in the critical section guarded by the FairLock takes to execute. The longer this takes to execute, the less significant the added overhead of the synchronizer is. It does of course also depend on how often this code is called. \ No newline at end of file From 0b858ba5549a88cdb7e5c7ecc25008ceb55cc40a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 02:15:53 +0800 Subject: [PATCH 181/524] Published with https://stackedit.io/ --- ...41\347\250\213\351\224\201\346\255\273.md" | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 "Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" new file mode 100644 index 0000000..872a216 --- /dev/null +++ "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -0,0 +1,131 @@ +#13.嵌套管程锁死(Nested Monitor Lockout) + +How Nested Monitor Lockout Occurs + +Nested monitor lockout is a problem similar to deadlock. A nested monitor lockout occurs like this: + +Thread 1 synchronizes on A +Thread 1 synchronizes on B (while synchronized on A) +Thread 1 decides to wait for a signal from another thread before continuing +Thread 1 calls B.wait() thereby releasing the lock on B, but not A. + +Thread 2 needs to lock both A and B (in that sequence) + to send Thread 1 the signal. +Thread 2 cannot lock A, since Thread 1 still holds the lock on A. +Thread 2 remain blocked indefinately waiting for Thread1 + to release the lock on A + +Thread 1 remain blocked indefinately waiting for the signal from + Thread 2, thereby + never releasing the lock on A, that must be released to make + it possible for Thread 2 to send the signal to Thread 1, etc. +This may sound like a pretty theoretical situation, but look at the naive Lock implemenation below: + +//lock implementation with nested monitor lockout problem + +public class Lock{ + protected MonitorObject monitorObject = new MonitorObject(); + protected boolean isLocked = false; + + public void lock() throws InterruptedException{ + synchronized(this){ + while(isLocked){ + synchronized(this.monitorObject){ + this.monitorObject.wait(); + } + } + isLocked = true; + } + } + + public void unlock(){ + synchronized(this){ + this.isLocked = false; + synchronized(this.monitorObject){ + this.monitorObject.notify(); + } + } + } +} +Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. + +The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". + +When the thread that locked the Lock in the first place tries to unlock it by calling unlock() it will be blocked trying to enter the synchronized(this) block in the unlock() method. It will remain blocked until the thread waiting in lock() leaves the synchronized(this) block. But the thread waiting in the lock() method will not leave that block until the isLocked is set to false, and a monitorObject.notify() is executed, as it happens in unlock(). + +Put shortly, the thread waiting in lock() needs an unlock() call to execute successfully for it to exit lock() and the synchronized blocks inside it. But, no thread can actually execute unlock() until the thread waiting in lock() leaves the outer synchronized block. + +This result is that any thread calling either lock() or unlock() will become blocked indefinately. This is called a nested monitor lockout. + +A More Realistic Example + +You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. But there are situations in which designs like the one above may arise. For instance, if you were to implement fairness in a Lock. When doing so you want each thread to call wait() on each their own queue object, so that you can notify the threads one at a time. + +Look at this naive implementation of a fair lock: + +//Fair Lock implementation with nested monitor lockout problem + +public class FairLock { + private boolean isLocked = false; + private Thread lockingThread = null; + private List waitingThreads = + new ArrayList(); + + public void lock() throws InterruptedException{ + QueueObject queueObject = new QueueObject(); + + synchronized(this){ + waitingThreads.add(queueObject); + + while(isLocked || waitingThreads.get(0) != queueObject){ + + synchronized(queueObject){ + try{ + queueObject.wait(); + }catch(InterruptedException e){ + waitingThreads.remove(queueObject); + throw e; + } + } + } + waitingThreads.remove(queueObject); + isLocked = true; + lockingThread = Thread.currentThread(); + } + } + + public synchronized void unlock(){ + if(this.lockingThread != Thread.currentThread()){ + throw new IllegalMonitorStateException( + "Calling thread has not locked this lock"); + } + isLocked = false; + lockingThread = null; + if(waitingThreads.size() > 0){ + QueueObject queueObject = waitingThread.get(0); + synchronized(queueObject){ + queueObject.notify(); + } + } + } +} +public class QueueObject {} +At first glance this implementation may look fine, but notice how the lock() method calls queueObject.wait(); from inside two synchronized blocks. One synchronized on "this", and nested inside that, a block synchronized on the queueObject local variable. When a thread calls queueObject.wait()it releases the lock on the QueueObject instance, but not the lock associated with "this". + +Notice too, that the unlock() method is declared synchronized which equals a synchronized(this) block. This means, that if a thread is waiting inside lock() the monitor object associated with "this" will be locked by the waiting thread. All threads calling unlock() will remain blocked indefinately, waiting for the waiting thread to release the lock on "this". But this will never happen, since this only happens if a thread succeeds in sending a signal to the waiting thread, and this can only be sent by executing the unlock() method. + +And so, the FairLock implementation from above could lead to nested monitor lockout. A better implementation of a fair lock is described in the text Starvation and Fairness. + +Nested Monitor Lockout vs. Deadlock + +The result of nested monitor lockout and deadlock are pretty much the same: The threads involved end up blocked forever waiting for each other. + +The two situations are not equal though. As explained in the text on Deadlock a deadlock occurs when two threads obtain locks in different order. Thread 1 locks A, waits for B. Thread 2 has locked B, and now waits for A. As explained in the text on Deadlock Prevention deadlocks can be avoided by always locking the locks in the same order (Lock Ordering). However, a nested monitor lockout occurs exactly by two threads taking the locks in the same order. Thread 1 locks A and B, then releases B and waits for a signal from Thread 2. Thread 2 needs both A and B to send Thread 1 the signal. So, one thread is waiting for a signal, and another for a lock to be released. + +The difference is summed up here: + +In deadlock, two threads are waiting for each other to release locks. + +In nested monitor lockout, Thread 1 is holding a lock A, and waits +for a signal from Thread 2. Thread 2 needs the lock A to send the +signal to Thread 1. From e4a6ee2efad145bf0da2f28828b33e4f2db4a013 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 02:18:40 +0800 Subject: [PATCH 182/524] Published with https://stackedit.io/ --- Java-Concurrency/14.Slipped Conditions.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Java-Concurrency/14.Slipped Conditions.md diff --git a/Java-Concurrency/14.Slipped Conditions.md b/Java-Concurrency/14.Slipped Conditions.md new file mode 100644 index 0000000..6746204 --- /dev/null +++ b/Java-Concurrency/14.Slipped Conditions.md @@ -0,0 +1,4 @@ +#14.Slipped Conditions + + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From 4d8b21bbee9db496df56767ddd4428bc9c18c734 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 02:18:59 +0800 Subject: [PATCH 183/524] Published with https://stackedit.io/ --- Java-Concurrency/14.Slipped Conditions.md | 227 +++++++++++++++++++++- 1 file changed, 226 insertions(+), 1 deletion(-) diff --git a/Java-Concurrency/14.Slipped Conditions.md b/Java-Concurrency/14.Slipped Conditions.md index 6746204..4af0ffb 100644 --- a/Java-Concurrency/14.Slipped Conditions.md +++ b/Java-Concurrency/14.Slipped Conditions.md @@ -1,4 +1,229 @@ #14.Slipped Conditions +What is Slipped Conditions? -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file +Slipped conditions means, that from the time a thread has checked a certain condition until it acts upon it, the condition has been changed by another thread so that it is errornous for the first thread to act. Here is a simple example: + +public class Lock { + + private boolean isLocked = true; + + public void lock(){ + synchronized(this){ + while(isLocked){ + try{ + this.wait(); + } catch(InterruptedException e){ + //do nothing, keep waiting + } + } + } + + synchronized(this){ + isLocked = true; + } + } + + public synchronized void unlock(){ + isLocked = false; + this.notify(); + } + +} +Notice how the lock() method contains two synchronized blocks. The first block waits until isLocked is false. The second block sets isLocked to true, to lock the Lock instance for other threads. + +Imagine that isLocked is false, and two threads call lock() at the same time. If the first thread entering the first synchronized block is preempted right after the first synchronized block, this thread will have checked isLocked and noted it to be false. If the second thread is now allowed to execute, and thus enter the first synchronized block, this thread too will see isLocked as false. Now both threads have read the condition as false. Then both threads will enter the second synchronized block, set isLocked to true, and continue. + +This situation is an example of slipped conditions. Both threads test the condition, then exit the synchronized block, thereby allowing other threads to test the condition, before any of the two first threads change the conditions for subsequent threads. In other words, the condition has slipped from the time the condition was checked until the threads change it for subsequent threads. + +To avoid slipped conditions the testing and setting of the conditions must be done atomically by the thread doing it, meaning that no other thread can check the condition in between the testing and setting of the condition by the first thread. + +The solution in the example above is simple. Just move the line isLocked = true; up into the first synchronized block, right after the while loop. Here is how it looks: + +public class Lock { + + private boolean isLocked = true; + + public void lock(){ + synchronized(this){ + while(isLocked){ + try{ + this.wait(); + } catch(InterruptedException e){ + //do nothing, keep waiting + } + } + isLocked = true; + } + } + + public synchronized void unlock(){ + isLocked = false; + this.notify(); + } + +} +Now the testing and setting of the isLocked condition is done atomically from inside the same synchronized block. + +A More Realistic Example + +You may rightfully argue that you would never implement a Lock like the first implementation shown in this text, and thus claim slipped conditions to be a rather theoretical problem. But the first example was kept rather simple to better convey the notion of slipped conditions. + +A more realistic example would be during the implementation of a fair lock, as discussed in the text on Starvation and Fairness. If we look at the naive implementation from the text Nested Monitor Lockout, and try to remove the nested monitor lock problem it, it is easy to arrive at an implementation that suffers from slipped conditions. First I'll show the example from the nested monitor lockout text: + +//Fair Lock implementation with nested monitor lockout problem + +public class FairLock { + private boolean isLocked = false; + private Thread lockingThread = null; + private List waitingThreads = + new ArrayList(); + + public void lock() throws InterruptedException{ + QueueObject queueObject = new QueueObject(); + + synchronized(this){ + waitingThreads.add(queueObject); + + while(isLocked || waitingThreads.get(0) != queueObject){ + + synchronized(queueObject){ + try{ + queueObject.wait(); + }catch(InterruptedException e){ + waitingThreads.remove(queueObject); + throw e; + } + } + } + waitingThreads.remove(queueObject); + isLocked = true; + lockingThread = Thread.currentThread(); + } + } + + public synchronized void unlock(){ + if(this.lockingThread != Thread.currentThread()){ + throw new IllegalMonitorStateException( + "Calling thread has not locked this lock"); + } + isLocked = false; + lockingThread = null; + if(waitingThreads.size() > 0){ + QueueObject queueObject = waitingThread.get(0); + synchronized(queueObject){ + queueObject.notify(); + } + } + } +} +public class QueueObject {} +Notice how the synchronized(queueObject) with its queueObject.wait() call is nested inside the synchronized(this) block, resulting in the nested monitor lockout problem. To avoid this problem the synchronized(queueObject) block must be moved outside the synchronized(this) block. Here is how that could look: + +//Fair Lock implementation with slipped conditions problem + +public class FairLock { + private boolean isLocked = false; + private Thread lockingThread = null; + private List waitingThreads = + new ArrayList(); + + public void lock() throws InterruptedException{ + QueueObject queueObject = new QueueObject(); + + synchronized(this){ + waitingThreads.add(queueObject); + } + + boolean mustWait = true; + while(mustWait){ + + synchronized(this){ + mustWait = isLocked || waitingThreads.get(0) != queueObject; + } + + synchronized(queueObject){ + if(mustWait){ + try{ + queueObject.wait(); + }catch(InterruptedException e){ + waitingThreads.remove(queueObject); + throw e; + } + } + } + } + + synchronized(this){ + waitingThreads.remove(queueObject); + isLocked = true; + lockingThread = Thread.currentThread(); + } + } +} +Note: Only the lock() method is shown, since it is the only method I have changed. + +Notice how the lock() method now contains 3 synchronized blocks. + +The first synchronized(this) block checks the condition by setting mustWait = isLocked || waitingThreads.get(0) != queueObject. + +The second synchronized(queueObject) block checks if the thread is to wait or not. Already at this time another thread may have unlocked the lock, but lets forget that for the time being. Let's assume that the lock was unlocked, so the thread exits the synchronized(queueObject) block right away. + +The third synchronized(this) block is only executed if mustWait = false. This sets the condition isLocked back to true etc. and leaves the lock() method. + +Imagine what will happen if two threads call lock() at the same time when the lock is unlocked. First thread 1 will check the isLocked conditition and see it false. Then thread 2 will do the same thing. Then neither of them will wait, and both will set the state isLocked to true. This is a prime example of slipped conditions. + +Removing the Slipped Conditions Problem + +To remove the slipped conditions problem from the example above, the content of the last synchronized(this) block must be moved up into the first block. The code will naturally have to be changed a little bit too, to adapt to this move. Here is how it looks: + +//Fair Lock implementation without nested monitor lockout problem, +//but with missed signals problem. + +public class FairLock { + private boolean isLocked = false; + private Thread lockingThread = null; + private List waitingThreads = + new ArrayList(); + + public void lock() throws InterruptedException{ + QueueObject queueObject = new QueueObject(); + + synchronized(this){ + waitingThreads.add(queueObject); + } + + boolean mustWait = true; + while(mustWait){ + + + synchronized(this){ + mustWait = isLocked || waitingThreads.get(0) != queueObject; + if(!mustWait){ + waitingThreads.remove(queueObject); + isLocked = true; + lockingThread = Thread.currentThread(); + return; + } + } + + synchronized(queueObject){ + if(mustWait){ + try{ + queueObject.wait(); + }catch(InterruptedException e){ + waitingThreads.remove(queueObject); + throw e; + } + } + } + } + } +} +Notice how the local variable mustWait is tested and set within the same synchronized code block now. Also notice, that even if the mustWait local variable is also checked outside the synchronized(this) code block, in the while(mustWait) clause, the value of the mustWait variable is never changed outside the synchronized(this). A thread that evaluates mustWait to false will atomically also set the internal conditions (isLocked) so that any other thread checking the condition will evaluate it to true. + +The return; statement in the synchronized(this) block is not necessary. It is just a small optimization. If the thread must not wait (mustWait == false), then there is no reason to enter the synchronized(queueObject) block and execute the if(mustWait) clause. + +The observant reader will notice that the above implementation of a fair lock still suffers from a missed signal problem. Imagine that the FairLock instance is locked when a thread calls lock(). After the first synchronized(this) block mustWait is true. Then imagine that the thread calling lock() is preempted, and the thread that locked the lock calls unlock(). If you look at the unlock() implementation shown earlier, you will notice that it calls queueObject.notify(). But, since the thread waiting in lock() has not yet called queueObject.wait(), the call to queueObject.notify() passes into oblivion. The signal is missed. When the thread calling lock() right after calls queueObject.wait() it will remain blocked until some other thread calls unlock(), which may never happen. + +The missed signals problems is the reason that the FairLock implementation shown in the text Starvation and Fairness has turned the QueueObject class into a semaphore with two methods: doWait() and doNotify(). These methods store and react the signal internally in the QueueObject. That way the signal is not missed, even if doNotify() is called before doWait(). \ No newline at end of file From 15382b043b2d9b5243f22c140c14ad12b62d0949 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 02:20:22 +0800 Subject: [PATCH 184/524] Published with https://stackedit.io/ --- ...va\344\270\255\347\232\204\351\224\201.md" | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 "Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" diff --git "a/Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" new file mode 100644 index 0000000..0cbb74a --- /dev/null +++ "b/Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" @@ -0,0 +1,169 @@ +#Java中的锁 + +A lock is a thread synchronization mechanism like synchronized blocks except locks can be more sophisticated than Java's synchronized blocks. Locks (and other more advanced synchronization mechanisms) are created using synchronized blocks, so it is not like we can get totally rid of the synchronized keyword. + +From Java 5 the package java.util.concurrent.locks contains several lock implementations, so you may not have to implement your own locks. But you will still need to know how to use them, and it can still be useful to know the theory behind their implementation. For more details, see my tutorial on the java.util.concurrent.locks.Lock interface. + +A Simple Lock + +Let's start out by looking at a synchronized block of Java code: + +public class Counter{ + + private int count = 0; + + public int inc(){ + synchronized(this){ + return ++count; + } + } +} +Notice the synchronized(this) block in the inc() method. This block makes sure that only one thread can execute the return ++count at a time. The code in the synchronized block could have been more advanced, but the simple ++count suffices to get the point across. + +The Counter class could have been written like this instead, using a Lock instead of a synchronized block: + +public class Counter{ + + private Lock lock = new Lock(); + private int count = 0; + + public int inc(){ + lock.lock(); + int newCount = ++count; + lock.unlock(); + return newCount; + } +} +The lock() method locks the Lock instance so that all threads calling lock() are blocked until unlock() is executed. + +Here is a simple Lock implementation: + +public class Lock{ + + private boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + wait(); + } + isLocked = true; + } + + public synchronized void unlock(){ + isLocked = false; + notify(); + } +} +Notice the while(isLocked) loop, which is also called a "spin lock". Spin locks and the methods wait() and notify() are covered in more detail in the text Thread Signaling. While isLocked is true, the thread calling lock() is parked waiting in the wait() call. In case the thread should return unexpectedly from the wait() call without having received a notify() call (AKA a Spurious Wakeup) the thread re-checks the isLocked condition to see if it is safe to proceed or not, rather than just assume that being awakened means it is safe to proceed. If isLocked is false, the thread exits the while(isLocked) loop, and sets isLocked back to true, to lock the Lock instance for other threads calling lock(). + +When the thread is done with the code in the critical section (the code between lock() and unlock()), the thread calls unlock(). Executing unlock() sets isLocked back to false, and notifies (awakens) one of the threads waiting in the wait() call in the lock() method, if any. + +Lock Reentrance + +Synchronized blocks in Java are reentrant. This means, that if a Java thread enters a synchronized block of code, and thereby take the lock on the monitor object the block is synchronized on, the thread can enter other Java code blocks synchronized on the same monitor object. Here is an example: + +public class Reentrant{ + + public synchronized outer(){ + inner(); + } + + public synchronized inner(){ + //do something + } +} +Notice how both outer() and inner() are declared synchronized, which in Java is equivalent to a synchronized(this) block. If a thread calls outer() there is no problem calling inner() from inside outer(), since both methods (or blocks) are synchronized on the same monitor object ("this"). If a thread already holds the lock on a monitor object, it has access to all blocks synchronized on the same monitor object. This is called reentrance. The thread can reenter any block of code for which it already holds the lock. + +The lock implementation shown earlier is not reentrant. If we rewrite the Reentrant class like below, the thread calling outer() will be blocked inside the lock.lock() in the inner() method. + +public class Reentrant2{ + + Lock lock = new Lock(); + + public outer(){ + lock.lock(); + inner(); + lock.unlock(); + } + + public synchronized inner(){ + lock.lock(); + //do something + lock.unlock(); + } +} +A thread calling outer() will first lock the Lock instance. Then it will call inner(). Inside the inner() method the thread will again try to lock the Lock instance. This will fail (meaning the thread will be blocked), since the Lock instance was locked already in the outer() method. + +The reason the thread will be blocked the second time it calls lock() without having called unlock() in between, is apparent when we look at the lock() implementation: + +public class Lock{ + + boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + wait(); + } + isLocked = true; + } + + ... +} +It is the condition inside the while loop (spin lock) that determines if a thread is allowed to exit the lock() method or not. Currently the condition is that isLocked must be false for this to be allowed, regardless of what thread locked it. + +To make the Lock class reentrant we need to make a small change: + +public class Lock{ + + boolean isLocked = false; + Thread lockedBy = null; + int lockedCount = 0; + + public synchronized void lock() + throws InterruptedException{ + Thread callingThread = Thread.currentThread(); + while(isLocked && lockedBy != callingThread){ + wait(); + } + isLocked = true; + lockedCount++; + lockedBy = callingThread; + } + + + public synchronized void unlock(){ + if(Thread.curentThread() == this.lockedBy){ + lockedCount--; + + if(lockedCount == 0){ + isLocked = false; + notify(); + } + } + } + + ... +} +Notice how the while loop (spin lock) now also takes the thread that locked the Lock instance into consideration. If either the lock is unlocked (isLocked = false) or the calling thread is the thread that locked the Lock instance, the while loop will not execute, and the thread calling lock() will be allowed to exit the method. + +Additionally, we need to count the number of times the lock has been locked by the same thread. Otherwise, a single call to unlock() will unlock the lock, even if the lock has been locked multiple times. We don't want the lock to be unloced until the thread that locked it, has executed the same amount of unlock() calls as lock() calls. + +The Lock class is now reentrant. + +Lock Fairness + +Java's synchronized blocks makes no guarantees about the sequence in which threads trying to enter them are granted access. Therefore, if many threads are constantly competing for access to the same synchronized block, there is a risk that one or more of the threads are never granted access - that access is always granted to other threads. This is called starvation. To avoid this a Lock should be fair. Since the Lock implementations shown in this text uses synchronized blocks internally, they do not guarantee fairness. Starvation and fairness are discussed in more detail in the text Starvation and Fairness. + +Calling unlock() From a finally-clause + +When guarding a critical section with a Lock, and the critical section may throw exceptions, it is important to call the unlock() method from inside a finally-clause. Doing so makes sure that the Lock is unlocked so other threads can lock it. Here is an example: + +lock.lock(); +try{ + //do critical section code, which may throw exception +} finally { + lock.unlock(); +} +This little construct makes sure that the Lock is unlocked in case an exception is thrown from the code in the critical section. If unlock() was not called from inside a finally-clause, and an exception was thrown from the critical section, the Lock would remain locked forever, causing all threads calling lock() on that Lock instance to halt indefinately. \ No newline at end of file From fc3e7ceeac6eebe62b0de969e6f7c0c78ba939e7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 11:20:59 +0800 Subject: [PATCH 185/524] Published with https://stackedit.io/ --- ...51\245\277\345\222\214\345\205\254\345\271\263.md" | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index f0f7c53..140e4e4 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -1,6 +1,9 @@ #饥饿和公平(Starvation and Fairness) -If a thread is not granted CPU time because other threads grab it all, it is called "starvation". The thread is "starved to death" because other threads are allowed the CPU time instead of it. The solution to starvation is called "fairness" - that all threads are fairly granted a chance to execute. +如果一个线程由于CPU时间全部被其他线程抢占而得不到CPU时间,这就称为**饥饿(Starvation)**。这个线程因为得不到CPU机会而“饿死(starved to death)"。解决饥饿的方案称为**公平(Fairness)**--所有的线程都能公平地获得CPU时间。 + +##Java中产生饥饿的原因 + Causes of Starvation in Java @@ -23,7 +26,7 @@ Threads waiting on an object (called wait() on it) remain waiting indefinitely The notify() method makes no guarantee about what thread is awakened if multiple thread have called wait() on the object notify() is called on. It could be any of the threads waiting. Therefore there is a risk that a thread waiting on a certain object is never awakened because other waiting threads are always awakened instead of it. -Implementing Fairness in Java +##Implementing Fairness in Java While it is not possible to implement 100% fairness in Java we can still implement our synchronization constructs to increase fairness between threads. @@ -86,7 +89,7 @@ As stated earlier synchronized blocks makes no guarantees about what thread is b The current version of the Lock class calls its own wait() method. If instead each thread calls wait() on a separate object, so that only one thread has called wait() on each object, the Lock class can decide which of these objects to call notify() on, thereby effectively selecting exactly what thread to awaken. -A Fair Lock +##A Fair Lock Below is shown the previous Lock class turned into a fair lock called FairLock. You will notice that the implementation has changed a bit with respect to synchronization and wait() / notify() compared to the Lock class shown earlier. @@ -167,6 +170,6 @@ Also notice that the QueueObject is really a semaphore. The doWait() and doNotif Finally, notice how the queueObject.doWait() is called inside a try - catch block. In case an InterruptedException is thrown the thread leaves the lock() method, and we need to dequeue it. -A Note on Performance +##A Note on Performance If you compare the Lock and FairLock classes you will notice that there is somewhat more going on inside the lock() and unlock() in the FairLock class. This extra code will cause the FairLock to be a sligtly slower synchronization mechanism than Lock. How much impact this will have on your application depends on how long time the code in the critical section guarded by the FairLock takes to execute. The longer this takes to execute, the less significant the added overhead of the synchronizer is. It does of course also depend on how often this code is called. \ No newline at end of file From 7e7e2c9784c95ebf396409607ca02b69e8c74e65 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 11:43:29 +0800 Subject: [PATCH 186/524] Published with https://stackedit.io/ --- ...77\345\222\214\345\205\254\345\271\263.md" | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index 140e4e4..f29127b 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -4,25 +4,21 @@ ##Java中产生饥饿的原因 +在Java中,下面三种常见原因会导致饥饿: -Causes of Starvation in Java +* 高优先级的线程抢占了所有的CPU时间。 +* 线程陷入无止境地等待进入同步块状态,因为其他线程总是能够在它之前获得进入同步块的机会。 +* 线程陷入无止境地等待被唤醒(调用了对象的wait()方法)状态,因为其他线程总能够持续获得唤醒机会而不是这个线程。 -The following three common causes can lead to starvation of threads in Java: +###高优先级线程抢占了所有的CPU时间 -Threads with high priority swallow all CPU time from threads with lower priority. +你可以为每个线程设置优先级。高优先级的线程能够获得更多的CPU时间。优先级可以设置为1-10之间。这些优先级值的解释根据操作系统的差异而有所不同。对于大部分应用程式来说,你最好不要改变其优先级值。 -Threads are blocked indefinately waiting to enter a synchronized block, because other threads are constantly allowed access before it. - -Threads waiting on an object (called wait() on it) remain waiting indefinitely because other threads are constantly awakened instead of it. -Threads with high priority swallow all CPU time from threads with lower priority - -You can set the thread priority of each thread individually. The higher the priority the more CPU time the thread is granted. You can set the priority of threads between 1 and 10. Exactly how this is interpreted depends on the operating system your application is running on. For most applications you are better off leaving the priority unchanged. - -Threads are blocked indefinitely waiting to enter a synchronized block +###Threads are blocked indefinitely waiting to enter a synchronized block Java's synchronized code blocks can be another cause of starvation. Java's synchronized code block makes no guarantee about the sequence in which threads waiting to enter the synchronized block are allowed to enter. This means that there is a theoretical risk that a thread remains blocked forever trying to enter the block, because other threads are constantly granted access before it. This problem is called "starvation", that a thread is "starved to death" by because other threads are allowed the CPU time instead of it. -Threads waiting on an object (called wait() on it) remain waiting indefinitely +###Threads waiting on an object (called wait() on it) remain waiting indefinitely The notify() method makes no guarantee about what thread is awakened if multiple thread have called wait() on the object notify() is called on. It could be any of the threads waiting. Therefore there is a risk that a thread waiting on a certain object is never awakened because other waiting threads are always awakened instead of it. From 23480fb0cd5f08342971ac08e456d0fc59a7b8b9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 11:45:44 +0800 Subject: [PATCH 187/524] Published with https://stackedit.io/ --- ...351\245\277\345\222\214\345\205\254\345\271\263.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index f29127b..b7b8302 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -14,15 +14,15 @@ 你可以为每个线程设置优先级。高优先级的线程能够获得更多的CPU时间。优先级可以设置为1-10之间。这些优先级值的解释根据操作系统的差异而有所不同。对于大部分应用程式来说,你最好不要改变其优先级值。 -###Threads are blocked indefinitely waiting to enter a synchronized block +###线程陷入无止境地等待进入同步块状态 Java's synchronized code blocks can be another cause of starvation. Java's synchronized code block makes no guarantee about the sequence in which threads waiting to enter the synchronized block are allowed to enter. This means that there is a theoretical risk that a thread remains blocked forever trying to enter the block, because other threads are constantly granted access before it. This problem is called "starvation", that a thread is "starved to death" by because other threads are allowed the CPU time instead of it. -###Threads waiting on an object (called wait() on it) remain waiting indefinitely +### 线程陷入无止境地等待被唤醒(调用了对象的wait()方法)状态, The notify() method makes no guarantee about what thread is awakened if multiple thread have called wait() on the object notify() is called on. It could be any of the threads waiting. Therefore there is a risk that a thread waiting on a certain object is never awakened because other waiting threads are always awakened instead of it. -##Implementing Fairness in Java +##在Java中的公平性实现(Implementing Fairness in Java) While it is not possible to implement 100% fairness in Java we can still implement our synchronization constructs to increase fairness between threads. @@ -85,7 +85,7 @@ As stated earlier synchronized blocks makes no guarantees about what thread is b The current version of the Lock class calls its own wait() method. If instead each thread calls wait() on a separate object, so that only one thread has called wait() on each object, the Lock class can decide which of these objects to call notify() on, thereby effectively selecting exactly what thread to awaken. -##A Fair Lock +##公平锁(A Fair Lock) Below is shown the previous Lock class turned into a fair lock called FairLock. You will notice that the implementation has changed a bit with respect to synchronization and wait() / notify() compared to the Lock class shown earlier. @@ -166,6 +166,6 @@ Also notice that the QueueObject is really a semaphore. The doWait() and doNotif Finally, notice how the queueObject.doWait() is called inside a try - catch block. In case an InterruptedException is thrown the thread leaves the lock() method, and we need to dequeue it. -##A Note on Performance +##性能(A Note on Performance) If you compare the Lock and FairLock classes you will notice that there is somewhat more going on inside the lock() and unlock() in the FairLock class. This extra code will cause the FairLock to be a sligtly slower synchronization mechanism than Lock. How much impact this will have on your application depends on how long time the code in the critical section guarded by the FairLock takes to execute. The longer this takes to execute, the less significant the added overhead of the synchronizer is. It does of course also depend on how often this code is called. \ No newline at end of file From 15c41b016915c9ef7b7c10163734fa636a295355 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 12:01:26 +0800 Subject: [PATCH 188/524] Published with https://stackedit.io/ --- ...\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index b7b8302..30340ac 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -20,7 +20,7 @@ Java's synchronized code blocks can be another cause of starvation. Java's synch ### 线程陷入无止境地等待被唤醒(调用了对象的wait()方法)状态, -The notify() method makes no guarantee about what thread is awakened if multiple thread have called wait() on the object notify() is called on. It could be any of the threads waiting. Therefore there is a risk that a thread waiting on a certain object is never awakened because other waiting threads are always awakened instead of it. +如果多个线程都调用了同一个对象的`wait()`方法而,当一个线程调用这个对象的`notify()`方法后,并不能确定哪个调用了`wait()`方法的线程能够被唤醒。它可以是这些线程的任意一个。如果一个线程由于唤醒机会被其他线程抢占而一直无法被唤醒,这是非常危险的。 ##在Java中的公平性实现(Implementing Fairness in Java) From c7bcbc98421c36db7bf5aad52b8c7d13458a6ef6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 12:12:11 +0800 Subject: [PATCH 189/524] Published with https://stackedit.io/ --- ...\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index 30340ac..da3f168 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -16,7 +16,7 @@ ###线程陷入无止境地等待进入同步块状态 -Java's synchronized code blocks can be another cause of starvation. Java's synchronized code block makes no guarantee about the sequence in which threads waiting to enter the synchronized block are allowed to enter. This means that there is a theoretical risk that a thread remains blocked forever trying to enter the block, because other threads are constantly granted access before it. This problem is called "starvation", that a thread is "starved to death" by because other threads are allowed the CPU time instead of it. +Java同步代码块是另一个能够导致饥饿的原因。Java同步代码块不能够保证进入同步块线程的顺序。这意味着,理论上存在可以陷入无限等待进入同步块的线程。线程会因为得不到任何CPU机会而饿死。 ### 线程陷入无止境地等待被唤醒(调用了对象的wait()方法)状态, From a246b78ed72f61bc3d89fc3554d877ea6b2db18f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 12:20:14 +0800 Subject: [PATCH 190/524] Published with https://stackedit.io/ --- ...\245\277\345\222\214\345\205\254\345\271\263.md" | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index da3f168..0038054 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -24,10 +24,11 @@ Java同步代码块是另一个能够导致饥饿的原因。Java同步代码块 ##在Java中的公平性实现(Implementing Fairness in Java) -While it is not possible to implement 100% fairness in Java we can still implement our synchronization constructs to increase fairness between threads. +虽然在Java中实现100%的公平是不可能,但是我们仍然能够通过同步结构提高线程的公平性。 -First lets study a simple synchronized code block: +我们学习一下同步代码块: +```Java public class Synchronizer{ public synchronized void doSynchronized(){ @@ -35,9 +36,13 @@ public class Synchronizer{ } } -If more than one thread call the doSynchronized() method, some of them will be blocked until the first thread granted access has left the method. If more than one thread are blocked waiting for access there is no guarantee about which thread is granted access next. +``` + +如果有多个线程调用`doSynchroinized()`方法,有一个线程会进入同步代码块,而剩余的则会阻塞直到第一个线程离开同步代码块。在多个线程阻塞的时候,我们并不知道哪个线程会成为下一个进入同步代码块的线程。 + +##使用Locks代替Synchronized块(Using Locks Instead of Synchronized Blocks) + -Using Locks Instead of Synchronized Blocks To increase the fairness of waiting threads first we will change the code block to be guarded by a lock rather than a synchronized block: From 5b0b27fba58f0ef412fa1abef3aa7696298f810d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 12:25:59 +0800 Subject: [PATCH 191/524] Published with https://stackedit.io/ --- ...245\277\345\222\214\345\205\254\345\271\263.md" | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index 0038054..d246be0 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -42,10 +42,9 @@ public class Synchronizer{ ##使用Locks代替Synchronized块(Using Locks Instead of Synchronized Blocks) +为了提高线程的公平性,我们可以使用Locks来代替Synchronized块: - -To increase the fairness of waiting threads first we will change the code block to be guarded by a lock rather than a synchronized block: - +```Java public class Synchronizer{ Lock lock = new Lock(); @@ -56,10 +55,13 @@ public class Synchronizer{ } } -Notice how the doSynchronized() method is no longer declared synchronized. Instead the critical section is guarded by the lock.lock() and lock.unlock() calls. +``` -A simple implementation of the Lock class could look like this: +注意这里并没有使用**synchronized** 关键字声明方法。取而代之,我们使用`lock.lock()`和`lock.unlock()`来包裹临界区。 +下面是一个Lock类的简单实现: + +```Java public class Lock{ private boolean isLocked = false; private Thread lockingThread = null; @@ -82,6 +84,8 @@ public class Lock{ notify(); } } +``` + If you look at the Synchronizer class above and look into this Lock implementation you will notice that threads are now blocked trying to access the lock() method, if more than one thread calls lock() simultanously. Second, if the lock is locked, the threads are blocked in the wait() call inside the while(isLocked) loop in the lock() method. Remember that a thread calling wait() releases the synchronization lock on the Lock instance, so threads waiting to enter lock() can now do so. The result is that multiple threads can end up having called wait() inside lock(). If you look back at the doSynchronized() method you will notice that the comment between lock() and unlock() states, that the code in between these two calls take a "long" time to execute. Let us further assume that this code takes long time to execute compared to entering the lock() method and calling wait() because the lock is locked. This means that the majority of the time waited to be able to lock the lock and enter the critical section is spent waiting in the wait() call inside the lock() method, not being blocked trying to enter the lock() method. From 71a8b5249fcbd956ef5cc57847f93bdbe3613e83 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 12:28:53 +0800 Subject: [PATCH 192/524] Published with https://stackedit.io/ From cf26d797405c7d4e4978363d8b6d9349931332af Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 12:40:54 +0800 Subject: [PATCH 193/524] Published with https://stackedit.io/ --- ...245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index d246be0..be1d263 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -100,6 +100,7 @@ Below is shown the previous Lock class turned into a fair lock called FairLock. Exactly how I arrived at this design beginning from the previous Lock class is a longer story involving several incremental design steps, each fixing the problem of the previous step: Nested Monitor Lockout, Slipped Conditions, and Missed Signals. That discussion is left out of this text to keep the text short, but each of the steps are discussed in the appropriate texts on the topic ( see the links above). What is important is, that every thread calling lock() is now queued, and only the first thread in the queue is allowed to lock the FairLock instance, if it is unlocked. All other threads are parked waiting until they reach the top of the queue. +``` public class FairLock { private boolean isLocked = false; private Thread lockingThread = null; @@ -165,6 +166,8 @@ public class QueueObject { return this == o; } } +``` + First you might notice that the lock() method is no longer declared synchronized. Instead only the blocks necessary to synchronize are nested inside synchronized blocks. FairLock creates a new instance of QueueObject and enqueue it for each thread calling lock(). The thread calling unlock() will take the top QueueObject in the queue and call doNotify() on it, to awaken the thread waiting on that object. This way only one waiting thread is awakened at a time, rather than all waiting threads. This part is what governs the fairness of the FairLock. From 6e457b6d1a6b05016cb1efed3f8ae9995c7406e2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 12:50:57 +0800 Subject: [PATCH 194/524] Published with https://stackedit.io/ From 73073683ad1cc554db10f40273c56dca4709390d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 13:19:36 +0800 Subject: [PATCH 195/524] Published with https://stackedit.io/ --- ...45\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index be1d263..1f55500 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -86,6 +86,10 @@ public class Lock{ } ``` +对比之前的Synchronizer类,当多个线程同时调用`lock()` 方法时,只有一个线程能够进入`lock()`方法,其余的会阻塞在`lock()`方法上。然后,如果isLocked的值为true,则该线程会进入while循环内部,调用`wait()`方法并释放当前对象的锁,阻塞在同步块的其中一个线程会进入同步块。结果就是,阻塞在`lock()`方法上的线程依次进入同步块并调用`wait()`方法。 + + + If you look at the Synchronizer class above and look into this Lock implementation you will notice that threads are now blocked trying to access the lock() method, if more than one thread calls lock() simultanously. Second, if the lock is locked, the threads are blocked in the wait() call inside the while(isLocked) loop in the lock() method. Remember that a thread calling wait() releases the synchronization lock on the Lock instance, so threads waiting to enter lock() can now do so. The result is that multiple threads can end up having called wait() inside lock(). If you look back at the doSynchronized() method you will notice that the comment between lock() and unlock() states, that the code in between these two calls take a "long" time to execute. Let us further assume that this code takes long time to execute compared to entering the lock() method and calling wait() because the lock is locked. This means that the majority of the time waited to be able to lock the lock and enter the critical section is spent waiting in the wait() call inside the lock() method, not being blocked trying to enter the lock() method. From 0f8944ac3944d730c75a2149b3158b11ecf2edb3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sun, 14 Sep 2014 13:34:05 +0800 Subject: [PATCH 196/524] Published with https://stackedit.io/ --- ...\245\277\345\222\214\345\205\254\345\271\263.md" | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index 1f55500..f7feaf1 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -85,18 +85,19 @@ public class Lock{ } } ``` +看下Synchronizer类和lock类,当多个线程同时调用`lock()` 方法时,只有一个线程能够进入`lock()`方法,其余的会阻塞在`lock()`方法上。然后,如果isLocked的值为true,则该线程会进入while循环内部,调用`wait()`方法并释放当前对象的锁,阻塞在同步块的其中一个线程会进入同步块。结果就是,阻塞在`lock()`方法上的线程依次进入同步块并调用`wait()`方法。 -对比之前的Synchronizer类,当多个线程同时调用`lock()` 方法时,只有一个线程能够进入`lock()`方法,其余的会阻塞在`lock()`方法上。然后,如果isLocked的值为true,则该线程会进入while循环内部,调用`wait()`方法并释放当前对象的锁,阻塞在同步块的其中一个线程会进入同步块。结果就是,阻塞在`lock()`方法上的线程依次进入同步块并调用`wait()`方法。 +再看下Synchronized类的`doSynchronized()`方法,你会发现`lock()`方法与`unlock()`方法之间的注释,这之间的代码会执行相当长的一段时间。让我们假设这段代码相比进入`lock()`方法和调用`wait()`方法会执行相当长一段时间。这意味着大部分时间用在等待进入锁和进入临界区的过程是用在wait()的等待中,而不是被阻塞在试图进入lock()方法中。 +(If you look back at the doSynchronized() method you will notice that the comment between lock() and unlock() states, that the code in between these two calls take a "long" time to execute. Let us further assume that this code takes long time to execute compared to entering the lock() method and calling wait() because the lock is locked. This means that the majority of the time waited to be able to lock the lock and enter the critical section is spent waiting in the wait() call inside the lock() method, not being blocked trying to enter the lock() method.) +在早些时候提到过,同步块不会对等待进入的多个线程谁能获得访问做任何保障,同样当调用notify()时,wait()也不会做保障一定能唤醒线程(至于为什么,请看线程通信)。因此这个版本的Lock类和doSynchronized()那个版本就保障公平性而言,没有任何区别。 -If you look at the Synchronizer class above and look into this Lock implementation you will notice that threads are now blocked trying to access the lock() method, if more than one thread calls lock() simultanously. Second, if the lock is locked, the threads are blocked in the wait() call inside the while(isLocked) loop in the lock() method. Remember that a thread calling wait() releases the synchronization lock on the Lock instance, so threads waiting to enter lock() can now do so. The result is that multiple threads can end up having called wait() inside lock(). +(As stated earlier synchronized blocks makes no guarantees about what thread is being granted access if more than one thread is waiting to enter. Nor does wait() make any guarantees about what thread is awakened when notify() is called. So, the current version of the Lock class makes no different guarantees with respect to fairness than synchronized version of doSynchronized(). But we can change that.) -If you look back at the doSynchronized() method you will notice that the comment between lock() and unlock() states, that the code in between these two calls take a "long" time to execute. Let us further assume that this code takes long time to execute compared to entering the lock() method and calling wait() because the lock is locked. This means that the majority of the time waited to be able to lock the lock and enter the critical section is spent waiting in the wait() call inside the lock() method, not being blocked trying to enter the lock() method. +但我们能改变这种情况。当前的Lock类版本调用自己的wait()方法,如果每个线程在不同的对象上调用wait(),那么只有一个线程会在该对象上调用wait(),Lock类可以决定哪个对象能对其调用notify(),因此能做到有效的选择唤醒哪个线程。 -As stated earlier synchronized blocks makes no guarantees about what thread is being granted access if more than one thread is waiting to enter. Nor does wait() make any guarantees about what thread is awakened when notify() is called. So, the current version of the Lock class makes no different guarantees with respect to fairness than synchronized version of doSynchronized(). But we can change that. - -The current version of the Lock class calls its own wait() method. If instead each thread calls wait() on a separate object, so that only one thread has called wait() on each object, the Lock class can decide which of these objects to call notify() on, thereby effectively selecting exactly what thread to awaken. +(The current version of the Lock class calls its own wait() method. If instead each thread calls wait() on a separate object, so that only one thread has called wait() on each object, the Lock class can decide which of these objects to call notify() on, thereby effectively selecting exactly what thread to awaken.) ##公平锁(A Fair Lock) From aad374cdbb98a6bc50664b167500354f6a713964 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 13:36:19 +0800 Subject: [PATCH 197/524] Published with https://stackedit.io/ --- ...\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index f7feaf1..8933dd2 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -1,4 +1,4 @@ -#饥饿和公平(Starvation and Fairness) +#12.饥饿和公平(Starvation and Fairness) 如果一个线程由于CPU时间全部被其他线程抢占而得不到CPU时间,这就称为**饥饿(Starvation)**。这个线程因为得不到CPU机会而“饿死(starved to death)"。解决饥饿的方案称为**公平(Fairness)**--所有的线程都能公平地获得CPU时间。 From 6f2530f1201ba204537da637dc01f8c2ad36eafc Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 13:58:28 +0800 Subject: [PATCH 198/524] Published with https://stackedit.io/ --- ...245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index 8933dd2..5abe142 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -101,10 +101,17 @@ public class Lock{ ##公平锁(A Fair Lock) +下面的例子将之前Lock类改写成了公平锁的FairLock类。 + Below is shown the previous Lock class turned into a fair lock called FairLock. You will notice that the implementation has changed a bit with respect to synchronization and wait() / notify() compared to the Lock class shown earlier. Exactly how I arrived at this design beginning from the previous Lock class is a longer story involving several incremental design steps, each fixing the problem of the previous step: Nested Monitor Lockout, Slipped Conditions, and Missed Signals. That discussion is left out of this text to keep the text short, but each of the steps are discussed in the appropriate texts on the topic ( see the links above). What is important is, that every thread calling lock() is now queued, and only the first thread in the queue is allowed to lock the FairLock instance, if it is unlocked. All other threads are parked waiting until they reach the top of the queue. +如下图所示先前的锁类变成一个公平的锁叫FairLock。你会发现,实施已经改变了一下关于同步和wait()有/通知()相比前面介绍的锁类。 + +究竟我是怎么来到这个设计从以前的锁类开始是一个较长的故事,涉及多个增量的设计步骤,每个固定的上一步的问题:嵌套监控锁定,溜条件和未接信号。这种讨论留出这段文字保存在文本短,但是每个步骤都是在这个专题的相应文本(见上面的链接)进行讨论。最重要的是,每一个线程调用lock()现在是排队的,只有在队列中的第一个线程被允许锁定FairLock举例来说,如果它被解锁。所有其他线程都停在等待,直到它们到达队列的顶部。 + + ``` public class FairLock { private boolean isLocked = false; From 8d87fb1f42075607f7d63e8c75cfa11869d6aa8d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:15:42 +0800 Subject: [PATCH 199/524] Published with https://stackedit.io/ --- ...\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index 5abe142..7074380 100644 --- "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -101,8 +101,6 @@ public class Lock{ ##公平锁(A Fair Lock) -下面的例子将之前Lock类改写成了公平锁的FairLock类。 - Below is shown the previous Lock class turned into a fair lock called FairLock. You will notice that the implementation has changed a bit with respect to synchronization and wait() / notify() compared to the Lock class shown earlier. Exactly how I arrived at this design beginning from the previous Lock class is a longer story involving several incremental design steps, each fixing the problem of the previous step: Nested Monitor Lockout, Slipped Conditions, and Missed Signals. That discussion is left out of this text to keep the text short, but each of the steps are discussed in the appropriate texts on the topic ( see the links above). What is important is, that every thread calling lock() is now queued, and only the first thread in the queue is allowed to lock the FairLock instance, if it is unlocked. All other threads are parked waiting until they reach the top of the queue. From 4d6a2484b5f75d7115cbf341dce18652c86ec84a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:16:31 +0800 Subject: [PATCH 200/524] Published with https://stackedit.io/ --- Java | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Java diff --git a/Java b/Java new file mode 100644 index 0000000..872a216 --- /dev/null +++ b/Java @@ -0,0 +1,131 @@ +#13.嵌套管程锁死(Nested Monitor Lockout) + +How Nested Monitor Lockout Occurs + +Nested monitor lockout is a problem similar to deadlock. A nested monitor lockout occurs like this: + +Thread 1 synchronizes on A +Thread 1 synchronizes on B (while synchronized on A) +Thread 1 decides to wait for a signal from another thread before continuing +Thread 1 calls B.wait() thereby releasing the lock on B, but not A. + +Thread 2 needs to lock both A and B (in that sequence) + to send Thread 1 the signal. +Thread 2 cannot lock A, since Thread 1 still holds the lock on A. +Thread 2 remain blocked indefinately waiting for Thread1 + to release the lock on A + +Thread 1 remain blocked indefinately waiting for the signal from + Thread 2, thereby + never releasing the lock on A, that must be released to make + it possible for Thread 2 to send the signal to Thread 1, etc. +This may sound like a pretty theoretical situation, but look at the naive Lock implemenation below: + +//lock implementation with nested monitor lockout problem + +public class Lock{ + protected MonitorObject monitorObject = new MonitorObject(); + protected boolean isLocked = false; + + public void lock() throws InterruptedException{ + synchronized(this){ + while(isLocked){ + synchronized(this.monitorObject){ + this.monitorObject.wait(); + } + } + isLocked = true; + } + } + + public void unlock(){ + synchronized(this){ + this.isLocked = false; + synchronized(this.monitorObject){ + this.monitorObject.notify(); + } + } + } +} +Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. + +The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". + +When the thread that locked the Lock in the first place tries to unlock it by calling unlock() it will be blocked trying to enter the synchronized(this) block in the unlock() method. It will remain blocked until the thread waiting in lock() leaves the synchronized(this) block. But the thread waiting in the lock() method will not leave that block until the isLocked is set to false, and a monitorObject.notify() is executed, as it happens in unlock(). + +Put shortly, the thread waiting in lock() needs an unlock() call to execute successfully for it to exit lock() and the synchronized blocks inside it. But, no thread can actually execute unlock() until the thread waiting in lock() leaves the outer synchronized block. + +This result is that any thread calling either lock() or unlock() will become blocked indefinately. This is called a nested monitor lockout. + +A More Realistic Example + +You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. But there are situations in which designs like the one above may arise. For instance, if you were to implement fairness in a Lock. When doing so you want each thread to call wait() on each their own queue object, so that you can notify the threads one at a time. + +Look at this naive implementation of a fair lock: + +//Fair Lock implementation with nested monitor lockout problem + +public class FairLock { + private boolean isLocked = false; + private Thread lockingThread = null; + private List waitingThreads = + new ArrayList(); + + public void lock() throws InterruptedException{ + QueueObject queueObject = new QueueObject(); + + synchronized(this){ + waitingThreads.add(queueObject); + + while(isLocked || waitingThreads.get(0) != queueObject){ + + synchronized(queueObject){ + try{ + queueObject.wait(); + }catch(InterruptedException e){ + waitingThreads.remove(queueObject); + throw e; + } + } + } + waitingThreads.remove(queueObject); + isLocked = true; + lockingThread = Thread.currentThread(); + } + } + + public synchronized void unlock(){ + if(this.lockingThread != Thread.currentThread()){ + throw new IllegalMonitorStateException( + "Calling thread has not locked this lock"); + } + isLocked = false; + lockingThread = null; + if(waitingThreads.size() > 0){ + QueueObject queueObject = waitingThread.get(0); + synchronized(queueObject){ + queueObject.notify(); + } + } + } +} +public class QueueObject {} +At first glance this implementation may look fine, but notice how the lock() method calls queueObject.wait(); from inside two synchronized blocks. One synchronized on "this", and nested inside that, a block synchronized on the queueObject local variable. When a thread calls queueObject.wait()it releases the lock on the QueueObject instance, but not the lock associated with "this". + +Notice too, that the unlock() method is declared synchronized which equals a synchronized(this) block. This means, that if a thread is waiting inside lock() the monitor object associated with "this" will be locked by the waiting thread. All threads calling unlock() will remain blocked indefinately, waiting for the waiting thread to release the lock on "this". But this will never happen, since this only happens if a thread succeeds in sending a signal to the waiting thread, and this can only be sent by executing the unlock() method. + +And so, the FairLock implementation from above could lead to nested monitor lockout. A better implementation of a fair lock is described in the text Starvation and Fairness. + +Nested Monitor Lockout vs. Deadlock + +The result of nested monitor lockout and deadlock are pretty much the same: The threads involved end up blocked forever waiting for each other. + +The two situations are not equal though. As explained in the text on Deadlock a deadlock occurs when two threads obtain locks in different order. Thread 1 locks A, waits for B. Thread 2 has locked B, and now waits for A. As explained in the text on Deadlock Prevention deadlocks can be avoided by always locking the locks in the same order (Lock Ordering). However, a nested monitor lockout occurs exactly by two threads taking the locks in the same order. Thread 1 locks A and B, then releases B and waits for a signal from Thread 2. Thread 2 needs both A and B to send Thread 1 the signal. So, one thread is waiting for a signal, and another for a lock to be released. + +The difference is summed up here: + +In deadlock, two threads are waiting for each other to release locks. + +In nested monitor lockout, Thread 1 is holding a lock A, and waits +for a signal from Thread 2. Thread 2 needs the lock A to send the +signal to Thread 1. From a41f379ca37188add7e26c839bbf21cdcb49755a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:16:55 +0800 Subject: [PATCH 201/524] Delete Java --- Java | 131 ----------------------------------------------------------- 1 file changed, 131 deletions(-) delete mode 100644 Java diff --git a/Java b/Java deleted file mode 100644 index 872a216..0000000 --- a/Java +++ /dev/null @@ -1,131 +0,0 @@ -#13.嵌套管程锁死(Nested Monitor Lockout) - -How Nested Monitor Lockout Occurs - -Nested monitor lockout is a problem similar to deadlock. A nested monitor lockout occurs like this: - -Thread 1 synchronizes on A -Thread 1 synchronizes on B (while synchronized on A) -Thread 1 decides to wait for a signal from another thread before continuing -Thread 1 calls B.wait() thereby releasing the lock on B, but not A. - -Thread 2 needs to lock both A and B (in that sequence) - to send Thread 1 the signal. -Thread 2 cannot lock A, since Thread 1 still holds the lock on A. -Thread 2 remain blocked indefinately waiting for Thread1 - to release the lock on A - -Thread 1 remain blocked indefinately waiting for the signal from - Thread 2, thereby - never releasing the lock on A, that must be released to make - it possible for Thread 2 to send the signal to Thread 1, etc. -This may sound like a pretty theoretical situation, but look at the naive Lock implemenation below: - -//lock implementation with nested monitor lockout problem - -public class Lock{ - protected MonitorObject monitorObject = new MonitorObject(); - protected boolean isLocked = false; - - public void lock() throws InterruptedException{ - synchronized(this){ - while(isLocked){ - synchronized(this.monitorObject){ - this.monitorObject.wait(); - } - } - isLocked = true; - } - } - - public void unlock(){ - synchronized(this){ - this.isLocked = false; - synchronized(this.monitorObject){ - this.monitorObject.notify(); - } - } - } -} -Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. - -The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". - -When the thread that locked the Lock in the first place tries to unlock it by calling unlock() it will be blocked trying to enter the synchronized(this) block in the unlock() method. It will remain blocked until the thread waiting in lock() leaves the synchronized(this) block. But the thread waiting in the lock() method will not leave that block until the isLocked is set to false, and a monitorObject.notify() is executed, as it happens in unlock(). - -Put shortly, the thread waiting in lock() needs an unlock() call to execute successfully for it to exit lock() and the synchronized blocks inside it. But, no thread can actually execute unlock() until the thread waiting in lock() leaves the outer synchronized block. - -This result is that any thread calling either lock() or unlock() will become blocked indefinately. This is called a nested monitor lockout. - -A More Realistic Example - -You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. But there are situations in which designs like the one above may arise. For instance, if you were to implement fairness in a Lock. When doing so you want each thread to call wait() on each their own queue object, so that you can notify the threads one at a time. - -Look at this naive implementation of a fair lock: - -//Fair Lock implementation with nested monitor lockout problem - -public class FairLock { - private boolean isLocked = false; - private Thread lockingThread = null; - private List waitingThreads = - new ArrayList(); - - public void lock() throws InterruptedException{ - QueueObject queueObject = new QueueObject(); - - synchronized(this){ - waitingThreads.add(queueObject); - - while(isLocked || waitingThreads.get(0) != queueObject){ - - synchronized(queueObject){ - try{ - queueObject.wait(); - }catch(InterruptedException e){ - waitingThreads.remove(queueObject); - throw e; - } - } - } - waitingThreads.remove(queueObject); - isLocked = true; - lockingThread = Thread.currentThread(); - } - } - - public synchronized void unlock(){ - if(this.lockingThread != Thread.currentThread()){ - throw new IllegalMonitorStateException( - "Calling thread has not locked this lock"); - } - isLocked = false; - lockingThread = null; - if(waitingThreads.size() > 0){ - QueueObject queueObject = waitingThread.get(0); - synchronized(queueObject){ - queueObject.notify(); - } - } - } -} -public class QueueObject {} -At first glance this implementation may look fine, but notice how the lock() method calls queueObject.wait(); from inside two synchronized blocks. One synchronized on "this", and nested inside that, a block synchronized on the queueObject local variable. When a thread calls queueObject.wait()it releases the lock on the QueueObject instance, but not the lock associated with "this". - -Notice too, that the unlock() method is declared synchronized which equals a synchronized(this) block. This means, that if a thread is waiting inside lock() the monitor object associated with "this" will be locked by the waiting thread. All threads calling unlock() will remain blocked indefinately, waiting for the waiting thread to release the lock on "this". But this will never happen, since this only happens if a thread succeeds in sending a signal to the waiting thread, and this can only be sent by executing the unlock() method. - -And so, the FairLock implementation from above could lead to nested monitor lockout. A better implementation of a fair lock is described in the text Starvation and Fairness. - -Nested Monitor Lockout vs. Deadlock - -The result of nested monitor lockout and deadlock are pretty much the same: The threads involved end up blocked forever waiting for each other. - -The two situations are not equal though. As explained in the text on Deadlock a deadlock occurs when two threads obtain locks in different order. Thread 1 locks A, waits for B. Thread 2 has locked B, and now waits for A. As explained in the text on Deadlock Prevention deadlocks can be avoided by always locking the locks in the same order (Lock Ordering). However, a nested monitor lockout occurs exactly by two threads taking the locks in the same order. Thread 1 locks A and B, then releases B and waits for a signal from Thread 2. Thread 2 needs both A and B to send Thread 1 the signal. So, one thread is waiting for a signal, and another for a lock to be released. - -The difference is summed up here: - -In deadlock, two threads are waiting for each other to release locks. - -In nested monitor lockout, Thread 1 is holding a lock A, and waits -for a signal from Thread 2. Thread 2 needs the lock A to send the -signal to Thread 1. From 7e0f83f6b1079396110825bcefca716db65b212c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:17:43 +0800 Subject: [PATCH 202/524] Published with https://stackedit.io/ --- Java | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Java diff --git a/Java b/Java new file mode 100644 index 0000000..872a216 --- /dev/null +++ b/Java @@ -0,0 +1,131 @@ +#13.嵌套管程锁死(Nested Monitor Lockout) + +How Nested Monitor Lockout Occurs + +Nested monitor lockout is a problem similar to deadlock. A nested monitor lockout occurs like this: + +Thread 1 synchronizes on A +Thread 1 synchronizes on B (while synchronized on A) +Thread 1 decides to wait for a signal from another thread before continuing +Thread 1 calls B.wait() thereby releasing the lock on B, but not A. + +Thread 2 needs to lock both A and B (in that sequence) + to send Thread 1 the signal. +Thread 2 cannot lock A, since Thread 1 still holds the lock on A. +Thread 2 remain blocked indefinately waiting for Thread1 + to release the lock on A + +Thread 1 remain blocked indefinately waiting for the signal from + Thread 2, thereby + never releasing the lock on A, that must be released to make + it possible for Thread 2 to send the signal to Thread 1, etc. +This may sound like a pretty theoretical situation, but look at the naive Lock implemenation below: + +//lock implementation with nested monitor lockout problem + +public class Lock{ + protected MonitorObject monitorObject = new MonitorObject(); + protected boolean isLocked = false; + + public void lock() throws InterruptedException{ + synchronized(this){ + while(isLocked){ + synchronized(this.monitorObject){ + this.monitorObject.wait(); + } + } + isLocked = true; + } + } + + public void unlock(){ + synchronized(this){ + this.isLocked = false; + synchronized(this.monitorObject){ + this.monitorObject.notify(); + } + } + } +} +Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. + +The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". + +When the thread that locked the Lock in the first place tries to unlock it by calling unlock() it will be blocked trying to enter the synchronized(this) block in the unlock() method. It will remain blocked until the thread waiting in lock() leaves the synchronized(this) block. But the thread waiting in the lock() method will not leave that block until the isLocked is set to false, and a monitorObject.notify() is executed, as it happens in unlock(). + +Put shortly, the thread waiting in lock() needs an unlock() call to execute successfully for it to exit lock() and the synchronized blocks inside it. But, no thread can actually execute unlock() until the thread waiting in lock() leaves the outer synchronized block. + +This result is that any thread calling either lock() or unlock() will become blocked indefinately. This is called a nested monitor lockout. + +A More Realistic Example + +You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. But there are situations in which designs like the one above may arise. For instance, if you were to implement fairness in a Lock. When doing so you want each thread to call wait() on each their own queue object, so that you can notify the threads one at a time. + +Look at this naive implementation of a fair lock: + +//Fair Lock implementation with nested monitor lockout problem + +public class FairLock { + private boolean isLocked = false; + private Thread lockingThread = null; + private List waitingThreads = + new ArrayList(); + + public void lock() throws InterruptedException{ + QueueObject queueObject = new QueueObject(); + + synchronized(this){ + waitingThreads.add(queueObject); + + while(isLocked || waitingThreads.get(0) != queueObject){ + + synchronized(queueObject){ + try{ + queueObject.wait(); + }catch(InterruptedException e){ + waitingThreads.remove(queueObject); + throw e; + } + } + } + waitingThreads.remove(queueObject); + isLocked = true; + lockingThread = Thread.currentThread(); + } + } + + public synchronized void unlock(){ + if(this.lockingThread != Thread.currentThread()){ + throw new IllegalMonitorStateException( + "Calling thread has not locked this lock"); + } + isLocked = false; + lockingThread = null; + if(waitingThreads.size() > 0){ + QueueObject queueObject = waitingThread.get(0); + synchronized(queueObject){ + queueObject.notify(); + } + } + } +} +public class QueueObject {} +At first glance this implementation may look fine, but notice how the lock() method calls queueObject.wait(); from inside two synchronized blocks. One synchronized on "this", and nested inside that, a block synchronized on the queueObject local variable. When a thread calls queueObject.wait()it releases the lock on the QueueObject instance, but not the lock associated with "this". + +Notice too, that the unlock() method is declared synchronized which equals a synchronized(this) block. This means, that if a thread is waiting inside lock() the monitor object associated with "this" will be locked by the waiting thread. All threads calling unlock() will remain blocked indefinately, waiting for the waiting thread to release the lock on "this". But this will never happen, since this only happens if a thread succeeds in sending a signal to the waiting thread, and this can only be sent by executing the unlock() method. + +And so, the FairLock implementation from above could lead to nested monitor lockout. A better implementation of a fair lock is described in the text Starvation and Fairness. + +Nested Monitor Lockout vs. Deadlock + +The result of nested monitor lockout and deadlock are pretty much the same: The threads involved end up blocked forever waiting for each other. + +The two situations are not equal though. As explained in the text on Deadlock a deadlock occurs when two threads obtain locks in different order. Thread 1 locks A, waits for B. Thread 2 has locked B, and now waits for A. As explained in the text on Deadlock Prevention deadlocks can be avoided by always locking the locks in the same order (Lock Ordering). However, a nested monitor lockout occurs exactly by two threads taking the locks in the same order. Thread 1 locks A and B, then releases B and waits for a signal from Thread 2. Thread 2 needs both A and B to send Thread 1 the signal. So, one thread is waiting for a signal, and another for a lock to be released. + +The difference is summed up here: + +In deadlock, two threads are waiting for each other to release locks. + +In nested monitor lockout, Thread 1 is holding a lock A, and waits +for a signal from Thread 2. Thread 2 needs the lock A to send the +signal to Thread 1. From 2639f3ac3dae633ee01db8a021c5b0bb67b881f7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:18:17 +0800 Subject: [PATCH 203/524] Published with https://stackedit.io/ From 36bc6c2af04b086213794fdd50f827af00616b4b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:35:28 +0800 Subject: [PATCH 204/524] Published with https://stackedit.io/ --- ...41\347\250\213\351\224\201\346\255\273.md" | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" index 872a216..d7f6f77 100644 --- "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -1,26 +1,26 @@ #13.嵌套管程锁死(Nested Monitor Lockout) -How Nested Monitor Lockout Occurs +##嵌套管程锁死如何发生 +嵌套管程锁死类似与死锁。它发生的情况类似这样: Nested monitor lockout is a problem similar to deadlock. A nested monitor lockout occurs like this: -Thread 1 synchronizes on A -Thread 1 synchronizes on B (while synchronized on A) -Thread 1 decides to wait for a signal from another thread before continuing -Thread 1 calls B.wait() thereby releasing the lock on B, but not A. +``` +线程1 获得对象A的锁 +线程1 获得对象B的锁(同时持有对象A的锁) +线程1 决定等待另一个线程的信号再继续 +线程1 调用B.wait()方法释放对象B的锁,当仍然拥有对象A的锁 -Thread 2 needs to lock both A and B (in that sequence) - to send Thread 1 the signal. -Thread 2 cannot lock A, since Thread 1 still holds the lock on A. -Thread 2 remain blocked indefinately waiting for Thread1 - to release the lock on A +线程2 需要依次获得对象A和对象B的锁 +线程2 由于对象A的锁由线程1持有,线程2进入阻塞状态 +线程2 一直被阻塞,等待线程1释放对象A的锁 -Thread 1 remain blocked indefinately waiting for the signal from - Thread 2, thereby - never releasing the lock on A, that must be released to make - it possible for Thread 2 to send the signal to Thread 1, etc. -This may sound like a pretty theoretical situation, but look at the naive Lock implemenation below: +线程1 由于需要等待线程2的信号而一直陷入等待状态,因此一直没有释放对象A的锁,而线程2需要持有对象A的锁才能给线程1发送信号... +``` +这听起来像是纯理论的场景,不妨看下这个比较幼稚的Lock实现: + +```Java //lock implementation with nested monitor lockout problem public class Lock{ @@ -47,6 +47,8 @@ public class Lock{ } } } +``` + Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". From 75764bfc9e3377e691cb7da2f282d54c69c1d993 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:44:37 +0800 Subject: [PATCH 205/524] Published with https://stackedit.io/ --- ...45\227\347\256\241\347\250\213\351\224\201\346\255\273.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" index d7f6f77..c5ff8f0 100644 --- "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -49,6 +49,10 @@ public class Lock{ } ``` +注意`lock()`方法中,首先获得this的锁,然后获得`monitorObject`的锁。当`isLock`为`false`时不会有什么问题,此时线程不会调用`monitorObject.wait()`方法。而当`isLock`为`true`时,线程会调用`monitorObjct.wait()`方法而陷入等待状态。 + + + Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". From 1068a531f177cafb259f0cb3933e066c0a81e6a7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 14:58:13 +0800 Subject: [PATCH 206/524] Published with https://stackedit.io/ --- ...\227\347\256\241\347\250\213\351\224\201\346\255\273.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" index c5ff8f0..25e67e9 100644 --- "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -51,13 +51,13 @@ public class Lock{ 注意`lock()`方法中,首先获得this的锁,然后获得`monitorObject`的锁。当`isLock`为`false`时不会有什么问题,此时线程不会调用`monitorObject.wait()`方法。而当`isLock`为`true`时,线程会调用`monitorObjct.wait()`方法而陷入等待状态。 +问题就在于,调用`monitorObject.wait()`方法会释放monitorObject的锁,而不会释放this上的锁。换言之,线程在嵌入等待状态的同时,仍然持有this的锁。 +当一个线程调用`lock()`方法成功锁住后,再次调用`unlock()`方法时则会在进入this的同步块时陷入阻塞状态。它只有当陷入等待状态的线程释放this的锁才能够进入this的同步块。而嵌入等待的线程却需要嵌入阻塞的线程将isLock设置为false和调用`monitorObject.notify()` 才会释放this的锁。 -Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. +这导致的结果就是:任意调用`lock()`和`unlock()`的线程都会陷入无止境的阻塞和等待状态。这种线程称之为**嵌套管程锁死**。 -The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". -When the thread that locked the Lock in the first place tries to unlock it by calling unlock() it will be blocked trying to enter the synchronized(this) block in the unlock() method. It will remain blocked until the thread waiting in lock() leaves the synchronized(this) block. But the thread waiting in the lock() method will not leave that block until the isLocked is set to false, and a monitorObject.notify() is executed, as it happens in unlock(). Put shortly, the thread waiting in lock() needs an unlock() call to execute successfully for it to exit lock() and the synchronized blocks inside it. But, no thread can actually execute unlock() until the thread waiting in lock() leaves the outer synchronized block. From 0a216ed33fba9437b16e9ff5bd87653d34a79e5a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:07:25 +0800 Subject: [PATCH 207/524] Published with https://stackedit.io/ --- ...347\256\241\347\250\213\351\224\201\346\255\273.md" | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" index 25e67e9..ec3d3d9 100644 --- "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -55,15 +55,11 @@ public class Lock{ 当一个线程调用`lock()`方法成功锁住后,再次调用`unlock()`方法时则会在进入this的同步块时陷入阻塞状态。它只有当陷入等待状态的线程释放this的锁才能够进入this的同步块。而嵌入等待的线程却需要嵌入阻塞的线程将isLock设置为false和调用`monitorObject.notify()` 才会释放this的锁。 -这导致的结果就是:任意调用`lock()`和`unlock()`的线程都会陷入无止境的阻塞和等待状态。这种线程称之为**嵌套管程锁死**。 - - +简而言之,调用`lock()`方法而陷入等待的线程1需要调用了`unlock()`方法的线程2正常地执行`unlock()`方法,但线程2却需要线程1释放锁才能够正确地执行下去。 -Put shortly, the thread waiting in lock() needs an unlock() call to execute successfully for it to exit lock() and the synchronized blocks inside it. But, no thread can actually execute unlock() until the thread waiting in lock() leaves the outer synchronized block. - -This result is that any thread calling either lock() or unlock() will become blocked indefinately. This is called a nested monitor lockout. +这导致的结果就是:任意调用`lock()`和`unlock()`的线程都会陷入无止境的阻塞和等待状态。这种线程称之为**嵌套管程锁死**。 -A More Realistic Example +##更现实的例子(A More Realistic Example) You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. But there are situations in which designs like the one above may arise. For instance, if you were to implement fairness in a Lock. When doing so you want each thread to call wait() on each their own queue object, so that you can notify the threads one at a time. From 1604cc4506633cff5d7b3c9acfaca8ca326df7e5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:19:30 +0800 Subject: [PATCH 208/524] Published with https://stackedit.io/ --- ...7\347\256\241\347\250\213\351\224\201\346\255\273.md" | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" index ec3d3d9..a3cd6f3 100644 --- "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -61,10 +61,11 @@ public class Lock{ ##更现实的例子(A More Realistic Example) -You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. But there are situations in which designs like the one above may arise. For instance, if you were to implement fairness in a Lock. When doing so you want each thread to call wait() on each their own queue object, so that you can notify the threads one at a time. +也许你会抱怨,你永远也不会实现像上面那样的锁。也许你不会像上面一样调用**嵌套管程(内部监听器)**对象的`wait()`和`notify()`方法,当完全有可能会调用在外层的this对象上。(You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. )有很多类似上面的例子。例如,如果你需要实现一个公平锁。你可能希望每个线程在它们各自的QueueObject上调用`wait()`,这样就可以每次唤醒一个线程。 -Look at this naive implementation of a fair lock: +下面的公平锁实现: +``` //Fair Lock implementation with nested monitor lockout problem public class FairLock { @@ -112,13 +113,15 @@ public class FairLock { } } public class QueueObject {} +``` + At first glance this implementation may look fine, but notice how the lock() method calls queueObject.wait(); from inside two synchronized blocks. One synchronized on "this", and nested inside that, a block synchronized on the queueObject local variable. When a thread calls queueObject.wait()it releases the lock on the QueueObject instance, but not the lock associated with "this". Notice too, that the unlock() method is declared synchronized which equals a synchronized(this) block. This means, that if a thread is waiting inside lock() the monitor object associated with "this" will be locked by the waiting thread. All threads calling unlock() will remain blocked indefinately, waiting for the waiting thread to release the lock on "this". But this will never happen, since this only happens if a thread succeeds in sending a signal to the waiting thread, and this can only be sent by executing the unlock() method. And so, the FairLock implementation from above could lead to nested monitor lockout. A better implementation of a fair lock is described in the text Starvation and Fairness. -Nested Monitor Lockout vs. Deadlock +##嵌套管程锁死 vs 死锁(Nested Monitor Lockout vs. Deadlock) The result of nested monitor lockout and deadlock are pretty much the same: The threads involved end up blocked forever waiting for each other. From 664010dc044fcc4b56f20174f712d9b75f071490 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:22:58 +0800 Subject: [PATCH 209/524] Published with https://stackedit.io/ --- ...7\347\256\241\347\250\213\351\224\201\346\255\273.md" | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" index a3cd6f3..63f1351 100644 --- "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -127,10 +127,7 @@ The result of nested monitor lockout and deadlock are pretty much the same: The The two situations are not equal though. As explained in the text on Deadlock a deadlock occurs when two threads obtain locks in different order. Thread 1 locks A, waits for B. Thread 2 has locked B, and now waits for A. As explained in the text on Deadlock Prevention deadlocks can be avoided by always locking the locks in the same order (Lock Ordering). However, a nested monitor lockout occurs exactly by two threads taking the locks in the same order. Thread 1 locks A and B, then releases B and waits for a signal from Thread 2. Thread 2 needs both A and B to send Thread 1 the signal. So, one thread is waiting for a signal, and another for a lock to be released. -The difference is summed up here: +两者的不同点如下: -In deadlock, two threads are waiting for each other to release locks. - -In nested monitor lockout, Thread 1 is holding a lock A, and waits -for a signal from Thread 2. Thread 2 needs the lock A to send the -signal to Thread 1. +* 在死锁中,两个线程互相等待对方释放锁。 +* 在嵌套管程锁死中,线程1持有锁A,并等待线程2的信号,而线程2需要锁A才能够发送信号给线程1. \ No newline at end of file From e55f75994352d199fb4e05b5b703796f79445159 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:24:53 +0800 Subject: [PATCH 210/524] Published with https://stackedit.io/ --- ...va\344\270\255\347\232\204\351\224\201.md" | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 "Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" new file mode 100644 index 0000000..0cbb74a --- /dev/null +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -0,0 +1,169 @@ +#Java中的锁 + +A lock is a thread synchronization mechanism like synchronized blocks except locks can be more sophisticated than Java's synchronized blocks. Locks (and other more advanced synchronization mechanisms) are created using synchronized blocks, so it is not like we can get totally rid of the synchronized keyword. + +From Java 5 the package java.util.concurrent.locks contains several lock implementations, so you may not have to implement your own locks. But you will still need to know how to use them, and it can still be useful to know the theory behind their implementation. For more details, see my tutorial on the java.util.concurrent.locks.Lock interface. + +A Simple Lock + +Let's start out by looking at a synchronized block of Java code: + +public class Counter{ + + private int count = 0; + + public int inc(){ + synchronized(this){ + return ++count; + } + } +} +Notice the synchronized(this) block in the inc() method. This block makes sure that only one thread can execute the return ++count at a time. The code in the synchronized block could have been more advanced, but the simple ++count suffices to get the point across. + +The Counter class could have been written like this instead, using a Lock instead of a synchronized block: + +public class Counter{ + + private Lock lock = new Lock(); + private int count = 0; + + public int inc(){ + lock.lock(); + int newCount = ++count; + lock.unlock(); + return newCount; + } +} +The lock() method locks the Lock instance so that all threads calling lock() are blocked until unlock() is executed. + +Here is a simple Lock implementation: + +public class Lock{ + + private boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + wait(); + } + isLocked = true; + } + + public synchronized void unlock(){ + isLocked = false; + notify(); + } +} +Notice the while(isLocked) loop, which is also called a "spin lock". Spin locks and the methods wait() and notify() are covered in more detail in the text Thread Signaling. While isLocked is true, the thread calling lock() is parked waiting in the wait() call. In case the thread should return unexpectedly from the wait() call without having received a notify() call (AKA a Spurious Wakeup) the thread re-checks the isLocked condition to see if it is safe to proceed or not, rather than just assume that being awakened means it is safe to proceed. If isLocked is false, the thread exits the while(isLocked) loop, and sets isLocked back to true, to lock the Lock instance for other threads calling lock(). + +When the thread is done with the code in the critical section (the code between lock() and unlock()), the thread calls unlock(). Executing unlock() sets isLocked back to false, and notifies (awakens) one of the threads waiting in the wait() call in the lock() method, if any. + +Lock Reentrance + +Synchronized blocks in Java are reentrant. This means, that if a Java thread enters a synchronized block of code, and thereby take the lock on the monitor object the block is synchronized on, the thread can enter other Java code blocks synchronized on the same monitor object. Here is an example: + +public class Reentrant{ + + public synchronized outer(){ + inner(); + } + + public synchronized inner(){ + //do something + } +} +Notice how both outer() and inner() are declared synchronized, which in Java is equivalent to a synchronized(this) block. If a thread calls outer() there is no problem calling inner() from inside outer(), since both methods (or blocks) are synchronized on the same monitor object ("this"). If a thread already holds the lock on a monitor object, it has access to all blocks synchronized on the same monitor object. This is called reentrance. The thread can reenter any block of code for which it already holds the lock. + +The lock implementation shown earlier is not reentrant. If we rewrite the Reentrant class like below, the thread calling outer() will be blocked inside the lock.lock() in the inner() method. + +public class Reentrant2{ + + Lock lock = new Lock(); + + public outer(){ + lock.lock(); + inner(); + lock.unlock(); + } + + public synchronized inner(){ + lock.lock(); + //do something + lock.unlock(); + } +} +A thread calling outer() will first lock the Lock instance. Then it will call inner(). Inside the inner() method the thread will again try to lock the Lock instance. This will fail (meaning the thread will be blocked), since the Lock instance was locked already in the outer() method. + +The reason the thread will be blocked the second time it calls lock() without having called unlock() in between, is apparent when we look at the lock() implementation: + +public class Lock{ + + boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + wait(); + } + isLocked = true; + } + + ... +} +It is the condition inside the while loop (spin lock) that determines if a thread is allowed to exit the lock() method or not. Currently the condition is that isLocked must be false for this to be allowed, regardless of what thread locked it. + +To make the Lock class reentrant we need to make a small change: + +public class Lock{ + + boolean isLocked = false; + Thread lockedBy = null; + int lockedCount = 0; + + public synchronized void lock() + throws InterruptedException{ + Thread callingThread = Thread.currentThread(); + while(isLocked && lockedBy != callingThread){ + wait(); + } + isLocked = true; + lockedCount++; + lockedBy = callingThread; + } + + + public synchronized void unlock(){ + if(Thread.curentThread() == this.lockedBy){ + lockedCount--; + + if(lockedCount == 0){ + isLocked = false; + notify(); + } + } + } + + ... +} +Notice how the while loop (spin lock) now also takes the thread that locked the Lock instance into consideration. If either the lock is unlocked (isLocked = false) or the calling thread is the thread that locked the Lock instance, the while loop will not execute, and the thread calling lock() will be allowed to exit the method. + +Additionally, we need to count the number of times the lock has been locked by the same thread. Otherwise, a single call to unlock() will unlock the lock, even if the lock has been locked multiple times. We don't want the lock to be unloced until the thread that locked it, has executed the same amount of unlock() calls as lock() calls. + +The Lock class is now reentrant. + +Lock Fairness + +Java's synchronized blocks makes no guarantees about the sequence in which threads trying to enter them are granted access. Therefore, if many threads are constantly competing for access to the same synchronized block, there is a risk that one or more of the threads are never granted access - that access is always granted to other threads. This is called starvation. To avoid this a Lock should be fair. Since the Lock implementations shown in this text uses synchronized blocks internally, they do not guarantee fairness. Starvation and fairness are discussed in more detail in the text Starvation and Fairness. + +Calling unlock() From a finally-clause + +When guarding a critical section with a Lock, and the critical section may throw exceptions, it is important to call the unlock() method from inside a finally-clause. Doing so makes sure that the Lock is unlocked so other threads can lock it. Here is an example: + +lock.lock(); +try{ + //do critical section code, which may throw exception +} finally { + lock.unlock(); +} +This little construct makes sure that the Lock is unlocked in case an exception is thrown from the code in the critical section. If unlock() was not called from inside a finally-clause, and an exception was thrown from the critical section, the Lock would remain locked forever, causing all threads calling lock() on that Lock instance to halt indefinately. \ No newline at end of file From f28fad65d0aa233af15473d6717fe1556e74e88d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:25:52 +0800 Subject: [PATCH 211/524] Published with https://stackedit.io/ From 9bedb38bf1a0f03b9d9e55d4624a0d6193a6fe48 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:26:40 +0800 Subject: [PATCH 212/524] =?UTF-8?q?Delete=2015Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E9=94=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...va\344\270\255\347\232\204\351\224\201.md" | 169 ------------------ 1 file changed, 169 deletions(-) delete mode 100644 "Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" diff --git "a/Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" deleted file mode 100644 index 0cbb74a..0000000 --- "a/Java-Concurrency/15Java\344\270\255\347\232\204\351\224\201.md" +++ /dev/null @@ -1,169 +0,0 @@ -#Java中的锁 - -A lock is a thread synchronization mechanism like synchronized blocks except locks can be more sophisticated than Java's synchronized blocks. Locks (and other more advanced synchronization mechanisms) are created using synchronized blocks, so it is not like we can get totally rid of the synchronized keyword. - -From Java 5 the package java.util.concurrent.locks contains several lock implementations, so you may not have to implement your own locks. But you will still need to know how to use them, and it can still be useful to know the theory behind their implementation. For more details, see my tutorial on the java.util.concurrent.locks.Lock interface. - -A Simple Lock - -Let's start out by looking at a synchronized block of Java code: - -public class Counter{ - - private int count = 0; - - public int inc(){ - synchronized(this){ - return ++count; - } - } -} -Notice the synchronized(this) block in the inc() method. This block makes sure that only one thread can execute the return ++count at a time. The code in the synchronized block could have been more advanced, but the simple ++count suffices to get the point across. - -The Counter class could have been written like this instead, using a Lock instead of a synchronized block: - -public class Counter{ - - private Lock lock = new Lock(); - private int count = 0; - - public int inc(){ - lock.lock(); - int newCount = ++count; - lock.unlock(); - return newCount; - } -} -The lock() method locks the Lock instance so that all threads calling lock() are blocked until unlock() is executed. - -Here is a simple Lock implementation: - -public class Lock{ - - private boolean isLocked = false; - - public synchronized void lock() - throws InterruptedException{ - while(isLocked){ - wait(); - } - isLocked = true; - } - - public synchronized void unlock(){ - isLocked = false; - notify(); - } -} -Notice the while(isLocked) loop, which is also called a "spin lock". Spin locks and the methods wait() and notify() are covered in more detail in the text Thread Signaling. While isLocked is true, the thread calling lock() is parked waiting in the wait() call. In case the thread should return unexpectedly from the wait() call without having received a notify() call (AKA a Spurious Wakeup) the thread re-checks the isLocked condition to see if it is safe to proceed or not, rather than just assume that being awakened means it is safe to proceed. If isLocked is false, the thread exits the while(isLocked) loop, and sets isLocked back to true, to lock the Lock instance for other threads calling lock(). - -When the thread is done with the code in the critical section (the code between lock() and unlock()), the thread calls unlock(). Executing unlock() sets isLocked back to false, and notifies (awakens) one of the threads waiting in the wait() call in the lock() method, if any. - -Lock Reentrance - -Synchronized blocks in Java are reentrant. This means, that if a Java thread enters a synchronized block of code, and thereby take the lock on the monitor object the block is synchronized on, the thread can enter other Java code blocks synchronized on the same monitor object. Here is an example: - -public class Reentrant{ - - public synchronized outer(){ - inner(); - } - - public synchronized inner(){ - //do something - } -} -Notice how both outer() and inner() are declared synchronized, which in Java is equivalent to a synchronized(this) block. If a thread calls outer() there is no problem calling inner() from inside outer(), since both methods (or blocks) are synchronized on the same monitor object ("this"). If a thread already holds the lock on a monitor object, it has access to all blocks synchronized on the same monitor object. This is called reentrance. The thread can reenter any block of code for which it already holds the lock. - -The lock implementation shown earlier is not reentrant. If we rewrite the Reentrant class like below, the thread calling outer() will be blocked inside the lock.lock() in the inner() method. - -public class Reentrant2{ - - Lock lock = new Lock(); - - public outer(){ - lock.lock(); - inner(); - lock.unlock(); - } - - public synchronized inner(){ - lock.lock(); - //do something - lock.unlock(); - } -} -A thread calling outer() will first lock the Lock instance. Then it will call inner(). Inside the inner() method the thread will again try to lock the Lock instance. This will fail (meaning the thread will be blocked), since the Lock instance was locked already in the outer() method. - -The reason the thread will be blocked the second time it calls lock() without having called unlock() in between, is apparent when we look at the lock() implementation: - -public class Lock{ - - boolean isLocked = false; - - public synchronized void lock() - throws InterruptedException{ - while(isLocked){ - wait(); - } - isLocked = true; - } - - ... -} -It is the condition inside the while loop (spin lock) that determines if a thread is allowed to exit the lock() method or not. Currently the condition is that isLocked must be false for this to be allowed, regardless of what thread locked it. - -To make the Lock class reentrant we need to make a small change: - -public class Lock{ - - boolean isLocked = false; - Thread lockedBy = null; - int lockedCount = 0; - - public synchronized void lock() - throws InterruptedException{ - Thread callingThread = Thread.currentThread(); - while(isLocked && lockedBy != callingThread){ - wait(); - } - isLocked = true; - lockedCount++; - lockedBy = callingThread; - } - - - public synchronized void unlock(){ - if(Thread.curentThread() == this.lockedBy){ - lockedCount--; - - if(lockedCount == 0){ - isLocked = false; - notify(); - } - } - } - - ... -} -Notice how the while loop (spin lock) now also takes the thread that locked the Lock instance into consideration. If either the lock is unlocked (isLocked = false) or the calling thread is the thread that locked the Lock instance, the while loop will not execute, and the thread calling lock() will be allowed to exit the method. - -Additionally, we need to count the number of times the lock has been locked by the same thread. Otherwise, a single call to unlock() will unlock the lock, even if the lock has been locked multiple times. We don't want the lock to be unloced until the thread that locked it, has executed the same amount of unlock() calls as lock() calls. - -The Lock class is now reentrant. - -Lock Fairness - -Java's synchronized blocks makes no guarantees about the sequence in which threads trying to enter them are granted access. Therefore, if many threads are constantly competing for access to the same synchronized block, there is a risk that one or more of the threads are never granted access - that access is always granted to other threads. This is called starvation. To avoid this a Lock should be fair. Since the Lock implementations shown in this text uses synchronized blocks internally, they do not guarantee fairness. Starvation and fairness are discussed in more detail in the text Starvation and Fairness. - -Calling unlock() From a finally-clause - -When guarding a critical section with a Lock, and the critical section may throw exceptions, it is important to call the unlock() method from inside a finally-clause. Doing so makes sure that the Lock is unlocked so other threads can lock it. Here is an example: - -lock.lock(); -try{ - //do critical section code, which may throw exception -} finally { - lock.unlock(); -} -This little construct makes sure that the Lock is unlocked in case an exception is thrown from the code in the critical section. If unlock() was not called from inside a finally-clause, and an exception was thrown from the critical section, the Lock would remain locked forever, causing all threads calling lock() on that Lock instance to halt indefinately. \ No newline at end of file From 68b79467ad7431fc8e9515357481434383935a63 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:30:45 +0800 Subject: [PATCH 213/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 0cbb74a..baecd34 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -4,7 +4,7 @@ A lock is a thread synchronization mechanism like synchronized blocks except loc From Java 5 the package java.util.concurrent.locks contains several lock implementations, so you may not have to implement your own locks. But you will still need to know how to use them, and it can still be useful to know the theory behind their implementation. For more details, see my tutorial on the java.util.concurrent.locks.Lock interface. -A Simple Lock +##简单锁(A Simple Lock) Let's start out by looking at a synchronized block of Java code: @@ -59,7 +59,7 @@ Notice the while(isLocked) loop, which is also called a "spin lock". Spin locks When the thread is done with the code in the critical section (the code between lock() and unlock()), the thread calls unlock(). Executing unlock() sets isLocked back to false, and notifies (awakens) one of the threads waiting in the wait() call in the lock() method, if any. -Lock Reentrance +##重得锁(Lock Reentrance) Synchronized blocks in Java are reentrant. This means, that if a Java thread enters a synchronized block of code, and thereby take the lock on the monitor object the block is synchronized on, the thread can enter other Java code blocks synchronized on the same monitor object. Here is an example: @@ -152,7 +152,7 @@ Additionally, we need to count the number of times the lock has been locked by t The Lock class is now reentrant. -Lock Fairness +## 公平锁(Lock Fairness) Java's synchronized blocks makes no guarantees about the sequence in which threads trying to enter them are granted access. Therefore, if many threads are constantly competing for access to the same synchronized block, there is a risk that one or more of the threads are never granted access - that access is always granted to other threads. This is called starvation. To avoid this a Lock should be fair. Since the Lock implementations shown in this text uses synchronized blocks internally, they do not guarantee fairness. Starvation and fairness are discussed in more detail in the text Starvation and Fairness. From 430da971873c6b8b4c955ab79605453ff8ffdf42 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:49:45 +0800 Subject: [PATCH 214/524] Published with https://stackedit.io/ --- ...va\344\270\255\347\232\204\351\224\201.md" | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index baecd34..067f04f 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -1,13 +1,14 @@ #Java中的锁 -A lock is a thread synchronization mechanism like synchronized blocks except locks can be more sophisticated than Java's synchronized blocks. Locks (and other more advanced synchronization mechanisms) are created using synchronized blocks, so it is not like we can get totally rid of the synchronized keyword. +**锁**跟**synchronized**的一样,是Java中的一种同步机制,但要比synchronized复杂得多。在Java 5之前,锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,我们还不能完全摆脱synchronized关键字。 -From Java 5 the package java.util.concurrent.locks contains several lock implementations, so you may not have to implement your own locks. But you will still need to know how to use them, and it can still be useful to know the theory behind their implementation. For more details, see my tutorial on the java.util.concurrent.locks.Lock interface. +在Java 5的`java.util.concurrent.locks`包有多种锁的实现,因此,你并不需要自己去实现锁。当你仍然需要知道如何使用它们以及了解它们的实现原理。 -##简单锁(A Simple Lock) +##一个简单的锁(A Simple Lock) -Let's start out by looking at a synchronized block of Java code: +让我们从一个简单的Java synchronized块开始: +```Java public class Counter{ private int count = 0; @@ -18,10 +19,13 @@ public class Counter{ } } } -Notice the synchronized(this) block in the inc() method. This block makes sure that only one thread can execute the return ++count at a time. The code in the synchronized block could have been more advanced, but the simple ++count suffices to get the point across. +``` -The Counter class could have been written like this instead, using a Lock instead of a synchronized block: +注意`inc()`方法中的`synchronized(this)`块,这个块每次只允许一个线程进入执行`return ++count`代码。 +Counter类可以用Lock类来实现同样的功能: + +```Java public class Counter{ private Lock lock = new Lock(); @@ -34,12 +38,14 @@ public class Counter{ return newCount; } } -The lock() method locks the Lock instance so that all threads calling lock() are blocked until unlock() is executed. +``` -Here is a simple Lock implementation: +`lock()`方法会对Lock对象进行加锁,其他的线程都会在这个方法上阻塞,执行`unlock()`方法被调用。 -public class Lock{ +下面是一个简单Lock类的实现: +```Java +public class Lock{ private boolean isLocked = false; public synchronized void lock() @@ -55,6 +61,8 @@ public class Lock{ notify(); } } +``` + Notice the while(isLocked) loop, which is also called a "spin lock". Spin locks and the methods wait() and notify() are covered in more detail in the text Thread Signaling. While isLocked is true, the thread calling lock() is parked waiting in the wait() call. In case the thread should return unexpectedly from the wait() call without having received a notify() call (AKA a Spurious Wakeup) the thread re-checks the isLocked condition to see if it is safe to proceed or not, rather than just assume that being awakened means it is safe to proceed. If isLocked is false, the thread exits the while(isLocked) loop, and sets isLocked back to true, to lock the Lock instance for other threads calling lock(). When the thread is done with the code in the critical section (the code between lock() and unlock()), the thread calls unlock(). Executing unlock() sets isLocked back to false, and notifies (awakens) one of the threads waiting in the wait() call in the lock() method, if any. From df8cce2968c56601be88295a143d954fd9499352 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 15:51:16 +0800 Subject: [PATCH 215/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 067f04f..49abb89 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -48,8 +48,7 @@ public class Counter{ public class Lock{ private boolean isLocked = false; - public synchronized void lock() - throws InterruptedException{ + public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } From 4c639687eeec1741442c8c4cef56337026aad1cc Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 16:22:47 +0800 Subject: [PATCH 216/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 49abb89..9302431 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -62,7 +62,9 @@ public class Lock{ } ``` -Notice the while(isLocked) loop, which is also called a "spin lock". Spin locks and the methods wait() and notify() are covered in more detail in the text Thread Signaling. While isLocked is true, the thread calling lock() is parked waiting in the wait() call. In case the thread should return unexpectedly from the wait() call without having received a notify() call (AKA a Spurious Wakeup) the thread re-checks the isLocked condition to see if it is safe to proceed or not, rather than just assume that being awakened means it is safe to proceed. If isLocked is false, the thread exits the while(isLocked) loop, and sets isLocked back to true, to lock the Lock instance for other threads calling lock(). +注意`while(isLocked)`这个循环,我们称之为** 自旋锁**。自旋锁、wait方法和notify方法,我们在线程通信一文已经介绍过。当isLocked为true时,调用`lock()`方法的线程会嵌入等待状态。为了防止线程**虚假唤醒**(没调用notify()却无缘无故唤醒),将isLock作为循环的判断条件,如果线程虚假唤醒,则由于isLocked为true,则会再次调用`wait()`进入等待状态。当isLocked为false时,线程会离开while循环,将isLocked设置为true并锁住Lock对象。 + + When the thread is done with the code in the critical section (the code between lock() and unlock()), the thread calls unlock(). Executing unlock() sets isLocked back to false, and notifies (awakens) one of the threads waiting in the wait() call in the lock() method, if any. From ac99530c2de3367acf4afedaf85da2fe51903adc Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 16:31:42 +0800 Subject: [PATCH 217/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 9302431..01e7502 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -64,9 +64,8 @@ public class Lock{ 注意`while(isLocked)`这个循环,我们称之为** 自旋锁**。自旋锁、wait方法和notify方法,我们在线程通信一文已经介绍过。当isLocked为true时,调用`lock()`方法的线程会嵌入等待状态。为了防止线程**虚假唤醒**(没调用notify()却无缘无故唤醒),将isLock作为循环的判断条件,如果线程虚假唤醒,则由于isLocked为true,则会再次调用`wait()`进入等待状态。当isLocked为false时,线程会离开while循环,将isLocked设置为true并锁住Lock对象。 - - -When the thread is done with the code in the critical section (the code between lock() and unlock()), the thread calls unlock(). Executing unlock() sets isLocked back to false, and notifies (awakens) one of the threads waiting in the wait() call in the lock() method, if any. +当线程执行玩**临界区**(lock方法和unlock方法之间的代码)的代码后 +,线程调用`unlock()`方法,将isLocked设置为`false`,同时调用`notify()`方法唤醒在`lock()`方法中陷入等待的其中一个线程。 ##重得锁(Lock Reentrance) From 1aeb838a0e81a4d2842ba53b1b8b33ac76f4deb5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:01:45 +0800 Subject: [PATCH 218/524] Published with https://stackedit.io/ --- ...va\344\270\255\347\232\204\351\224\201.md" | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 01e7502..7cdcbe1 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -67,12 +67,12 @@ public class Lock{ 当线程执行玩**临界区**(lock方法和unlock方法之间的代码)的代码后 ,线程调用`unlock()`方法,将isLocked设置为`false`,同时调用`notify()`方法唤醒在`lock()`方法中陷入等待的其中一个线程。 -##重得锁(Lock Reentrance) +##锁的可重入性(Lock Reentrance) -Synchronized blocks in Java are reentrant. This means, that if a Java thread enters a synchronized block of code, and thereby take the lock on the monitor object the block is synchronized on, the thread can enter other Java code blocks synchronized on the same monitor object. Here is an example: +Java中的`synchronized`块是可重入的,意思是,当一个线程进入了一个`synchronized`块并持有该监听器对象的锁后,这个线程可以进入其他的基于这个监听器对象的`synchronized`块。例如下面这个例子: +```Java public class Reentrant{ - public synchronized outer(){ inner(); } @@ -81,12 +81,14 @@ public class Reentrant{ //do something } } -Notice how both outer() and inner() are declared synchronized, which in Java is equivalent to a synchronized(this) block. If a thread calls outer() there is no problem calling inner() from inside outer(), since both methods (or blocks) are synchronized on the same monitor object ("this"). If a thread already holds the lock on a monitor object, it has access to all blocks synchronized on the same monitor object. This is called reentrance. The thread can reenter any block of code for which it already holds the lock. +``` -The lock implementation shown earlier is not reentrant. If we rewrite the Reentrant class like below, the thread calling outer() will be blocked inside the lock.lock() in the inner() method. +注意`outer()` 方法和`inner()`方法都用了**synchronized**关键字声明(等同于synchronized(this){}同步块)。如果一个线程成功进入`outer()` 方法后,也可以顺利成章地成功进入`inner()`方法,因为两个同步方法的监听器对象都是**this**对象。如果一个方法持有一个监听器对象的锁,则它可以任意进入基于这个监听器对象的同步块。这称之为**重入性**。 -public class Reentrant2{ +我们之前所实现的Lock类没不具有**可重入性**。如果我们将Reentrant类按照下面一样进行重构,调用`outer()`方法的线程将会陷入阻塞。 +```Java +public class Reentrant2{ Lock lock = new Lock(); public outer(){ @@ -101,16 +103,18 @@ public class Reentrant2{ lock.unlock(); } } -A thread calling outer() will first lock the Lock instance. Then it will call inner(). Inside the inner() method the thread will again try to lock the Lock instance. This will fail (meaning the thread will be blocked), since the Lock instance was locked already in the outer() method. +``` + +调用`outer()`方法的线程首先获得Lock实例的锁,然后调用`inner()` 方法。在`inner()`方法内部会再次调用同一个Lock实例的`lock()`方法。由于此时isLocked为true,则它将进入`while(isLocked)`内部并调`this.wait()`而进入阻塞状态。 -The reason the thread will be blocked the second time it calls lock() without having called unlock() in between, is apparent when we look at the lock() implementation: +让我们在看下Lock类的实现: +```Java public class Lock{ boolean isLocked = false; - public synchronized void lock() - throws InterruptedException{ + public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } @@ -119,6 +123,10 @@ public class Lock{ ... } +``` + + + It is the condition inside the while loop (spin lock) that determines if a thread is allowed to exit the lock() method or not. Currently the condition is that isLocked must be false for this to be allowed, regardless of what thread locked it. To make the Lock class reentrant we need to make a small change: From 0873398e0f976a9fc26415060cfae58eb0e7e529 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:07:30 +0800 Subject: [PATCH 219/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 7cdcbe1..1a954b3 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -125,12 +125,11 @@ public class Lock{ } ``` +问题在于while循环的判断,当同一个线程第一次调用`lock()`方法时,isLocked为true,当它再次调用`lock()` 方法时,则会进入while循环内部并调用wait()方法而阻塞。 +为了让Lock类具有可重入性的特征,我们需要对它进行小小修改: -It is the condition inside the while loop (spin lock) that determines if a thread is allowed to exit the lock() method or not. Currently the condition is that isLocked must be false for this to be allowed, regardless of what thread locked it. - -To make the Lock class reentrant we need to make a small change: - +```Java public class Lock{ boolean isLocked = false; @@ -162,6 +161,10 @@ public class Lock{ ... } +``` + + + Notice how the while loop (spin lock) now also takes the thread that locked the Lock instance into consideration. If either the lock is unlocked (isLocked = false) or the calling thread is the thread that locked the Lock instance, the while loop will not execute, and the thread calling lock() will be allowed to exit the method. Additionally, we need to count the number of times the lock has been locked by the same thread. Otherwise, a single call to unlock() will unlock the lock, even if the lock has been locked multiple times. We don't want the lock to be unloced until the thread that locked it, has executed the same amount of unlock() calls as lock() calls. From e1100c3400c939e6ed775d063a60d0efdd71953e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:08:59 +0800 Subject: [PATCH 220/524] Published with https://stackedit.io/ From 32e906600fb65ee69d88b24ecb6d29db4a634c65 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:09:41 +0800 Subject: [PATCH 221/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 1a954b3..5ccf894 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -83,7 +83,7 @@ public class Reentrant{ } ``` -注意`outer()` 方法和`inner()`方法都用了**synchronized**关键字声明(等同于synchronized(this){}同步块)。如果一个线程成功进入`outer()` 方法后,也可以顺利成章地成功进入`inner()`方法,因为两个同步方法的监听器对象都是**this**对象。如果一个方法持有一个监听器对象的锁,则它可以任意进入基于这个监听器对象的同步块。这称之为**重入性**。 +注意`outer()` 方法和`inner()`方法都用了 **synchronized** 关键字声明(等同于synchronized(this){}同步块)。如果一个线程成功进入`outer()` 方法后,也可以顺利成章地成功进入`inner()`方法,因为两个同步方法的监听器对象都是 **this** 对象。如果一个方法持有一个监听器对象的锁,则它可以任意进入基于这个监听器对象的同步块。这称之为**重入性**。 我们之前所实现的Lock类没不具有**可重入性**。如果我们将Reentrant类按照下面一样进行重构,调用`outer()`方法的线程将会陷入阻塞。 From b31e1d7280096b86f5a7c20674e59060f3eda377 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:10:15 +0800 Subject: [PATCH 222/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 5ccf894..bc95e55 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -62,7 +62,7 @@ public class Lock{ } ``` -注意`while(isLocked)`这个循环,我们称之为** 自旋锁**。自旋锁、wait方法和notify方法,我们在线程通信一文已经介绍过。当isLocked为true时,调用`lock()`方法的线程会嵌入等待状态。为了防止线程**虚假唤醒**(没调用notify()却无缘无故唤醒),将isLock作为循环的判断条件,如果线程虚假唤醒,则由于isLocked为true,则会再次调用`wait()`进入等待状态。当isLocked为false时,线程会离开while循环,将isLocked设置为true并锁住Lock对象。 +注意`while(isLocked)`这个循环,我们称之为**自旋锁**。自旋锁、wait方法和notify方法,我们在线程通信一文已经介绍过。当isLocked为true时,调用`lock()`方法的线程会嵌入等待状态。为了防止线程**虚假唤醒**(没调用notify()却无缘无故唤醒),将isLock作为循环的判断条件,如果线程虚假唤醒,则由于isLocked为true,则会再次调用`wait()`进入等待状态。当isLocked为false时,线程会离开while循环,将isLocked设置为true并锁住Lock对象。 当线程执行玩**临界区**(lock方法和unlock方法之间的代码)的代码后 ,线程调用`unlock()`方法,将isLocked设置为`false`,同时调用`notify()`方法唤醒在`lock()`方法中陷入等待的其中一个线程。 From ab83b83b2717757f521ca6b702e9633ada46a0ff Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:11:12 +0800 Subject: [PATCH 223/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index bc95e55..2c1c38c 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -131,13 +131,11 @@ public class Lock{ ```Java public class Lock{ - boolean isLocked = false; Thread lockedBy = null; int lockedCount = 0; - public synchronized void lock() - throws InterruptedException{ + public synchronized void lock() throws InterruptedException{ Thread callingThread = Thread.currentThread(); while(isLocked && lockedBy != callingThread){ wait(); From 36fd06778e2394fe6d44c6b8c2337031fe4203b8 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:22:30 +0800 Subject: [PATCH 224/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 2c1c38c..3daa78b 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -145,7 +145,6 @@ public class Lock{ lockedBy = callingThread; } - public synchronized void unlock(){ if(Thread.curentThread() == this.lockedBy){ lockedCount--; @@ -161,15 +160,13 @@ public class Lock{ } ``` +注意现在while循环添加了**当前线程是否与持有锁的线程一样**的判断。如果isLocked为false或者当前线程与持有锁的线程一样,则会绕过while循环,因此,即使连续调用两次`lock()`方法将不会再阻塞。 +除此之外,我们需要统计同一个线程调用`lock()`的次数。否则,线程线程在调用一次`unlock()`方法后将会释放锁,而不管之前调用了多少次`lock()`方法。在`unlock()`调用没有达到对应`lock()`调用的次数之前,我们不希望锁被释放。 -Notice how the while loop (spin lock) now also takes the thread that locked the Lock instance into consideration. If either the lock is unlocked (isLocked = false) or the calling thread is the thread that locked the Lock instance, the while loop will not execute, and the thread calling lock() will be allowed to exit the method. - -Additionally, we need to count the number of times the lock has been locked by the same thread. Otherwise, a single call to unlock() will unlock the lock, even if the lock has been locked multiple times. We don't want the lock to be unloced until the thread that locked it, has executed the same amount of unlock() calls as lock() calls. - -The Lock class is now reentrant. +现在,Lock类具有可重入性了。 -## 公平锁(Lock Fairness) +## 锁的公平性(Lock Fairness) Java's synchronized blocks makes no guarantees about the sequence in which threads trying to enter them are granted access. Therefore, if many threads are constantly competing for access to the same synchronized block, there is a risk that one or more of the threads are never granted access - that access is always granted to other threads. This is called starvation. To avoid this a Lock should be fair. Since the Lock implementations shown in this text uses synchronized blocks internally, they do not guarantee fairness. Starvation and fairness are discussed in more detail in the text Starvation and Fairness. From ebed3dec416d6dcd8f4310749fb90a1400010a22 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:29:59 +0800 Subject: [PATCH 225/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 3daa78b..c032e41 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -168,9 +168,9 @@ public class Lock{ ## 锁的公平性(Lock Fairness) -Java's synchronized blocks makes no guarantees about the sequence in which threads trying to enter them are granted access. Therefore, if many threads are constantly competing for access to the same synchronized block, there is a risk that one or more of the threads are never granted access - that access is always granted to other threads. This is called starvation. To avoid this a Lock should be fair. Since the Lock implementations shown in this text uses synchronized blocks internally, they do not guarantee fairness. Starvation and fairness are discussed in more detail in the text Starvation and Fairness. +Java的`synchronized`块并不保证进入同步块的线程顺序。因此,如果存在多个线程同时争用同一个同步块,那么将有某个或多个线程永远得不到进入同步块机会的危险。我们称之为**饥饿**。为了避免这种情况,我们需要保证锁的公平性。上面例子的Lock类是通过`synchronized`关键字实现的,在这里,它们并不能保证锁的公平性。 -Calling unlock() From a finally-clause +##在finally块中调用unlock方法(Calling unlock() From a finally-clause) When guarding a critical section with a Lock, and the critical section may throw exceptions, it is important to call the unlock() method from inside a finally-clause. Doing so makes sure that the Lock is unlocked so other threads can lock it. Here is an example: From 7994a27356be8939d797bc493e27a87ab57fd557 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 15 Sep 2014 17:31:10 +0800 Subject: [PATCH 226/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index c032e41..13b6b84 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -174,10 +174,13 @@ Java的`synchronized`块并不保证进入同步块的线程顺序。因此, When guarding a critical section with a Lock, and the critical section may throw exceptions, it is important to call the unlock() method from inside a finally-clause. Doing so makes sure that the Lock is unlocked so other threads can lock it. Here is an example: +```Java lock.lock(); try{ //do critical section code, which may throw exception } finally { lock.unlock(); } +``` + This little construct makes sure that the Lock is unlocked in case an exception is thrown from the code in the critical section. If unlock() was not called from inside a finally-clause, and an exception was thrown from the critical section, the Lock would remain locked forever, causing all threads calling lock() on that Lock instance to halt indefinately. \ No newline at end of file From 5b9e1a6eb94b96b25cb546b7d79f0f8217b22ba0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:08:12 +0800 Subject: [PATCH 227/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 13b6b84..713deba 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -1,4 +1,4 @@ -#Java中的锁 +#15.Java中的锁 **锁**跟**synchronized**的一样,是Java中的一种同步机制,但要比synchronized复杂得多。在Java 5之前,锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,我们还不能完全摆脱synchronized关键字。 From c4d220de14dc02942fb677973028fc80905e1213 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:15:00 +0800 Subject: [PATCH 228/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index 713deba..c79e48e 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -10,7 +10,6 @@ ```Java public class Counter{ - private int count = 0; public int inc(){ @@ -172,7 +171,7 @@ Java的`synchronized`块并不保证进入同步块的线程顺序。因此, ##在finally块中调用unlock方法(Calling unlock() From a finally-clause) -When guarding a critical section with a Lock, and the critical section may throw exceptions, it is important to call the unlock() method from inside a finally-clause. Doing so makes sure that the Lock is unlocked so other threads can lock it. Here is an example: +当使用锁来隔离临界区时,临界区的代码有可能抛出异常,所以把`unlock()`方法放入finally块中是非常有必要的,这样做可以保证无论发生什么`unlock()`方法总可以被调用: ```Java lock.lock(); @@ -183,4 +182,5 @@ try{ } ``` + This little construct makes sure that the Lock is unlocked in case an exception is thrown from the code in the critical section. If unlock() was not called from inside a finally-clause, and an exception was thrown from the critical section, the Lock would remain locked forever, causing all threads calling lock() on that Lock instance to halt indefinately. \ No newline at end of file From 3618f7a905c287defbb63d61da45a6f2f62b494e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:22:06 +0800 Subject: [PATCH 229/524] Published with https://stackedit.io/ --- .../15.Java\344\270\255\347\232\204\351\224\201.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" index c79e48e..67667bb 100644 --- "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" @@ -182,5 +182,4 @@ try{ } ``` - -This little construct makes sure that the Lock is unlocked in case an exception is thrown from the code in the critical section. If unlock() was not called from inside a finally-clause, and an exception was thrown from the critical section, the Lock would remain locked forever, causing all threads calling lock() on that Lock instance to halt indefinately. \ No newline at end of file +这个小小的结构改变可以保证当临界区的代码抛出异常时`unlock()`总可以被调用。当临界区代码抛出异常时,如果finally块中的`unlock()`方法没有被调用,那么Lock实例将永远被锁住,调用`lock()`方法的线程将陷入无止境的阻塞状态。 \ No newline at end of file From 36311da47c8480d4805bf1a6c4b917965bdf7861 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:24:01 +0800 Subject: [PATCH 230/524] Published with https://stackedit.io/ --- ...04\350\257\273\345\206\231\351\224\201.md" | 371 ++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 "Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" diff --git "a/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" new file mode 100644 index 0000000..a8da197 --- /dev/null +++ "b/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -0,0 +1,371 @@ +#16.Java中的读写锁 + +A read / write lock is more sophisticated lock than the Lock implementations shown in the text Locks in Java. Imagine you have an application that reads and writes some resource, but writing it is not done as much as reading it is. Two threads reading the same resource does not cause problems for each other, so multiple threads that want to read the resource are granted access at the same time, overlapping. But, if a single thread wants to write to the resource, no other reads nor writes must be in progress at the same time. To solve this problem of allowing multiple readers but only one writer, you will need a read / write lock. + +Java 5 comes with read / write lock implementations in the java.util.concurrent package. Even so, it may still be useful to know the theory behind their implementation. + +Read / Write Lock Java Implementation + +First let's summarize the conditions for getting read and write access to the resource: + +Read Access If no threads are writing, and no threads have requested write access. +Write Access If no threads are reading or writing. +If a thread wants to read the resource, it is okay as long as no threads are writing to it, and no threads have requested write access to the resource. By up-prioritizing write-access requests we assume that write requests are more important than read-requests. Besides, if reads are what happens most often, and we did not up-prioritize writes, starvation could occur. Threads requesting write access would be blocked until all readers had unlocked the ReadWriteLock. If new threads were constantly granted read access the thread waiting for write access would remain blocked indefinately, resulting in starvation. Therefore a thread can only be granted read access if no thread has currently locked the ReadWriteLock for writing, or requested it locked for writing. + +A thread that wants write access to the resource can be granted so when no threads are reading nor writing to the resource. It doesn't matter how many threads have requested write access or in what sequence, unless you want to guarantee fairness between threads requesting write access. + +With these simple rules in mind we can implement a ReadWriteLock as shown below: + +public class ReadWriteLock{ + + private int readers = 0; + private int writers = 0; + private int writeRequests = 0; + + public synchronized void lockRead() throws InterruptedException{ + while(writers > 0 || writeRequests > 0){ + wait(); + } + readers++; + } + + public synchronized void unlockRead(){ + readers--; + notifyAll(); + } + + public synchronized void lockWrite() throws InterruptedException{ + writeRequests++; + + while(readers > 0 || writers > 0){ + wait(); + } + writeRequests--; + writers++; + } + + public synchronized void unlockWrite() throws InterruptedException{ + writers--; + notifyAll(); + } +} +The ReadWriteLock has two lock methods and two unlock methods. One lock and unlock method for read access and one lock and unlock for write access. + +The rules for read access are implemented in the lockRead() method. All threads get read access unless there is a thread with write access, or one or more threads have requested write access. + +The rules for write access are implemented in the lockWrite() method. A thread that wants write access starts out by requesting write access (writeRequests++). Then it will check if it can actually get write access. A thread can get write access if there are no threads with read access to the resource, and no threads with write access to the resource. How many threads have requested write access doesn't matter. + +It is worth noting that both unlockRead() and unlockWrite() calls notifyAll() rather than notify(). To explain why that is, imagine the following situation: + +Inside the ReadWriteLock there are threads waiting for read access, and threads waiting for write access. If a thread awakened by notify() was a read access thread, it would be put back to waiting because there are threads waiting for write access. However, none of the threads awaiting write access are awakened, so nothing more happens. No threads gain neither read nor write access. By calling noftifyAll() all waiting threads are awakened and check if they can get the desired access. + +Calling notifyAll() also has another advantage. If multiple threads are waiting for read access and none for write access, and unlockWrite() is called, all threads waiting for read access are granted read access at once - not one by one. + +Read / Write Lock Reentrance + +The ReadWriteLock class shown earlier is not reentrant. If a thread that has write access requests it again, it will block because there is already one writer - itself. Furthermore, consider this case: + +Thread 1 gets read access. + +Thread 2 requests write access but is blocked because there is one reader. + +Thread 1 re-requests read access (re-enters the lock), but is blocked because there is a write request +In this situation the previous ReadWriteLock would lock up - a situation similar to deadlock. No threads requesting neither read nor write access would be granted so. + +To make the ReadWriteLock reentrant it is necessary to make a few changes. Reentrance for readers and writers will be dealt with separately. + +Read Reentrance + +To make the ReadWriteLock reentrant for readers we will first establish the rules for read reentrance: + +A thread is granted read reentrance if it can get read access (no writers or write requests), or if it already has read access (regardless of write requests). +To determine if a thread has read access already a reference to each thread granted read access is kept in a Map along with how many times it has acquired read lock. When determing if read access can be granted this Map will be checked for a reference to the calling thread. Here is how the lockRead() and unlockRead() methods looks after that change: + +public class ReadWriteLock{ + + private Map readingThreads = + new HashMap(); + + private int writers = 0; + private int writeRequests = 0; + + public synchronized void lockRead() throws InterruptedException{ + Thread callingThread = Thread.currentThread(); + while(! canGrantReadAccess(callingThread)){ + wait(); + } + + readingThreads.put(callingThread, + (getAccessCount(callingThread) + 1)); + } + + + public synchronized void unlockRead(){ + Thread callingThread = Thread.currentThread(); + int accessCount = getAccessCount(callingThread); + if(accessCount == 1){ readingThreads.remove(callingThread); } + else { readingThreads.put(callingThread, (accessCount -1)); } + notifyAll(); + } + + + private boolean canGrantReadAccess(Thread callingThread){ + if(writers > 0) return false; + if(isReader(callingThread) return true; + if(writeRequests > 0) return false; + return true; + } + + private int getReadAccessCount(Thread callingThread){ + Integer accessCount = readingThreads.get(callingThread); + if(accessCount == null) return 0; + return accessCount.intValue(); + } + + private boolean isReader(Thread callingThread){ + return readingThreads.get(callingThread) != null; + } + +} +As you can see read reentrance is only granted if no threads are currently writing to the resource. Additionally, if the calling thread already has read access this takes precedence over any writeRequests. + +Write Reentrance + +Write reentrance is granted only if the thread has already write access. Here is how the lockWrite() and unlockWrite() methods look after that change: + +public class ReadWriteLock{ + + private Map readingThreads = + new HashMap(); + + private int writeAccesses = 0; + private int writeRequests = 0; + private Thread writingThread = null; + + public synchronized void lockWrite() throws InterruptedException{ + writeRequests++; + Thread callingThread = Thread.currentThread(); + while(! canGrantWriteAccess(callingThread)){ + wait(); + } + writeRequests--; + writeAccesses++; + writingThread = callingThread; + } + + public synchronized void unlockWrite() throws InterruptedException{ + writeAccesses--; + if(writeAccesses == 0){ + writingThread = null; + } + notifyAll(); + } + + private boolean canGrantWriteAccess(Thread callingThread){ + if(hasReaders()) return false; + if(writingThread == null) return true; + if(!isWriter(callingThread)) return false; + return true; + } + + private boolean hasReaders(){ + return readingThreads.size() > 0; + } + + private boolean isWriter(Thread callingThread){ + return writingThread == callingThread; + } +} +Notice how the thread currently holding the write lock is now taken into account when determining if the calling thread can get write access. + +Read to Write Reentrance + +Sometimes it is necessary for a thread that have read access to also obtain write access. For this to be allowed the thread must be the only reader. To achieve this the writeLock() method should be changed a bit. Here is what it would look like: + +public class ReadWriteLock{ + + private Map readingThreads = + new HashMap(); + + private int writeAccesses = 0; + private int writeRequests = 0; + private Thread writingThread = null; + + public synchronized void lockWrite() throws InterruptedException{ + writeRequests++; + Thread callingThread = Thread.currentThread(); + while(! canGrantWriteAccess(callingThread)){ + wait(); + } + writeRequests--; + writeAccesses++; + writingThread = callingThread; + } + + public synchronized void unlockWrite() throws InterruptedException{ + writeAccesses--; + if(writeAccesses == 0){ + writingThread = null; + } + notifyAll(); + } + + private boolean canGrantWriteAccess(Thread callingThread){ + if(isOnlyReader(callingThread)) return true; + if(hasReaders()) return false; + if(writingThread == null) return true; + if(!isWriter(callingThread)) return false; + return true; + } + + private boolean hasReaders(){ + return readingThreads.size() > 0; + } + + private boolean isWriter(Thread callingThread){ + return writingThread == callingThread; + } + + private boolean isOnlyReader(Thread thread){ + return readers == 1 && readingThreads.get(callingThread) != null; + } + +} +Now the ReadWriteLock class is read-to-write access reentrant. + +Write to Read Reentrance + +Sometimes a thread that has write access needs read access too. A writer should always be granted read access if requested. If a thread has write access no other threads can have read nor write access, so it is not dangerous. Here is how the canGrantReadAccess() method will look with that change: + +public class ReadWriteLock{ + + private boolean canGrantReadAccess(Thread callingThread){ + if(isWriter(callingThread)) return true; + if(writingThread != null) return false; + if(isReader(callingThread) return true; + if(writeRequests > 0) return false; + return true; + } + +} +Fully Reentrant ReadWriteLock + +Below is the fully reentran ReadWriteLock implementation. I have made a few refactorings to the access conditions to make them easier to read, and thereby easier to convince yourself that they are correct. + +public class ReadWriteLock{ + + private Map readingThreads = + new HashMap(); + + private int writeAccesses = 0; + private int writeRequests = 0; + private Thread writingThread = null; + + + public synchronized void lockRead() throws InterruptedException{ + Thread callingThread = Thread.currentThread(); + while(! canGrantReadAccess(callingThread)){ + wait(); + } + + readingThreads.put(callingThread, + (getReadAccessCount(callingThread) + 1)); + } + + private boolean canGrantReadAccess(Thread callingThread){ + if( isWriter(callingThread) ) return true; + if( hasWriter() ) return false; + if( isReader(callingThread) ) return true; + if( hasWriteRequests() ) return false; + return true; + } + + + public synchronized void unlockRead(){ + Thread callingThread = Thread.currentThread(); + if(!isReader(callingThread)){ + throw new IllegalMonitorStateException("Calling Thread does not" + + " hold a read lock on this ReadWriteLock"); + } + int accessCount = getReadAccessCount(callingThread); + if(accessCount == 1){ readingThreads.remove(callingThread); } + else { readingThreads.put(callingThread, (accessCount -1)); } + notifyAll(); + } + + public synchronized void lockWrite() throws InterruptedException{ + writeRequests++; + Thread callingThread = Thread.currentThread(); + while(! canGrantWriteAccess(callingThread)){ + wait(); + } + writeRequests--; + writeAccesses++; + writingThread = callingThread; + } + + public synchronized void unlockWrite() throws InterruptedException{ + if(!isWriter(Thread.currentThread()){ + throw new IllegalMonitorStateException("Calling Thread does not" + + " hold the write lock on this ReadWriteLock"); + } + writeAccesses--; + if(writeAccesses == 0){ + writingThread = null; + } + notifyAll(); + } + + private boolean canGrantWriteAccess(Thread callingThread){ + if(isOnlyReader(callingThread)) return true; + if(hasReaders()) return false; + if(writingThread == null) return true; + if(!isWriter(callingThread)) return false; + return true; + } + + + private int getReadAccessCount(Thread callingThread){ + Integer accessCount = readingThreads.get(callingThread); + if(accessCount == null) return 0; + return accessCount.intValue(); + } + + + private boolean hasReaders(){ + return readingThreads.size() > 0; + } + + private boolean isReader(Thread callingThread){ + return readingThreads.get(callingThread) != null; + } + + private boolean isOnlyReader(Thread callingThread){ + return readingThreads.size() == 1 && + readingThreads.get(callingThread) != null; + } + + private boolean hasWriter(){ + return writingThread != null; + } + + private boolean isWriter(Thread callingThread){ + return writingThread == callingThread; + } + + private boolean hasWriteRequests(){ + return this.writeRequests > 0; + } + +} +Calling unlock() From a finally-clause + +When guarding a critical section with a ReadWriteLock, and the critical section may throw exceptions, it is important to call the readUnlock() and writeUnlock() methods from inside a finally-clause. Doing so makes sure that the ReadWriteLock is unlocked so other threads can lock it. Here is an example: + +lock.lockWrite(); +try{ + //do critical section code, which may throw exception +} finally { + lock.unlockWrite(); +} +This little construct makes sure that the ReadWriteLock is unlocked in case an exception is thrown from the code in the critical section. If unlockWrite() was not called from inside a finally-clause, and an exception was thrown from the critical section, the ReadWriteLock would remain write locked forever, causing all threads calling lockRead() or lockWrite() on that ReadWriteLock instance to halt indefinately. The only thing that could unlock the ReadWriteLockagain would be if the ReadWriteLock is reentrant, and the thread that had it locked when the exception was thrown, later succeeds in locking it, executing the critical section and calling unlockWrite() again afterwards. That would unlock the ReadWriteLock again. But why wait for that to happen, if it happens? Calling unlockWrite() from a finally-clause is a much more robust solution. \ No newline at end of file From 1d0273e330a993faab0b2be1bae14bf959800945 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:26:06 +0800 Subject: [PATCH 231/524] Published with https://stackedit.io/ --- ...2\204\350\257\273\345\206\231\351\224\201.md" | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index a8da197..1847413 100644 --- "a/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -1,10 +1,10 @@ -#16.Java中的读写锁 +#16.Java中的读/写锁 A read / write lock is more sophisticated lock than the Lock implementations shown in the text Locks in Java. Imagine you have an application that reads and writes some resource, but writing it is not done as much as reading it is. Two threads reading the same resource does not cause problems for each other, so multiple threads that want to read the resource are granted access at the same time, overlapping. But, if a single thread wants to write to the resource, no other reads nor writes must be in progress at the same time. To solve this problem of allowing multiple readers but only one writer, you will need a read / write lock. Java 5 comes with read / write lock implementations in the java.util.concurrent package. Even so, it may still be useful to know the theory behind their implementation. -Read / Write Lock Java Implementation +##Read / Write Lock Java Implementation First let's summarize the conditions for getting read and write access to the resource: @@ -61,7 +61,7 @@ Inside the ReadWriteLock there are threads waiting for read access, and threads Calling notifyAll() also has another advantage. If multiple threads are waiting for read access and none for write access, and unlockWrite() is called, all threads waiting for read access are granted read access at once - not one by one. -Read / Write Lock Reentrance +##Read / Write Lock Reentrance The ReadWriteLock class shown earlier is not reentrant. If a thread that has write access requests it again, it will block because there is already one writer - itself. Furthermore, consider this case: @@ -129,7 +129,7 @@ public class ReadWriteLock{ } As you can see read reentrance is only granted if no threads are currently writing to the resource. Additionally, if the calling thread already has read access this takes precedence over any writeRequests. -Write Reentrance +##Write Reentrance Write reentrance is granted only if the thread has already write access. Here is how the lockWrite() and unlockWrite() methods look after that change: @@ -178,7 +178,7 @@ public class ReadWriteLock{ } Notice how the thread currently holding the write lock is now taken into account when determining if the calling thread can get write access. -Read to Write Reentrance +##Read to Write Reentrance Sometimes it is necessary for a thread that have read access to also obtain write access. For this to be allowed the thread must be the only reader. To achieve this the writeLock() method should be changed a bit. Here is what it would look like: @@ -248,7 +248,8 @@ public class ReadWriteLock{ } } -Fully Reentrant ReadWriteLock + +##Fully Reentrant ReadWriteLock Below is the fully reentran ReadWriteLock implementation. I have made a few refactorings to the access conditions to make them easier to read, and thereby easier to convince yourself that they are correct. @@ -358,7 +359,8 @@ public class ReadWriteLock{ } } -Calling unlock() From a finally-clause + +##Calling unlock() From a finally-clause When guarding a critical section with a ReadWriteLock, and the critical section may throw exceptions, it is important to call the readUnlock() and writeUnlock() methods from inside a finally-clause. Doing so makes sure that the ReadWriteLock is unlocked so other threads can lock it. Here is an example: From 538b5bcb4d1c91d145db6f300a89da15877a3311 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:31:46 +0800 Subject: [PATCH 232/524] Published with https://stackedit.io/ --- ...15\345\205\245\351\224\201\346\255\273.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 "Java-Concurrency/17.\351\207\215\345\205\245\351\224\201\346\255\273.md" diff --git "a/Java-Concurrency/17.\351\207\215\345\205\245\351\224\201\346\255\273.md" "b/Java-Concurrency/17.\351\207\215\345\205\245\351\224\201\346\255\273.md" new file mode 100644 index 0000000..ff5a4c3 --- /dev/null +++ "b/Java-Concurrency/17.\351\207\215\345\205\245\351\224\201\346\255\273.md" @@ -0,0 +1,44 @@ +#17.重入锁死 + +Reentrance lockout is a situation similar to deadlock and nested monitor lockout. Reentrance lockout is also covered in part in the texts on Locks and Read / Write Locks. + +Reentrance lockout may occur if a thread reenters a Lock, ReadWriteLock or some other synchronizer that is not reentrant. Reentrant means that a thread that already holds a lock can retake it. Java's synchronized blocks are reentrant. Therefore the following code will work without problems: + +public class Reentrant{ + + public synchronized outer(){ + inner(); + } + + public synchronized inner(){ + //do something + } +} +Notice how both outer() and inner() are declared synchronized, which in Java is equivalent to a synchronized(this) block. If a thread calls outer() there is no problem calling inner() from inside outer(), since both methods (or blocks) are synchronized on the same monitor object ("this"). If a thread already holds the lock on a monitor object, it has access to all blocks synchronized on the same monitor object. This is called reentrance. The thread can reenter any block of code for which it already holds the lock. + +The following Lock implementation is not reentrant: + +public class Lock{ + + private boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + wait(); + } + isLocked = true; + } + + public synchronized void unlock(){ + isLocked = false; + notify(); + } +} +If a thread calls lock() twice without calling unlock() in between, the second call to lock() will block. A reentrance lockout has occurred. + +To avoid reentrance lockouts you have two options: + +Avoid writing code that reenters locks +Use reentrant locks +Which of these options suit your project best depends on your concrete situation. Reentrant locks often don't perform as well as non-reentrant locks, and they are harder to implement, but this may not necessary be a problem in your case. Whether or not your code is easier to implement with or without lock reentrance must be determined case by case. \ No newline at end of file From c2c823b96c8862f0def4a1b5f9d38b8c991332b1 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:36:21 +0800 Subject: [PATCH 233/524] =?UTF-8?q?Update=2008.Java=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=9D=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...va\345\220\214\346\255\245\345\235\227.md" | 139 ++++++++++-------- 1 file changed, 77 insertions(+), 62 deletions(-) diff --git "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" index 40668d6..dfbacd1 100644 --- "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" +++ "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -1,3 +1,18 @@ +Skip to content + This repository +Explore +Gist +Blog +Help +cokepluscarbon cokepluscarbon + +1 Unwatch + Star 0 + Fork 1cokepluscarbon/Java + branch: master Java / Java-Concurrency / 08.Java同步块 +cokepluscarboncokepluscarbon 3 days ago rename directory +1 contributor +184 lines (126 sloc) 7.719 kb RawBlameHistory #08.Java同步块 A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. @@ -20,7 +35,7 @@ Java中的同步块使用关键字**synchronized**进行标记**。同步块在J ##同步实例方法(Synchronized Instance Methods) -Here is a synchronized instance method: +下面是一个同步的实例方法: ```Java public synchronized void add(int value){ @@ -28,13 +43,13 @@ Here is a synchronized instance method: } ``` -Notice the use of the synchronized keyword in the method declaration. This tells Java that the method is synchronized. +使用**synchronized**关键字对方法进行声明,告诉JVM这是一个同步的方法。 -A synchronized instance method in Java is synchronized on the instance (object) owning the method. Thus, each instance has its synchronized methods synchronized on a different object: the owning instance. Only one thread can execute inside a synchronized instance method. If more than one instance exist, then one thread at a time can execute inside a synchronized instance method per instance. One thread per instance. +Java中的**同步实例方法是基于这个方法所属的实例对象上进行同步的**。因此,每一个同步实例方法都是基于各自的实例对象进行同步的。同一时间,只有一个线程可以访问一个实例对象的同步实例方法。如果有多个实例存在,那么每个线程都可以同时访问各自不同实例对象的同步实例方法,一个实例对象对应一个线程。 ##同步静态方法(Synchronized Static Methods) -Static methods are marked as synchronized just like instance methods using the synchronized keyword. Here is a Java synchronized static method example: +静态方法的同步与实例方法一致,都是使用**synchronized**在方法放进行声明。 ```Java public static synchronized void add(int value){ @@ -42,17 +57,17 @@ Static methods are marked as synchronized just like instance methods using the s } ``` -Also here the synchronized keyword tells Java that the method is synchronized. +同样的,这里的**synchronized**关键字用于告诉JVM这个静态方法是同步的。 -Synchronized static methods are synchronized on the class object of the class the synchronized static method belongs to. Since only one class object exists in the Java VM per class, only one thread can execute inside a static synchronized method in the same class. +**同步静态方法是基于这个静态方法所属的类对象进行同步的**。由于在JVM中,每个类有且只有一个类对象,因此,在同一时间内,只有一个线程能够访问同一个类的同步静态方法。 -If the static synchronized methods are located in different classes, then one thread can execute inside the static synchronized methods of each class. One thread per class regardless of which static synchronized method it calls. +如果同步静态方法位于不同的类中,那么每个线程都可以访问各自对应的类的同步静态方法,一个线程对应一个类。 ##实例方法中的同步块(Synchronized Blocks in Instance Methods) -You do not have to synchronize a whole method. Sometimes it is preferable to synchronize only part of a method. Java synchronized blocks inside methods makes this possible. +有些时候,你并不需要同步整一个方法,而只需要同步这个方法下的一小部分代码块。你可以在方法里面使用同步代码块。 -Here is a synchronized block of Java code inside an unsynchronized Java method: +下面这个例子就是在非同步方法里面使用了同步代码块: ```Java public void add(int value){ @@ -63,13 +78,13 @@ Here is a synchronized block of Java code inside an unsynchronized Java method: } ``` -This example uses the Java synchronized block construct to mark a block of code as synchronized. This code will now execute as if it was a synchronized method. +这个例子里,用了Java的同步代码块来使代码进行同步,让这个方法像同步方法一样执行。 -Notice how the Java synchronized block construct takes an object in parentheses. In the example "this" is used, which is the instance the add method is called on. The object taken in the parentheses by the synchronized construct is called a monitor object. The code is said to be synchronized on the monitor object. A synchronized instance method uses the object it belongs to as monitor object. +注意在Java的同步代码块里,需要在括号里传递一个对象。这个例子中,这个对象是**this**,this指的是这个实例对象本身。在Java同步代码块括号中的对象称为**监听器对象**。意味着,这个同步块是基于这个监听器对象进行同步的。同步实例方法使用其所在实例对象作为监听器对象。 -Only one thread can execute inside a Java code block synchronized on the same monitor object. +**同一时间,只有一个线程能够访问基于同一个监听器对象的同步代码。** -The following two examples are both synchronized on the instance they are called on. They are therefore equivalent with respect to synchronization: +下面这个例子,两个同步代码都是基于同一个实例对象进行同步的: ```Java public class MyClass { @@ -89,13 +104,13 @@ The following two examples are both synchronized on the instance they are called } ``` -Thus only a single thread can execute inside either of the two synchronized blocks in this example. +因此,在这个例子中,每次仅能有一个线程能够访问这两个同步代码的任意一个同步代码。 -Had the second synchronized block been synchronized on a different object than this, then one thread at a time had been able to execute inside each method. +如果第二个同步块是基于其他监听器对象,例如`synchronized (this.getClass()) {}`,则此时第一个和第二个同步代码的监听器对象分别为:当前实例对象和当前类对象。因此,这两个同步代码可以同时由不同的线程进行访问。 ##静态方法中的同步块(Synchronized Blocks in Static Methods) -Here are the same two examples as static methods. These methods are synchronized on the class object of the class the methods belong to: +下面这个例子中,两个同步代码都是基于当前的类对象进行同步的: ```Java public class MyClass { @@ -115,48 +130,47 @@ Here are the same two examples as static methods. These methods are synchronized } ``` -Only one thread can execute inside any of these two methods at the same time. +同一时间,只有一个线程能够访问这两个同步代码的任意一个同步代码。 + +如果第二个方法的监听器对象非MyClass.class对象,则两个同步代码可以同时被两个线程访问。 -Had the second synchronized block been synchronized on a different object than MyClass.class, then one thread could execute inside each method at the same time. ##Java同步示例(Java Synchronized Example) Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. ```Java - public class Counter{ - - long count = 0; - - public synchronized void add(long value){ - this.count += value; - } - } - public class CounterThread extends Thread{ - - protected Counter counter = null; - - public CounterThread(Counter counter){ - this.counter = counter; - } - - public void run() { - for(int i=0; i<10; i++){ - counter.add(i); - } - } - } - public class Example { - - public static void main(String[] args){ - Counter counter = new Counter(); - Thread threadA = new CounterThread(counter); - Thread threadB = new CounterThread(counter); - - threadA.start(); - threadB.start(); - } +public class Counter{ + long count = 0; + + public synchronized void add(long value){ + this.count += value; + } +} +public class CounterThread extends Thread{ + protected Counter counter = null; + + public CounterThread(Counter counter){ + this.counter = counter; + } + + public void run() { +for(int i=0; i<10; i++){ + counter.add(i); + } + } +} +public class Example { + + public static void main(String[] args){ + Counter counter = new Counter(); + Thread threadA = new CounterThread(counter); + Thread threadB = new CounterThread(counter); + + threadA.start(); + threadB.start(); } +} ``` Two threads are created. The same Counter instance is passed to both of them in their constructor. The Counter.add() method is synchronized on the instance, because the add method is an instance method, and marked as synchronized. Therefore only one of the threads can call the add() method at a time. The other thread will wait until the first thread leaves the add() method, before it can execute the method itself. @@ -164,22 +178,23 @@ Two threads are created. The same Counter instance is passed to both of them in If the two threads had referenced two separate Counter instances, there would have been no problems calling the add() methods simultaneously. The calls would have been to different objects, so the methods called would also be synchronized on different objects (the object owning the method). Therefore the calls would not block. Here is how that could look: ```Java - public class Example { - - public static void main(String[] args){ - Counter counterA = new Counter(); - Counter counterB = new Counter(); - Thread threadA = new CounterThread(counterA); - Thread threadB = new CounterThread(counterB); - - threadA.start(); - threadB.start(); - } +public class Example { + public static void main(String[] args){ + Counter counterA = new Counter(); + Counter counterB = new Counter(); + Thread threadA = new CounterThread(counterA); + Thread threadB = new CounterThread(counterB); + + threadA.start(); + threadB.start(); } +} ``` Notice how the two threads, threadA and threadB, no longer reference the same counter instance. The add method of counterA and counterB are synchronized on their two owning instances. Calling add() on counterA will thus not block a call to add() on counterB. ##Java Concurrency Utilities -The synchronized mechanism was Java's first mechanism for synchronizing access to objects shared by multiple threads. The synchronized mechanism isn't very advanced though. That is why Java 5 got a whole set of concurrency utility classes to help developers implement more fine grained concurrency control than what you get with synchronized. \ No newline at end of file +`synchronized`机制是Java第一个引进的用于同步多线程资源共享的机制。然而`synchroniez`机制并不高效。这就是为什么Java 5提供了一整套的并发工具类,以帮助开发人员实现更细粒度的并发控制 +。 +Status API Training Shop Blog About © 2014 GitHub, Inc. Terms Privacy Security Contact From 8252a3dc0637cd18a6e35b89ed2f4d180f6d9539 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:36:57 +0800 Subject: [PATCH 234/524] =?UTF-8?q?Update=2008.Java=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=9D=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...8.Java\345\220\214\346\255\245\345\235\227.md" | 15 --------------- 1 file changed, 15 deletions(-) diff --git "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" index dfbacd1..109ff28 100644 --- "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" +++ "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -1,18 +1,3 @@ -Skip to content - This repository -Explore -Gist -Blog -Help -cokepluscarbon cokepluscarbon - -1 Unwatch - Star 0 - Fork 1cokepluscarbon/Java - branch: master Java / Java-Concurrency / 08.Java同步块 -cokepluscarboncokepluscarbon 3 days ago rename directory -1 contributor -184 lines (126 sloc) 7.719 kb RawBlameHistory #08.Java同步块 A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. From 3c022105a2e3c20d8702b000f7d45b38b6f5b305 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:37:28 +0800 Subject: [PATCH 235/524] =?UTF-8?q?Update=2008.Java=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=9D=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../08.Java\345\220\214\346\255\245\345\235\227.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" index 109ff28..9ab49f6 100644 --- "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" +++ "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227.md" @@ -1,7 +1,5 @@ #08.Java同步块 -A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. - Java synchronized block(Java同步块)用来对方法或代码块进行标记,表明这个方法或代码块是同步的。Java同步块可以避免**竞态条件**。 From 06f398ba2a85c2e75a422052d9dcd20f085d11ec Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:37:48 +0800 Subject: [PATCH 236/524] =?UTF-8?q?Delete=2008.Java=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....Java\345\220\214\346\255\245\345\235\227" | 184 ------------------ 1 file changed, 184 deletions(-) delete mode 100644 "Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227" diff --git "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227" "b/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227" deleted file mode 100644 index 9edb617..0000000 --- "a/Java-Concurrency/08.Java\345\220\214\346\255\245\345\235\227" +++ /dev/null @@ -1,184 +0,0 @@ -#08.Java同步块 - -A Java synchronized block marks a method or a block of code as synchronized. Java synchronized blocks can be used to avoid race conditions. - -Java synchronized block(Java同步块)用来对方法或代码块进行标记,表明这个方法或代码块是同步的。Java同步块可以避免**竞态条件**。 - - -##synchronized关键字(The Java synchronized Keyword) - -Java中的同步块使用关键字**synchronized**进行标记**。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同一时间只能被一个线程进入并执行里面的代码。**其他所有试图进入该对象同步块的线程将被阻塞,直到执行该同步块中的线程退出。 - -**synchronized**关键字可以被用于标记以下四种不同类型的块: - -- 实例方法(Instance methods) -- 静态方法(Static methods) -- 实例方法中的代码块(Code blocks inside instance methods) -- 静态方法中的代码块(Code blocks inside static methods) - -上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。 - -##同步实例方法(Synchronized Instance Methods) - -下面是一个同步的实例方法: - -```Java - public synchronized void add(int value){ - this.count += value; - } -``` - -使用**synchronized**关键字对方法进行声明,告诉JVM这是一个同步的方法。 - -Java中的**同步实例方法是基于这个方法所属的实例对象上进行同步的**。因此,每一个同步实例方法都是基于各自的实例对象进行同步的。同一时间,只有一个线程可以访问一个实例对象的同步实例方法。如果有多个实例存在,那么每个线程都可以同时访问各自不同实例对象的同步实例方法,一个实例对象对应一个线程。 - -##同步静态方法(Synchronized Static Methods) - -静态方法的同步与实例方法一致,都是使用**synchronized**在方法放进行声明。 - -```Java - public static synchronized void add(int value){ - count += value; - } -``` - -同样的,这里的**synchronized**关键字用于告诉JVM这个静态方法是同步的。 - -**同步静态方法是基于这个静态方法所属的类对象进行同步的**。由于在JVM中,每个类有且只有一个类对象,因此,在同一时间内,只有一个线程能够访问同一个类的同步静态方法。 - -如果同步静态方法位于不同的类中,那么每个线程都可以访问各自对应的类的同步静态方法,一个线程对应一个类。 - -##实例方法中的同步块(Synchronized Blocks in Instance Methods) - -有些时候,你并不需要同步整一个方法,而只需要同步这个方法下的一小部分代码块。你可以在方法里面使用同步代码块。 - -下面这个例子就是在非同步方法里面使用了同步代码块: - -```Java - public void add(int value){ - - synchronized(this){ - this.count += value; - } - } -``` - -这个例子里,用了Java的同步代码块来使代码进行同步,让这个方法像同步方法一样执行。 - -注意在Java的同步代码块里,需要在括号里传递一个对象。这个例子中,这个对象是**this**,this指的是这个实例对象本身。在Java同步代码块括号中的对象称为**监听器对象**。意味着,这个同步块是基于这个监听器对象进行同步的。同步实例方法使用其所在实例对象作为监听器对象。 - -**同一时间,只有一个线程能够访问基于同一个监听器对象的同步代码。** - -下面这个例子,两个同步代码都是基于同一个实例对象进行同步的: - -```Java - public class MyClass { - - public synchronized void log1(String msg1, String msg2){ - log.writeln(msg1); - log.writeln(msg2); - } - - - public void log2(String msg1, String msg2){ - synchronized(this){ - log.writeln(msg1); - log.writeln(msg2); - } - } - } -``` - -因此,在这个例子中,每次仅能有一个线程能够访问这两个同步代码的任意一个同步代码。 - -如果第二个同步块是基于其他监听器对象,例如`synchronized (this.getClass()) {}`,则此时第一个和第二个同步代码的监听器对象分别为:当前实例对象和当前类对象。因此,这两个同步代码可以同时由不同的线程进行访问。 - -##静态方法中的同步块(Synchronized Blocks in Static Methods) - -下面这个例子中,两个同步代码都是基于当前的类对象进行同步的: - -```Java - public class MyClass { - - public static synchronized void log1(String msg1, String msg2){ - log.writeln(msg1); - log.writeln(msg2); - } - - - public static void log2(String msg1, String msg2){ - synchronized(MyClass.class){ - log.writeln(msg1); - log.writeln(msg2); - } - } - } -``` - -同一时间,只有一个线程能够访问这两个同步代码的任意一个同步代码。 - -如果第二个方法的监听器对象非MyClass.class对象,则两个同步代码可以同时被两个线程访问。 - - -##Java同步示例(Java Synchronized Example) - -Here is an example that starts 2 threads and have both of them call the add method on the same instance of Counter. Only one thread at a time will be able to call the add method on the same instance, because the method is synchronized on the instance it belongs to. - -```Java -public class Counter{ - long count = 0; - - public synchronized void add(long value){ - this.count += value; - } -} -public class CounterThread extends Thread{ - protected Counter counter = null; - - public CounterThread(Counter counter){ - this.counter = counter; - } - - public void run() { -for(int i=0; i<10; i++){ - counter.add(i); - } - } -} -public class Example { - - public static void main(String[] args){ - Counter counter = new Counter(); - Thread threadA = new CounterThread(counter); - Thread threadB = new CounterThread(counter); - - threadA.start(); - threadB.start(); - } -} -``` - -Two threads are created. The same Counter instance is passed to both of them in their constructor. The Counter.add() method is synchronized on the instance, because the add method is an instance method, and marked as synchronized. Therefore only one of the threads can call the add() method at a time. The other thread will wait until the first thread leaves the add() method, before it can execute the method itself. - -If the two threads had referenced two separate Counter instances, there would have been no problems calling the add() methods simultaneously. The calls would have been to different objects, so the methods called would also be synchronized on different objects (the object owning the method). Therefore the calls would not block. Here is how that could look: - -```Java -public class Example { - public static void main(String[] args){ - Counter counterA = new Counter(); - Counter counterB = new Counter(); - Thread threadA = new CounterThread(counterA); - Thread threadB = new CounterThread(counterB); - - threadA.start(); - threadB.start(); - } -} -``` - -Notice how the two threads, threadA and threadB, no longer reference the same counter instance. The add method of counterA and counterB are synchronized on their two owning instances. Calling add() on counterA will thus not block a call to add() on counterB. - -##Java Concurrency Utilities - -`synchronized`机制是Java第一个引进的用于同步多线程资源共享的机制。然而`synchroniez`机制并不高效。这就是为什么Java 5提供了一整套的并发工具类,以帮助开发人员实现更细粒度的并发控制 -。 \ No newline at end of file From 696b9ee88037abe8e99a097748a474c89624eeb6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:39:58 +0800 Subject: [PATCH 237/524] Published with https://stackedit.io/ --- ...le\345\205\263\351\224\256\345\255\227.md" | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 "Java-Concurrency/9.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" diff --git "a/Java-Concurrency/9.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/9.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" new file mode 100644 index 0000000..67de7c1 --- /dev/null +++ "b/Java-Concurrency/9.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -0,0 +1,136 @@ +#19.信号量 + +A Semaphore is a thread synchronization construct that can be used either to send signals between threads to avoid missed signals, or to guard a critical section like you would with a lock. Java 5 comes with semaphore implementations in the java.util.concurrent package so you don't have to implement your own semaphores. Still, it can be useful to know the theory behind their implementation and use. + +Java 5 comes with a built-in Semaphore so you don't have to implement your own. You can read more about it in the java.util.concurrent.Semaphore text, in my java.util.concurrent tutorial. + +Simple Semaphore + +Here is a simple Semaphore implementation: + +public class Semaphore { + private boolean signal = false; + + public synchronized void take() { + this.signal = true; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(!this.signal) wait(); + this.signal = false; + } + +} +The take() method sends a signal which is stored internally in the Semaphore. The release() method waits for a signal. When received the signal flag is cleared again, and the release() method exited. + +Using a semaphore like this you can avoid missed signals. You will call take() instead of notify() and release() instead of wait(). If the call to take() happens before the call to release() the thread calling release() will still know that take() was called, because the signal is stored internally in the signal variable. This is not the case with wait() and notify(). + +The names take() and release() may seem a bit odd when using a semaphore for signaling. The names origin from the use of semaphores as locks, as explained later in this text. In that case the names make more sense. + +Using Semaphores for Signaling + +Here is a simplified example of two threads signaling each other using a Semaphore: + +Semaphore semaphore = new Semaphore(); + +SendingThread sender = new SendingThread(semaphore); + +ReceivingThread receiver = new ReceivingThread(semaphore); + +receiver.start(); +sender.start(); +public class SendingThread { + Semaphore semaphore = null; + + public SendingThread(Semaphore semaphore){ + this.semaphore = semaphore; + } + + public void run(){ + while(true){ + //do something, then signal + this.semaphore.take(); + + } + } +} +public class RecevingThread { + Semaphore semaphore = null; + + public ReceivingThread(Semaphore semaphore){ + this.semaphore = semaphore; + } + + public void run(){ + while(true){ + this.semaphore.release(); + //receive signal, then do something... + } + } +} +Counting Semaphore + +The Semaphore implementation in the previous section does not count the number of signals sent to it by take() method calls. We can change the Semaphore to do so. This is called a counting semaphore. Here is a simple implementation of a counting semaphore: + +public class CountingSemaphore { + private int signals = 0; + + public synchronized void take() { + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(this.signals == 0) wait(); + this.signals--; + } + +} +Bounded Semaphore + +The CoutingSemaphore has no upper bound on how many signals it can store. We can change the semaphore implementation to have an upper bound, like this: + +public class BoundedSemaphore { + private int signals = 0; + private int bound = 0; + + public BoundedSemaphore(int upperBound){ + this.bound = upperBound; + } + + public synchronized void take() throws InterruptedException{ + while(this.signals == bound) wait(); + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(this.signals == 0) wait(); + this.signals--; + this.notify(); + } +} +Notice how the take() method now blocks if the number of signals is equal to the upper bound. Not until a thread has called release() will the thread calling take() be allowed to deliver its signal, if the BoundedSemaphore has reached its upper signal limit. + +Using Semaphores as Locks + +It is possible to use a bounded semaphore as a lock. To do so, set the upper bound to 1, and have the call to take() and release() guard the critical section. Here is an example: + +BoundedSemaphore semaphore = new BoundedSemaphore(1); + +... + +semaphore.take(); + +try{ + //critical section +} finally { + semaphore.release(); +} +In contrast to the signaling use case the methods take() and release() are now called by the same thread. Since only one thread is allowed to take the semaphore, all other threads calling take() will be blocked until release() is called. The call to release() will never block since there has always been a call to take() first. + +You can also use a bounded semaphore to limit the number of threads allowed into a section of code. For instance, in the example above, what would happen if you set the limit of the BoundedSemaphore to 5? 5 threads would be allowed to enter the critical section at a time. You would have to make sure though, that the thread operations do not conflict for these 5 threads, or you application will fail. + +The relase() method is called from inside a finally-block to make sure it is called even if an exception is thrown from the critical section. + From cc5ff57aad8b93f963a4b7894be0ced44bc22660 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:43:00 +0800 Subject: [PATCH 238/524] rename --- .../10.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 0 .../11.\346\255\273\351\224\201.md" | 0 .../12.\351\242\204\351\230\262\346\255\273\351\224\201.md" | 0 ...51\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 0 ...45\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" | 0 .../{14.Slipped Conditions.md => 15.Slipped Conditions.md} | 0 .../16.Java\344\270\255\347\232\204\351\224\201.md" | 0 ...44\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 0 .../18.\351\207\215\345\205\245\351\224\201\346\255\273.md" | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename "Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" => "Java-Concurrency/10.\347\272\277\347\250\213\351\200\232\344\277\241.md" (100%) rename "Java-Concurrency/10.\346\255\273\351\224\201.md" => "Java-Concurrency/11.\346\255\273\351\224\201.md" (100%) rename "Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" => "Java-Concurrency/12.\351\242\204\351\230\262\346\255\273\351\224\201.md" (100%) rename "Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" => "Java-Concurrency/13.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" (100%) rename "Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" => "Java-Concurrency/14.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" (100%) rename Java-Concurrency/{14.Slipped Conditions.md => 15.Slipped Conditions.md} (100%) rename "Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" => "Java-Concurrency/16.Java\344\270\255\347\232\204\351\224\201.md" (100%) rename "Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" => "Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" (100%) rename "Java-Concurrency/17.\351\207\215\345\205\245\351\224\201\346\255\273.md" => "Java-Concurrency/18.\351\207\215\345\205\245\351\224\201\346\255\273.md" (100%) diff --git "a/Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency/10.\347\272\277\347\250\213\351\200\232\344\277\241.md" similarity index 100% rename from "Java-Concurrency/09.\347\272\277\347\250\213\351\200\232\344\277\241.md" rename to "Java-Concurrency/10.\347\272\277\347\250\213\351\200\232\344\277\241.md" diff --git "a/Java-Concurrency/10.\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\346\255\273\351\224\201.md" similarity index 100% rename from "Java-Concurrency/10.\346\255\273\351\224\201.md" rename to "Java-Concurrency/11.\346\255\273\351\224\201.md" diff --git "a/Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/12.\351\242\204\351\230\262\346\255\273\351\224\201.md" similarity index 100% rename from "Java-Concurrency/11.\351\242\204\351\230\262\346\255\273\351\224\201.md" rename to "Java-Concurrency/12.\351\242\204\351\230\262\346\255\273\351\224\201.md" diff --git "a/Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/13.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" similarity index 100% rename from "Java-Concurrency/12.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" rename to "Java-Concurrency/13.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" diff --git "a/Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/14.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" similarity index 100% rename from "Java-Concurrency/13.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" rename to "Java-Concurrency/14.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" diff --git a/Java-Concurrency/14.Slipped Conditions.md b/Java-Concurrency/15.Slipped Conditions.md similarity index 100% rename from Java-Concurrency/14.Slipped Conditions.md rename to Java-Concurrency/15.Slipped Conditions.md diff --git "a/Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/16.Java\344\270\255\347\232\204\351\224\201.md" similarity index 100% rename from "Java-Concurrency/15.Java\344\270\255\347\232\204\351\224\201.md" rename to "Java-Concurrency/16.Java\344\270\255\347\232\204\351\224\201.md" diff --git "a/Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" similarity index 100% rename from "Java-Concurrency/16.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" rename to "Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" diff --git "a/Java-Concurrency/17.\351\207\215\345\205\245\351\224\201\346\255\273.md" "b/Java-Concurrency/18.\351\207\215\345\205\245\351\224\201\346\255\273.md" similarity index 100% rename from "Java-Concurrency/17.\351\207\215\345\205\245\351\224\201\346\255\273.md" rename to "Java-Concurrency/18.\351\207\215\345\205\245\351\224\201\346\255\273.md" From d60ea9586310be743dc35654f12257158f481d79 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:44:21 +0800 Subject: [PATCH 239/524] rename --- ...55\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "Java-Concurrency/9.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" => "Java-Concurrency/09.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" (100%) diff --git "a/Java-Concurrency/9.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" similarity index 100% rename from "Java-Concurrency/9.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" rename to "Java-Concurrency/09.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" From f0e060bca92f9a12d2d30a497d83da9b1891437d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:50:21 +0800 Subject: [PATCH 240/524] Published with https://stackedit.io/ --- ...9.\344\277\241\345\217\267\351\207\217.md" | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 "Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" new file mode 100644 index 0000000..3605de7 --- /dev/null +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -0,0 +1,138 @@ +19.信号量 + +A Semaphore is a thread synchronization construct that can be used either to send signals between threads to avoid missed signals, or to guard a critical section like you would with a lock. Java 5 comes with semaphore implementations in the java.util.concurrent package so you don't have to implement your own semaphores. Still, it can be useful to know the theory behind their implementation and use. + +Java 5 comes with a built-in Semaphore so you don't have to implement your own. You can read more about it in the java.util.concurrent.Semaphore text, in my java.util.concurrent tutorial. + +##Simple Semaphore + +Here is a simple Semaphore implementation: + +public class Semaphore { + private boolean signal = false; + + public synchronized void take() { + this.signal = true; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(!this.signal) wait(); + this.signal = false; + } + +} +The take() method sends a signal which is stored internally in the Semaphore. The release() method waits for a signal. When received the signal flag is cleared again, and the release() method exited. + +Using a semaphore like this you can avoid missed signals. You will call take() instead of notify() and release() instead of wait(). If the call to take() happens before the call to release() the thread calling release() will still know that take() was called, because the signal is stored internally in the signal variable. This is not the case with wait() and notify(). + +The names take() and release() may seem a bit odd when using a semaphore for signaling. The names origin from the use of semaphores as locks, as explained later in this text. In that case the names make more sense. + +##Using Semaphores for Signaling + +Here is a simplified example of two threads signaling each other using a Semaphore: + +Semaphore semaphore = new Semaphore(); + +SendingThread sender = new SendingThread(semaphore); + +ReceivingThread receiver = new ReceivingThread(semaphore); + +receiver.start(); +sender.start(); +public class SendingThread { + Semaphore semaphore = null; + + public SendingThread(Semaphore semaphore){ + this.semaphore = semaphore; + } + + public void run(){ + while(true){ + //do something, then signal + this.semaphore.take(); + + } + } +} +public class RecevingThread { + Semaphore semaphore = null; + + public ReceivingThread(Semaphore semaphore){ + this.semaphore = semaphore; + } + + public void run(){ + while(true){ + this.semaphore.release(); + //receive signal, then do something... + } + } +} + +##Counting Semaphore + +The Semaphore implementation in the previous section does not count the number of signals sent to it by take() method calls. We can change the Semaphore to do so. This is called a counting semaphore. Here is a simple implementation of a counting semaphore: + +public class CountingSemaphore { + private int signals = 0; + + public synchronized void take() { + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(this.signals == 0) wait(); + this.signals--; + } + +} + +##Bounded Semaphore + +The CoutingSemaphore has no upper bound on how many signals it can store. We can change the semaphore implementation to have an upper bound, like this: + +public class BoundedSemaphore { + private int signals = 0; + private int bound = 0; + + public BoundedSemaphore(int upperBound){ + this.bound = upperBound; + } + + public synchronized void take() throws InterruptedException{ + while(this.signals == bound) wait(); + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(this.signals == 0) wait(); + this.signals--; + this.notify(); + } +} +Notice how the take() method now blocks if the number of signals is equal to the upper bound. Not until a thread has called release() will the thread calling take() be allowed to deliver its signal, if the BoundedSemaphore has reached its upper signal limit. + +Using Semaphores as Locks + +It is possible to use a bounded semaphore as a lock. To do so, set the upper bound to 1, and have the call to take() and release() guard the critical section. Here is an example: + +BoundedSemaphore semaphore = new BoundedSemaphore(1); + +... + +semaphore.take(); + +try{ + //critical section +} finally { + semaphore.release(); +} +In contrast to the signaling use case the methods take() and release() are now called by the same thread. Since only one thread is allowed to take the semaphore, all other threads calling take() will be blocked until release() is called. The call to release() will never block since there has always been a call to take() first. + +You can also use a bounded semaphore to limit the number of threads allowed into a section of code. For instance, in the example above, what would happen if you set the limit of the BoundedSemaphore to 5? 5 threads would be allowed to enter the critical section at a time. You would have to make sure though, that the thread operations do not conflict for these 5 threads, or you application will fail. + +The relase() method is called from inside a finally-block to make sure it is called even if an exception is thrown from the critical section. + From 098313be2895188e9a4622036262fe0e2d7e1a0d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:51:59 +0800 Subject: [PATCH 241/524] Published with https://stackedit.io/ --- ...73\345\241\236\351\230\237\345\210\227.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 "Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" diff --git "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" new file mode 100644 index 0000000..96bd0dc --- /dev/null +++ "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" @@ -0,0 +1,54 @@ +#20.阻塞队列 + +A blocking queue is a queue that blocks when you try to dequeue from it and the queue is empty, or if you try to enqueue items to it and the queue is already full. A thread trying to dequeue from an empty queue is blocked until some other thread inserts an item into the queue. A thread trying to enqueue an item in a full queue is blocked until some other thread makes space in the queue, either by dequeuing one or more items or clearing the queue completely. + +Here is a diagram showing two threads cooperating via a blocking queue: + +![enter image description here](http://tutorials.jenkov.com/images/java-concurrency-utils/blocking-queue.png) + +A BlockingQueue with one thread putting into it, and another thread taking from it. +A BlockingQueue with one thread putting into it, and another thread taking from it. +Java 5 comes with blocking queue implementations in the java.util.concurrent package. You can read about that class in my java.util.concurrent.BlockingQueue tutorial. Even if Java 5 comes with a blocking queue implementation, it can be useful to know the theory behind their implementation. + + +Blocking Queue Implementation + +The implementation of a blocking queue looks similar to a Bounded Semaphore. Here is a simple implementation of a blocking queue: + +public class BlockingQueue { + + private List queue = new LinkedList(); + private int limit = 10; + + public BlockingQueue(int limit){ + this.limit = limit; + } + + + public synchronized void enqueue(Object item) + throws InterruptedException { + while(this.queue.size() == this.limit) { + wait(); + } + if(this.queue.size() == 0) { + notifyAll(); + } + this.queue.add(item); + } + + + public synchronized Object dequeue() + throws InterruptedException{ + while(this.queue.size() == 0){ + wait(); + } + if(this.queue.size() == this.limit){ + notifyAll(); + } + + return this.queue.remove(0); + } + +} + +Notice how notifyAll() is only called from enqueue() and dequeue() if the queue size is equal to the size bounds (0 or limit). If the queue size is not equal to either bound when enqueue() or dequeue() is called, there can be no threads waiting to either enqueue or dequeue items. \ No newline at end of file From e548ac742774ef62ddfbe86d8300167476c2360d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:53:43 +0800 Subject: [PATCH 242/524] Published with https://stackedit.io/ --- ...1.\347\272\277\347\250\213\346\261\240.md" | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 "Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" diff --git "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" new file mode 100644 index 0000000..c457eef --- /dev/null +++ "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" @@ -0,0 +1,83 @@ +#21.线程池 + +Thread Pools are useful when you need to limit the number of threads running in your application at the same time. There is a performance overhead associated with starting a new thread, and each thread is also allocated some memory for its stack etc. + +Instead of starting a new thread for every task to execute concurrently, the task can be passed to a thread pool. As soon as the pool has any idle threads the task is assigned to one of them and executed. Internally the tasks are inserted into a Blocking Queue which the threads in the pool are dequeuing from. When a new task is inserted into the queue one of the idle threads will dequeue it successfully and execute it. The rest of the idle threads in the pool will be blocked waiting to dequeue tasks. + +Thread pools are often used in multi threaded servers. Each connection arriving at the server via the network is wrapped as a task and passed on to a thread pool. The threads in the thread pool will process the requests on the connections concurrently. A later trail will get into detail about implementing multithreaded servers in Java. + +Java 5 comes with built in thread pools in the java.util.concurrent package, so you don't have to implement your own thread pool. You can read more about it in my text on the java.util.concurrent.ExecutorService. Still it can be useful to know a bit about the implementation of a thread pool anyways. + +Here is a simple thread pool implementation: + +public class ThreadPool { + + private BlockingQueue taskQueue = null; + private List threads = new ArrayList(); + private boolean isStopped = false; + + public ThreadPool(int noOfThreads, int maxNoOfTasks){ + taskQueue = new BlockingQueue(maxNoOfTasks); + + for(int i=0; i Date: Tue, 16 Sep 2014 01:55:58 +0800 Subject: [PATCH 243/524] Published with https://stackedit.io/ --- ...20\345\220\214\346\255\245\345\231\250.md" | 270 ++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 "Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" new file mode 100644 index 0000000..89aa638 --- /dev/null +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -0,0 +1,270 @@ + +#22.剖析同步器 + +Even if many synchronizers (locks, semaphores, blocking queue etc.) are different in function, they are often not that different in their internal design. In other words, they consist of the same (or similar) basic parts internally. Knowing these basic parts can be a great help when designing synchronizers. It is these parts this text looks closer at. + +Note: The content of this text is a part result of a M.Sc. student project at the IT University of Copenhagen in the spring 2004 by Jakob Jenkov, Toke Johansen and Lars Bjørn. During this project we asked Doug Lea if he knew of similar work. Interestingly he had come up with similar conclusions independently of this project during the development of the Java 5 concurrency utilities. Doug Lea's work, I believe, is described in the book "Java Concurrency in Practice". This book also contains a chapter with the title "Anatomy of a Synchronizer" with content similar to this text, though not exactly the same. + +The purpose of most (if not all) synchronizers is to guard some area of the code (critical section) from concurrent access by threads. To do this the following parts are often needed in a synchronizer: + +State +Access Condition +State Changes +Notification Strategy +Test and Set Method +Set Method +Not all synchronizers have all of these parts, and those that have may not have them exactly as they are described here. Usually you can find one or more of these parts, though. + +State + +The state of a synchronizer is used by the access condition to determine if a thread can be granted access. In a Lock the state is kept in a boolean saying whether the Lock is locked or not. In a Bounded Semaphore the internal state is kept in a counter (int) and an upper bound (int) which state the current number of "takes" and the maximum number of "takes". In a Blocking Queue the state is kept in the List of elements in the queue and the maximum queue size (int) member (if any). + +Here are two code snippets from both Lock and a BoundedSemaphore. The state code is marked in bold. + +public class Lock{ + + //state is kept here + private boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + wait(); + } + isLocked = true; + } + + ... +} +public class BoundedSemaphore { + + //state is kept here + private int signals = 0; + private int bound = 0; + + public BoundedSemaphore(int upperBound){ + this.bound = upperBound; + } + + public synchronized void take() throws InterruptedException{ + while(this.signals == bound) wait(); + this.signal++; + this.notify(); + } + ... +} +Access Condition + +The access conditions is what determines if a thread calling a test-and-set-state method can be allowed to set the state or not. The access condition is typically based on the state of the synchronizer. The access condition is typically checked in a while loop to guard against Spurious Wakeups. When the access condition is evaluated it is either true or false. + +In a Lock the access condition simply checks the value of the isLocked member variable. In a Bounded Semaphore there are actually two access conditions depending on whether you are trying to "take" or "release" the semaphore. If a thread tries to take the semaphore the signals variable is checked against the upper bound. If a thread tries to release the semaphore the signals variable is checked against 0. + +Here are two code snippets of a Lock and a BoundedSemaphore with the access condition marked in bold. Notice how the conditions is always checked inside a while loop. + +public class Lock{ + + private boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + //access condition + while(isLocked){ + wait(); + } + isLocked = true; + } + + ... +} +public class BoundedSemaphore { + private int signals = 0; + private int bound = 0; + + public BoundedSemaphore(int upperBound){ + this.bound = upperBound; + } + + public synchronized void take() throws InterruptedException{ + //access condition + while(this.signals == bound) wait(); + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + //access condition + while(this.signals == 0) wait(); + this.signals--; + this.notify(); + } +} +State Changes + +Once a thread gains access to the critical section it has to change the state of the synchronizer to (possibly) block other threads from entering it. In other words, the state needs to reflect the fact that a thread is now executing inside the critical section. This should affect the access conditions of other threads attempting to gain access. + +In a Lock the state change is the code setting isLocked = true. In a semaphore it is either the code signals-- or signals++; + +Here are two code snippets with the state change code marked in bold: + +public class Lock{ + + private boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + wait(); + } + //state change + isLocked = true; + } + + public synchronized void unlock(){ + //state change + isLocked = false; + notify(); + } +} +public class BoundedSemaphore { + private int signals = 0; + private int bound = 0; + + public BoundedSemaphore(int upperBound){ + this.bound = upperBound; + } + + public synchronized void take() throws InterruptedException{ + while(this.signals == bound) wait(); + //state change + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(this.signals == 0) wait(); + //state change + this.signals--; + this.notify(); + } +} +Notification Strategy + +Once a thread has changed the state of a synchronizer it may sometimes need to notify other waiting threads about the state change. Perhaps this state change might turn the access condition true for other threads. + +Notification Strategies typically fall into three categories. + +Notify all waiting threads. +Notify 1 random of N waiting threads. +Notify 1 specific of N waiting thread. +Notifying all waiting threads is pretty easy. All waiting threads call wait() on the same object. Once a thread want to notify the waiting threads it calls notifyAll() on the object the waiting threads called wait() on. + +Notifying a single random waiting thread is also pretty easy. Just have the notifying thread call notify() on the object the waiting threads have called wait() on. Calling notify makes no guarantee about which of the waiting threads will be notified. Hence the term "random waiting thread". + +Sometimes you may need to notify a specific rather than a random waiting thread. For instance if you need to guarantee that waiting threads are notified in a specific order, be it the order they called the synchronizer in, or some prioritized order. To achive this each waiting thread must call wait() on its own, separate object. When the notifying thread wants to notify a specific waiting thread it will call notify() on the object this specific thread has called wait() on. An example of this can be found in the text Starvation and Fairness. + +Below is a code snippet with the notification strategy (notify 1 random waiting thread) marked in bold: + +public class Lock{ + + private boolean isLocked = false; + + public synchronized void lock() + throws InterruptedException{ + while(isLocked){ + //wait strategy - related to notification strategy + wait(); + } + isLocked = true; + } + + public synchronized void unlock(){ + isLocked = false; + notify(); //notification strategy + } +} +Test and Set Method + +Synchronizer most often have two types of methods of which test-and-set is the first type (set is the other). Test-and-set means that the thread calling this method tests the internal state of the synchronizer against the access condition. If the condition is met the thread sets the internal state of the synchronizer to reflect that the thread has gained access. + +The state transition usually results in the access condition turning false for other threads trying to gain access, but may not always do so. For instance, in a Read - Write Lock a thread gaining read access will update the state of the read-write lock to reflect this, but other threads requesting read access will also be granted access as long as no threads has requested write access. + +It is imperative that the test-and-set operations are executed atomically meaning no other threads are allowed to execute in the test-and-set method in between the test and the setting of the state. + +The program flow of a test-and-set method is usually something along the lines of: + +Set state before test if necessary +Test state against access condition +If access condition is not met, wait +If access condition is met, set state, and notify waiting threads if necessary +The lockWrite() method of a ReadWriteLock class shown below is an example of a test-and-set method. Threads calling lockWrite() first sets the state before the test (writeRequests++). Then it tests the internal state against the access condition in the canGrantWriteAccess() method. If the test succeeds the internal state is set again before the method is exited. Notice that this method does not notify waiting threads. + +public class ReadWriteLock{ + private Map readingThreads = + new HashMap(); + + private int writeAccesses = 0; + private int writeRequests = 0; + private Thread writingThread = null; + + ... + + + public synchronized void lockWrite() throws InterruptedException{ + writeRequests++; + Thread callingThread = Thread.currentThread(); + while(! canGrantWriteAccess(callingThread)){ + wait(); + } + writeRequests--; + writeAccesses++; + writingThread = callingThread; + } + + + ... +} +The BoundedSemaphore class shown below has two test-and-set methods: take() and +release(). Both methods test and sets the internal state. + +public class BoundedSemaphore { + private int signals = 0; + private int bound = 0; + + public BoundedSemaphore(int upperBound){ + this.bound = upperBound; + } + + + public synchronized void take() throws InterruptedException{ + while(this.signals == bound) wait(); + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(this.signals == 0) wait(); + this.signals--; + this.notify(); + } + +} +Set Method + +The set method is the second type of method that synchronizers often contain. The set method just sets the internal state of the synchronizer without testing it first. A typical example of a set method is the unlock() method of a Lock class. A thread holding the lock can always unlock it without having to test if the Lock is unlocked. + +The program flow of a set method is usually along the lines of: + +Set internal state +Notify waiting threads +Here is an example unlock() method: + +public class Lock{ + + private boolean isLocked = false; + + public synchronized void unlock(){ + isLocked = false; + notify(); + } + +} \ No newline at end of file From 1937d25a3b96bb9a64a8018261c48eb2ec7c5cbf Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:58:58 +0800 Subject: [PATCH 244/524] =?UTF-8?q?Update=2010.=E7=BA=BF=E7=A8=8B=E9=80=9A?= =?UTF-8?q?=E4=BF=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../10.\347\272\277\347\250\213\351\200\232\344\277\241.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/10.\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/Java-Concurrency/10.\347\272\277\347\250\213\351\200\232\344\277\241.md" index 126f4a0..5d4878d 100644 --- "a/Java-Concurrency/10.\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/Java-Concurrency/10.\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -1,4 +1,4 @@ -#09.线程通信 +#10.线程通信 线程通信的目的在于:让线程之间可以彼此发送信号。因此,线程通信也让线程等待其他线程发送的信号。举个例子,线程B等待线程A的信号,这个信号用于通知线程B数据已经准备就绪。 @@ -205,4 +205,4 @@ If the doNotify() method had called notifyAll() instead of notify(), all waiting You may be tempted then to always call notifyAll() instead notify(), but this is a bad idea performance wise. There is no reason to wake up all threads waiting when only one of them can respond to the signal. -So: Don't use global objects, string constants etc. for wait() / notify() mechanisms. Use an object that is unique to the construct using it. For instance, each MyWaitNotify3 (example from earlier sections) instance has its own MonitorObject instance rather than using the empty string for wait() / notify() calls. \ No newline at end of file +So: Don't use global objects, string constants etc. for wait() / notify() mechanisms. Use an object that is unique to the construct using it. For instance, each MyWaitNotify3 (example from earlier sections) instance has its own MonitorObject instance rather than using the empty string for wait() / notify() calls. From 02204812572352666f1fd6745ce67c27b8da443c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:59:16 +0800 Subject: [PATCH 245/524] =?UTF-8?q?Update=2011.=E6=AD=BB=E9=94=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "Java-Concurrency/11.\346\255\273\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/11.\346\255\273\351\224\201.md" "b/Java-Concurrency/11.\346\255\273\351\224\201.md" index be1ac0a..6d5e624 100644 --- "a/Java-Concurrency/11.\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/11.\346\255\273\351\224\201.md" @@ -1,4 +1,4 @@ -#10.死锁 +#11.死锁 死锁是指两个或多个线程等待其他处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。 @@ -93,4 +93,4 @@ Transaction 1, request 2, tries to lock record 2 for update. Transaction 2, request 2, tries to lock record 1 for update. ``` -因为锁发生在不同的请求中,并且对于一个事务来说不可能提前知道所有它需要的锁,因此很难检测和避免数据库事务中的死锁。 \ No newline at end of file +因为锁发生在不同的请求中,并且对于一个事务来说不可能提前知道所有它需要的锁,因此很难检测和避免数据库事务中的死锁。 From d388ddd111574cf6bd96ff8331e88f334818de47 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 01:59:31 +0800 Subject: [PATCH 246/524] =?UTF-8?q?Update=2012.=E9=A2=84=E9=98=B2=E6=AD=BB?= =?UTF-8?q?=E9=94=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../12.\351\242\204\351\230\262\346\255\273\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/12.\351\242\204\351\230\262\346\255\273\351\224\201.md" "b/Java-Concurrency/12.\351\242\204\351\230\262\346\255\273\351\224\201.md" index 3f6bcf2..0c6b61d 100644 --- "a/Java-Concurrency/12.\351\242\204\351\230\262\346\255\273\351\224\201.md" +++ "b/Java-Concurrency/12.\351\242\204\351\230\262\346\255\273\351\224\201.md" @@ -1,4 +1,4 @@ -#11.预防死锁 +#12.预防死锁 在某些情况,死锁是可以预防的。下面介绍三种可以预防死锁的技术: @@ -88,4 +88,4 @@ So what do the threads do if a deadlock is detected? One possible action is to release all locks, backup, wait a random amount of time and then retry. This is similar to the simpler lock timeout mechanism except threads only backup when a deadlock has actually occurred. Not just because their lock requests timed out. However, if a lot of threads are competing for the same locks they may repeatedly end up in a deadlock even if they back up and wait. -A better option is to determine or assign a priority of the threads so that only one (or a few) thread backs up. The rest of the threads continue taking the locks they need as if no deadlock had occurred. If the priority assigned to the threads is fixed, the same threads will always be given higher priority. To avoid this you may assign the priority randomly whenever a deadlock is detected. \ No newline at end of file +A better option is to determine or assign a priority of the threads so that only one (or a few) thread backs up. The rest of the threads continue taking the locks they need as if no deadlock had occurred. If the priority assigned to the threads is fixed, the same threads will always be given higher priority. To avoid this you may assign the priority randomly whenever a deadlock is detected. From 4d1a995965a013e472c6fe79db3a24a396268523 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:00:01 +0800 Subject: [PATCH 247/524] =?UTF-8?q?Update=2014.=E5=B5=8C=E5=A5=97=E7=AE=A1?= =?UTF-8?q?=E7=A8=8B=E9=94=81=E6=AD=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\227\347\256\241\347\250\213\351\224\201\346\255\273.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/14.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" "b/Java-Concurrency/14.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" index 63f1351..8752fdd 100644 --- "a/Java-Concurrency/14.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/14.\345\265\214\345\245\227\347\256\241\347\250\213\351\224\201\346\255\273.md" @@ -1,4 +1,4 @@ -#13.嵌套管程锁死(Nested Monitor Lockout) +#14.嵌套管程锁死(Nested Monitor Lockout) ##嵌套管程锁死如何发生 @@ -130,4 +130,4 @@ The two situations are not equal though. As explained in the text on Deadlock a 两者的不同点如下: * 在死锁中,两个线程互相等待对方释放锁。 -* 在嵌套管程锁死中,线程1持有锁A,并等待线程2的信号,而线程2需要锁A才能够发送信号给线程1. \ No newline at end of file +* 在嵌套管程锁死中,线程1持有锁A,并等待线程2的信号,而线程2需要锁A才能够发送信号给线程1. From 6751324c906b9d113005b250ae125b797e7d0fa8 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:00:22 +0800 Subject: [PATCH 248/524] Update 15.Slipped Conditions.md --- Java-Concurrency/15.Slipped Conditions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Java-Concurrency/15.Slipped Conditions.md b/Java-Concurrency/15.Slipped Conditions.md index 4af0ffb..1e9e919 100644 --- a/Java-Concurrency/15.Slipped Conditions.md +++ b/Java-Concurrency/15.Slipped Conditions.md @@ -1,4 +1,4 @@ -#14.Slipped Conditions +#15.Slipped Conditions What is Slipped Conditions? @@ -226,4 +226,4 @@ The return; statement in the synchronized(this) block is not necessary. It is ju The observant reader will notice that the above implementation of a fair lock still suffers from a missed signal problem. Imagine that the FairLock instance is locked when a thread calls lock(). After the first synchronized(this) block mustWait is true. Then imagine that the thread calling lock() is preempted, and the thread that locked the lock calls unlock(). If you look at the unlock() implementation shown earlier, you will notice that it calls queueObject.notify(). But, since the thread waiting in lock() has not yet called queueObject.wait(), the call to queueObject.notify() passes into oblivion. The signal is missed. When the thread calling lock() right after calls queueObject.wait() it will remain blocked until some other thread calls unlock(), which may never happen. -The missed signals problems is the reason that the FairLock implementation shown in the text Starvation and Fairness has turned the QueueObject class into a semaphore with two methods: doWait() and doNotify(). These methods store and react the signal internally in the QueueObject. That way the signal is not missed, even if doNotify() is called before doWait(). \ No newline at end of file +The missed signals problems is the reason that the FairLock implementation shown in the text Starvation and Fairness has turned the QueueObject class into a semaphore with two methods: doWait() and doNotify(). These methods store and react the signal internally in the QueueObject. That way the signal is not missed, even if doNotify() is called before doWait(). From e97b181b0b29e7723f2565be21f8e8c3df2e9905 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:00:37 +0800 Subject: [PATCH 249/524] =?UTF-8?q?Update=2016.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E9=94=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../16.Java\344\270\255\347\232\204\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/16.Java\344\270\255\347\232\204\351\224\201.md" "b/Java-Concurrency/16.Java\344\270\255\347\232\204\351\224\201.md" index 67667bb..da983ec 100644 --- "a/Java-Concurrency/16.Java\344\270\255\347\232\204\351\224\201.md" +++ "b/Java-Concurrency/16.Java\344\270\255\347\232\204\351\224\201.md" @@ -1,4 +1,4 @@ -#15.Java中的锁 +#16.Java中的锁 **锁**跟**synchronized**的一样,是Java中的一种同步机制,但要比synchronized复杂得多。在Java 5之前,锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,我们还不能完全摆脱synchronized关键字。 @@ -182,4 +182,4 @@ try{ } ``` -这个小小的结构改变可以保证当临界区的代码抛出异常时`unlock()`总可以被调用。当临界区代码抛出异常时,如果finally块中的`unlock()`方法没有被调用,那么Lock实例将永远被锁住,调用`lock()`方法的线程将陷入无止境的阻塞状态。 \ No newline at end of file +这个小小的结构改变可以保证当临界区的代码抛出异常时`unlock()`总可以被调用。当临界区代码抛出异常时,如果finally块中的`unlock()`方法没有被调用,那么Lock实例将永远被锁住,调用`lock()`方法的线程将陷入无止境的阻塞状态。 From e8edd60279ddbd551f1055aaaa95f7f42efa1a43 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:00:54 +0800 Subject: [PATCH 250/524] =?UTF-8?q?Update=2017.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=AF=BB=E5=86=99=E9=94=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 1847413..4af75f3 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -1,4 +1,4 @@ -#16.Java中的读/写锁 +#17.Java中的读/写锁 A read / write lock is more sophisticated lock than the Lock implementations shown in the text Locks in Java. Imagine you have an application that reads and writes some resource, but writing it is not done as much as reading it is. Two threads reading the same resource does not cause problems for each other, so multiple threads that want to read the resource are granted access at the same time, overlapping. But, if a single thread wants to write to the resource, no other reads nor writes must be in progress at the same time. To solve this problem of allowing multiple readers but only one writer, you will need a read / write lock. @@ -370,4 +370,4 @@ try{ } finally { lock.unlockWrite(); } -This little construct makes sure that the ReadWriteLock is unlocked in case an exception is thrown from the code in the critical section. If unlockWrite() was not called from inside a finally-clause, and an exception was thrown from the critical section, the ReadWriteLock would remain write locked forever, causing all threads calling lockRead() or lockWrite() on that ReadWriteLock instance to halt indefinately. The only thing that could unlock the ReadWriteLockagain would be if the ReadWriteLock is reentrant, and the thread that had it locked when the exception was thrown, later succeeds in locking it, executing the critical section and calling unlockWrite() again afterwards. That would unlock the ReadWriteLock again. But why wait for that to happen, if it happens? Calling unlockWrite() from a finally-clause is a much more robust solution. \ No newline at end of file +This little construct makes sure that the ReadWriteLock is unlocked in case an exception is thrown from the code in the critical section. If unlockWrite() was not called from inside a finally-clause, and an exception was thrown from the critical section, the ReadWriteLock would remain write locked forever, causing all threads calling lockRead() or lockWrite() on that ReadWriteLock instance to halt indefinately. The only thing that could unlock the ReadWriteLockagain would be if the ReadWriteLock is reentrant, and the thread that had it locked when the exception was thrown, later succeeds in locking it, executing the critical section and calling unlockWrite() again afterwards. That would unlock the ReadWriteLock again. But why wait for that to happen, if it happens? Calling unlockWrite() from a finally-clause is a much more robust solution. From 66db28cc2cf1302c7f13040511be7ed4f0c514fb Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:01:14 +0800 Subject: [PATCH 251/524] =?UTF-8?q?Update=2018.=E9=87=8D=E5=85=A5=E9=94=81?= =?UTF-8?q?=E6=AD=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../18.\351\207\215\345\205\245\351\224\201\346\255\273.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/18.\351\207\215\345\205\245\351\224\201\346\255\273.md" "b/Java-Concurrency/18.\351\207\215\345\205\245\351\224\201\346\255\273.md" index ff5a4c3..e438f20 100644 --- "a/Java-Concurrency/18.\351\207\215\345\205\245\351\224\201\346\255\273.md" +++ "b/Java-Concurrency/18.\351\207\215\345\205\245\351\224\201\346\255\273.md" @@ -1,4 +1,4 @@ -#17.重入锁死 +#18.重入锁死 Reentrance lockout is a situation similar to deadlock and nested monitor lockout. Reentrance lockout is also covered in part in the texts on Locks and Read / Write Locks. @@ -41,4 +41,4 @@ To avoid reentrance lockouts you have two options: Avoid writing code that reenters locks Use reentrant locks -Which of these options suit your project best depends on your concrete situation. Reentrant locks often don't perform as well as non-reentrant locks, and they are harder to implement, but this may not necessary be a problem in your case. Whether or not your code is easier to implement with or without lock reentrance must be determined case by case. \ No newline at end of file +Which of these options suit your project best depends on your concrete situation. Reentrant locks often don't perform as well as non-reentrant locks, and they are harder to implement, but this may not necessary be a problem in your case. Whether or not your code is easier to implement with or without lock reentrance must be determined case by case. From e51b94c979f3c6b3dc617c26f21a947bc4a94a33 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:01:33 +0800 Subject: [PATCH 252/524] =?UTF-8?q?Update=2019.=E4=BF=A1=E5=8F=B7=E9=87=8F?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 3605de7..706ac5a 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -1,4 +1,4 @@ -19.信号量 +#19.信号量 A Semaphore is a thread synchronization construct that can be used either to send signals between threads to avoid missed signals, or to guard a critical section like you would with a lock. Java 5 comes with semaphore implementations in the java.util.concurrent package so you don't have to implement your own semaphores. Still, it can be useful to know the theory behind their implementation and use. From ecfffaedf14b378086e1a0e48ec475f00d9a3e31 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:02:10 +0800 Subject: [PATCH 253/524] =?UTF-8?q?Update=2013.=E9=A5=A5=E9=A5=BF=E5=92=8C?= =?UTF-8?q?=E5=85=AC=E5=B9=B3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\245\351\245\277\345\222\214\345\205\254\345\271\263.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/13.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" "b/Java-Concurrency/13.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" index 7074380..62c3b95 100644 --- "a/Java-Concurrency/13.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" +++ "b/Java-Concurrency/13.\351\245\245\351\245\277\345\222\214\345\205\254\345\271\263.md" @@ -1,4 +1,4 @@ -#12.饥饿和公平(Starvation and Fairness) +#13.饥饿和公平(Starvation and Fairness) 如果一个线程由于CPU时间全部被其他线程抢占而得不到CPU时间,这就称为**饥饿(Starvation)**。这个线程因为得不到CPU机会而“饿死(starved to death)"。解决饥饿的方案称为**公平(Fairness)**--所有的线程都能公平地获得CPU时间。 @@ -190,4 +190,4 @@ Finally, notice how the queueObject.doWait() is called inside a try - catch bloc ##性能(A Note on Performance) -If you compare the Lock and FairLock classes you will notice that there is somewhat more going on inside the lock() and unlock() in the FairLock class. This extra code will cause the FairLock to be a sligtly slower synchronization mechanism than Lock. How much impact this will have on your application depends on how long time the code in the critical section guarded by the FairLock takes to execute. The longer this takes to execute, the less significant the added overhead of the synchronizer is. It does of course also depend on how often this code is called. \ No newline at end of file +If you compare the Lock and FairLock classes you will notice that there is somewhat more going on inside the lock() and unlock() in the FairLock class. This extra code will cause the FairLock to be a sligtly slower synchronization mechanism than Lock. How much impact this will have on your application depends on how long time the code in the critical section guarded by the FairLock takes to execute. The longer this takes to execute, the less significant the added overhead of the synchronizer is. It does of course also depend on how often this code is called. From aa9c2dacb92cb7f0adb04c4d414506d26f63b704 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:03:38 +0800 Subject: [PATCH 254/524] Published with https://stackedit.io/ From 8111bb6bfeeec87cd0e938d9fa2fcb660c336f29 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:08:10 +0800 Subject: [PATCH 255/524] Published with https://stackedit.io/ --- ...70\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 4af75f3..6383f3e 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -4,7 +4,7 @@ A read / write lock is more sophisticated lock than the Lock implementations sho Java 5 comes with read / write lock implementations in the java.util.concurrent package. Even so, it may still be useful to know the theory behind their implementation. -##Read / Write Lock Java Implementation +##Java中读/写锁的实现(Read / Write Lock Java Implementation) First let's summarize the conditions for getting read and write access to the resource: @@ -61,7 +61,7 @@ Inside the ReadWriteLock there are threads waiting for read access, and threads Calling notifyAll() also has another advantage. If multiple threads are waiting for read access and none for write access, and unlockWrite() is called, all threads waiting for read access are granted read access at once - not one by one. -##Read / Write Lock Reentrance +##读/写锁的可重入性(Read / Write Lock Reentrance) The ReadWriteLock class shown earlier is not reentrant. If a thread that has write access requests it again, it will block because there is already one writer - itself. Furthermore, consider this case: From f52eb3386181407b0c0f71da28241b0f07bec8ca Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:22:29 +0800 Subject: [PATCH 256/524] Published with https://stackedit.io/ --- ...70\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 6383f3e..a8edcfa 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -1,7 +1,11 @@ #17.Java中的读/写锁 +Java中,读/写锁的实现比普通锁的实现更加复杂。想象一个读写资源的应用程序,读操作比写操作要频繁得多。假如两个线程同时对同一个资源进行读操作,则不会发生任何问题,因此,如果多个线程同时请求对资源进行读操作将可同时被授权并对资源进行读取。 + A read / write lock is more sophisticated lock than the Lock implementations shown in the text Locks in Java. Imagine you have an application that reads and writes some resource, but writing it is not done as much as reading it is. Two threads reading the same resource does not cause problems for each other, so multiple threads that want to read the resource are granted access at the same time, overlapping. But, if a single thread wants to write to the resource, no other reads nor writes must be in progress at the same time. To solve this problem of allowing multiple readers but only one writer, you will need a read / write lock. +读/写锁是比文字锁在Java中所示的Lock实现更复杂的锁。想象一下,你有读取和写入一些资源的应用程序,但是写不这样做尽可能多读书是。两个线程读取相同的资源不会造成问题,对于想要阅读的资源交相辉映,让多个线程被授予在同一时间访问,重叠。但是,如果一个线程想要写的资源,没有其他读也不写操作必须是在进步的同时。为了解决允许多个读者的这个问题,但只有一个作家,你将需要一个读/写锁。 + Java 5 comes with read / write lock implementations in the java.util.concurrent package. Even so, it may still be useful to know the theory behind their implementation. ##Java中读/写锁的实现(Read / Write Lock Java Implementation) From f23bbe8593a07ac6faa1abf8a35187c8a818d00f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:31:48 +0800 Subject: [PATCH 257/524] Published with https://stackedit.io/ --- ...55\347\232\204\350\257\273\345\206\231\351\224\201.md" | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index a8edcfa..7211542 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -1,12 +1,8 @@ #17.Java中的读/写锁 -Java中,读/写锁的实现比普通锁的实现更加复杂。想象一个读写资源的应用程序,读操作比写操作要频繁得多。假如两个线程同时对同一个资源进行读操作,则不会发生任何问题,因此,如果多个线程同时请求对资源进行读操作将可同时被授权并对资源进行读取。 +Java中,读/写锁的实现比普通锁的实现更加复杂。想象一个读写资源的应用程序,读操作比写操作要频繁得多。假如两个线程同时对同一个资源进行读操作,则不会发生任何问题,因此,如果多个线程同时请求对资源进行读操作将可同时被授权并对资源进行读取。但是,如果有一个线程对资源进行写操作,则不应该存在其他写线程或读线程在执行。我们可以使用读/写锁来实现这种需求。 -A read / write lock is more sophisticated lock than the Lock implementations shown in the text Locks in Java. Imagine you have an application that reads and writes some resource, but writing it is not done as much as reading it is. Two threads reading the same resource does not cause problems for each other, so multiple threads that want to read the resource are granted access at the same time, overlapping. But, if a single thread wants to write to the resource, no other reads nor writes must be in progress at the same time. To solve this problem of allowing multiple readers but only one writer, you will need a read / write lock. - -读/写锁是比文字锁在Java中所示的Lock实现更复杂的锁。想象一下,你有读取和写入一些资源的应用程序,但是写不这样做尽可能多读书是。两个线程读取相同的资源不会造成问题,对于想要阅读的资源交相辉映,让多个线程被授予在同一时间访问,重叠。但是,如果一个线程想要写的资源,没有其他读也不写操作必须是在进步的同时。为了解决允许多个读者的这个问题,但只有一个作家,你将需要一个读/写锁。 - -Java 5 comes with read / write lock implementations in the java.util.concurrent package. Even so, it may still be useful to know the theory behind their implementation. +Java 5的`java.util.concurrent`包含了读写锁。即使如此,了解读写锁的实现原理也是非常有用的。 ##Java中读/写锁的实现(Read / Write Lock Java Implementation) From 98d10675673cb77452977004c338bf7708ce6a7f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 02:38:22 +0800 Subject: [PATCH 258/524] Published with https://stackedit.io/ --- ...0\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 7211542..5c56693 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -6,10 +6,13 @@ Java 5的`java.util.concurrent`包含了读写锁。即使如此,了解读写 ##Java中读/写锁的实现(Read / Write Lock Java Implementation) -First let's summarize the conditions for getting read and write access to the resource: +首先,我们对写操作和读操作做一个概述: +``` Read Access If no threads are writing, and no threads have requested write access. Write Access If no threads are reading or writing. +``` + If a thread wants to read the resource, it is okay as long as no threads are writing to it, and no threads have requested write access to the resource. By up-prioritizing write-access requests we assume that write requests are more important than read-requests. Besides, if reads are what happens most often, and we did not up-prioritize writes, starvation could occur. Threads requesting write access would be blocked until all readers had unlocked the ReadWriteLock. If new threads were constantly granted read access the thread waiting for write access would remain blocked indefinately, resulting in starvation. Therefore a thread can only be granted read access if no thread has currently locked the ReadWriteLock for writing, or requested it locked for writing. A thread that wants write access to the resource can be granted so when no threads are reading nor writing to the resource. It doesn't matter how many threads have requested write access or in what sequence, unless you want to guarantee fairness between threads requesting write access. From f52ff938c10fa150b400b9f3c1ac9e56439ba31f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 09:09:43 +0800 Subject: [PATCH 259/524] =?UTF-8?q?Rename=2009.Java=E4=B8=AD=E7=9A=84volat?= =?UTF-8?q?ile=E5=85=B3=E9=94=AE=E5=AD=97.md=20to=2009.Java=E7=9A=84volati?= =?UTF-8?q?le=E5=85=B3=E9=94=AE=E5=AD=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...va\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "Java-Concurrency/09.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" => "Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" (100%) diff --git "a/Java-Concurrency/09.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" similarity index 100% rename from "Java-Concurrency/09.Java\344\270\255\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" rename to "Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" From 521d0a3f7625a1ca8fab3e43dfc1f6f15190ea71 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 09:30:20 +0800 Subject: [PATCH 260/524] Published with https://stackedit.io/ --- ...le\345\205\263\351\224\256\345\255\227.md" | 142 +++++------------- 1 file changed, 38 insertions(+), 104 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 67de7c1..588c4a0 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -1,136 +1,70 @@ -#19.信号量 +#09.Java的volatile关键字 -A Semaphore is a thread synchronization construct that can be used either to send signals between threads to avoid missed signals, or to guard a critical section like you would with a lock. Java 5 comes with semaphore implementations in the java.util.concurrent package so you don't have to implement your own semaphores. Still, it can be useful to know the theory behind their implementation and use. +The Java volatile keyword is used to mark a Java variable as "being stored in main memory". More precisely that means, that every read of a volatile variable will be read from the computer's main memory, and not from the CPU cache, and that every write to a volatile variable will be written to main memory, and not just to the CPU cache. -Java 5 comes with a built-in Semaphore so you don't have to implement your own. You can read more about it in the java.util.concurrent.Semaphore text, in my java.util.concurrent tutorial. +Actually, since Java 5 the volatile keyword guarantees more than just that volatile variables are written to and read from main memory. I will explain that in the following sections. -Simple Semaphore +##Java volatile Guarantees Variable Visibility -Here is a simple Semaphore implementation: +The Java volatile keyword guarantees visibility of changes to variables across threads. This may sound a bit abstract, so let me elaborate. -public class Semaphore { - private boolean signal = false; +In a multithreaded application where the threads operate on non-volatile variables, each thread may copy variables from main memory into a CPU cache while working on them, for performance reasons. If your computer contains more than one CPU, each thread may run on a different CPU. That means, that each thread may copy the variables into the CPU cache of different CPUs. This diagram illustrates such a situation: - public synchronized void take() { - this.signal = true; - this.notify(); - } +![enter image description here](http://tutorials.jenkov.com/images/java-concurrency/java-volatile-1.png) - public synchronized void release() throws InterruptedException{ - while(!this.signal) wait(); - this.signal = false; - } +With non-volatile variables there are no guarantees about when the Java Virtual Machine (JVM) reads data from main memory into CPU caches, or writes data from CPU caches to main memory. Let me explain what problems that can cause with an example: -} -The take() method sends a signal which is stored internally in the Semaphore. The release() method waits for a signal. When received the signal flag is cleared again, and the release() method exited. - -Using a semaphore like this you can avoid missed signals. You will call take() instead of notify() and release() instead of wait(). If the call to take() happens before the call to release() the thread calling release() will still know that take() was called, because the signal is stored internally in the signal variable. This is not the case with wait() and notify(). - -The names take() and release() may seem a bit odd when using a semaphore for signaling. The names origin from the use of semaphores as locks, as explained later in this text. In that case the names make more sense. - -Using Semaphores for Signaling +Imagine a situation in which two or more threads have access to a shared object which contains a counter variable declared like this: -Here is a simplified example of two threads signaling each other using a Semaphore: +public class SharedObject { -Semaphore semaphore = new Semaphore(); + public int counter = 0; -SendingThread sender = new SendingThread(semaphore); - -ReceivingThread receiver = new ReceivingThread(semaphore); +} +Thread 1 could read a shared counter variable with the value 0 into its CPU cache, increment it to 1 and not write the changed value back into main memory. Thread 2 could then read the same counter variable from main memory where the value of the variable is still 0, into its own CPU cache. Thread 2 could then also increment the counter to 1, and also not write it back to main memory. Thread 1 and Thread 2 are now practically out of sync. The real value of the shared counter variable should have been 2, but each of the threads has the value 1 for the variable in their CPU caches, and in main memory the value is still 0. It is a mess! Even if the threads eventually write their value for the shared counter variable back to main memory, the value will be wrong. -receiver.start(); -sender.start(); -public class SendingThread { - Semaphore semaphore = null; +By declaring the shared counter variable volatile the JVM guarantees that every read of the variable will always be read from main memory, and that all writes to the variable will always be written back to main memory. Here is how the volatile declaration looks: - public SendingThread(Semaphore semaphore){ - this.semaphore = semaphore; - } +public class SharedObject { - public void run(){ - while(true){ - //do something, then signal - this.semaphore.take(); + public volatile int counter = 0; - } - } -} -public class RecevingThread { - Semaphore semaphore = null; - - public ReceivingThread(Semaphore semaphore){ - this.semaphore = semaphore; - } - - public void run(){ - while(true){ - this.semaphore.release(); - //receive signal, then do something... - } - } } -Counting Semaphore +In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. -The Semaphore implementation in the previous section does not count the number of signals sent to it by take() method calls. We can change the Semaphore to do so. This is called a counting semaphore. Here is a simple implementation of a counting semaphore: +In the situation with the two threads reading and writing the same variable, simply declaring the variable volatile is not enough. Thread 1 may read the counter value 0 into a CPU register in CPU 1. At the same time (or right after) Thread 2 may read the counter value 0 into a CPU register in CPU 2. Both threads have read the value directly from main memory. Now both variables increase the value and writes the value back to main memory. They both increment their register version of counter to 1, and both write the value 1 back to main memory. The value should have been 2 after two increments. -public class CountingSemaphore { - private int signals = 0; +The problem with multiple threads that do not see the latest value of a variable because that value has not yet been written back to main memory by another thread, is called a "visibility" problem. The updates of one thread are not visible to other threads. - public synchronized void take() { - this.signals++; - this.notify(); - } +##The Java volatile Guarantee - public synchronized void release() throws InterruptedException{ - while(this.signals == 0) wait(); - this.signals--; - } +Since Java 5 the volatile keyword guarantees more than just the reading and writing of a variable from and to main memory. Actually, the volatile keyword guarantees this: -} -Bounded Semaphore - -The CoutingSemaphore has no upper bound on how many signals it can store. We can change the semaphore implementation to have an upper bound, like this: - -public class BoundedSemaphore { - private int signals = 0; - private int bound = 0; +If Thread A writes to a volatile variable and Thread B subsequently reads the same volatile variable, then all variables visible to Thread A before writing the volatile variable, will also be visible to Thread B. - public BoundedSemaphore(int upperBound){ - this.bound = upperBound; - } +The reading and writing instructions of volatile variables cannot be reordered by the JVM (the JVM may reorder instructions for performance reasons as long as the JVM detects no change in program behaviour from the reordering). Instructions before and after can be reordered, but the volatile read or write cannot be mixed with these instructions. Whatever instructions follow a read or write of a volatile variable are guaranteed to happen after the read or write. +Look at this example: - public synchronized void take() throws InterruptedException{ - while(this.signals == bound) wait(); - this.signals++; - this.notify(); - } +Thread A: + sharedObject.nonVolatile = 123; + sharedObject.counter = sharedObject.counter + 1; - public synchronized void release() throws InterruptedException{ - while(this.signals == 0) wait(); - this.signals--; - this.notify(); - } -} -Notice how the take() method now blocks if the number of signals is equal to the upper bound. Not until a thread has called release() will the thread calling take() be allowed to deliver its signal, if the BoundedSemaphore has reached its upper signal limit. - -Using Semaphores as Locks +Thread B: + int counter = sharedObject.counter; + int nonVolatile = sharedObject.nonVolatile; +Since Thread A writes the non-volatile variable sharedObject.nonVolatile before writing to the volatile sharedObject.counter, then both sharedObject.nonVolatile and sharedObject.counter are written to main memory. -It is possible to use a bounded semaphore as a lock. To do so, set the upper bound to 1, and have the call to take() and release() guard the critical section. Here is an example: +Since Thread B starts by reading the volatile sharedObject.counter, then both the sharedObject.counter and sharedObject.nonVolatile are read in from main memory. -BoundedSemaphore semaphore = new BoundedSemaphore(1); +The reading and writing of the non-volatile variable cannot be reordered to happen before or after the reading and writing of the volatile variable. -... +##When is volatile Enough? -semaphore.take(); +As I have mentioned earlier, if two threads are both reading and writing to a shared variable, then using the volatile keyword for that is not enough. You need to use synchronization in that case to guarantee that the reading and writing of the variable is atomic. -try{ - //critical section -} finally { - semaphore.release(); -} -In contrast to the signaling use case the methods take() and release() are now called by the same thread. Since only one thread is allowed to take the semaphore, all other threads calling take() will be blocked until release() is called. The call to release() will never block since there has always been a call to take() first. +But in case one thread reads and writes the value of a volatile variable, and other threads only read the variable, then the reading threads are guaranteed to see the latest value written to the volatile variable. Without making the variable volatile, this would not be guaranteed. -You can also use a bounded semaphore to limit the number of threads allowed into a section of code. For instance, in the example above, what would happen if you set the limit of the BoundedSemaphore to 5? 5 threads would be allowed to enter the critical section at a time. You would have to make sure though, that the thread operations do not conflict for these 5 threads, or you application will fail. +##Performance Considerations of volatile -The relase() method is called from inside a finally-block to make sure it is called even if an exception is thrown from the critical section. +Reading and writing of volatile variables causes the variable to be read or written to main memory. Reading from and writing to main memory is more expensive than accessing the CPU cache. Accessing volatile variables also prevent instruction reordering which is anormal performance enhancement techqniqe. Thus, you should only use volatile variables when you really need to enforce visibility of variables. From c091abd6ac30356a81d38424257d50e456ebd44a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 16 Sep 2014 09:35:03 +0800 Subject: [PATCH 261/524] Published with https://stackedit.io/ --- ...32\204volatile\345\205\263\351\224\256\345\255\227.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 588c4a0..d3315fa 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -4,7 +4,7 @@ The Java volatile keyword is used to mark a Java variable as "being stored in ma Actually, since Java 5 the volatile keyword guarantees more than just that volatile variables are written to and read from main memory. I will explain that in the following sections. -##Java volatile Guarantees Variable Visibility +##volatile保证变量可见性(Java volatile Guarantees Variable Visibility) The Java volatile keyword guarantees visibility of changes to variables across threads. This may sound a bit abstract, so let me elaborate. @@ -36,7 +36,7 @@ In the situation with the two threads reading and writing the same variable, sim The problem with multiple threads that do not see the latest value of a variable because that value has not yet been written back to main memory by another thread, is called a "visibility" problem. The updates of one thread are not visible to other threads. -##The Java volatile Guarantee +##valatile的保证(The Java volatile Guarantee) Since Java 5 the volatile keyword guarantees more than just the reading and writing of a variable from and to main memory. Actually, the volatile keyword guarantees this: @@ -58,13 +58,13 @@ Since Thread B starts by reading the volatile sharedObject.counter, then both th The reading and writing of the non-volatile variable cannot be reordered to happen before or after the reading and writing of the volatile variable. -##When is volatile Enough? +##volatile足够了吗?(When is volatile Enough?) As I have mentioned earlier, if two threads are both reading and writing to a shared variable, then using the volatile keyword for that is not enough. You need to use synchronization in that case to guarantee that the reading and writing of the variable is atomic. But in case one thread reads and writes the value of a volatile variable, and other threads only read the variable, then the reading threads are guaranteed to see the latest value written to the volatile variable. Without making the variable volatile, this would not be guaranteed. -##Performance Considerations of volatile +##volatile的性能考虑(Performance Considerations of volatile) Reading and writing of volatile variables causes the variable to be read or written to main memory. Reading from and writing to main memory is more expensive than accessing the CPU cache. Accessing volatile variables also prevent instruction reordering which is anormal performance enhancement techqniqe. Thus, you should only use volatile variables when you really need to enforce visibility of variables. From 66589d05e7d2886b4f7a425fddde9c802c86327b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 16:05:04 +0800 Subject: [PATCH 262/524] Published with https://stackedit.io/ --- ...7\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index d3315fa..348bdc5 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -4,6 +4,11 @@ The Java volatile keyword is used to mark a Java variable as "being stored in ma Actually, since Java 5 the volatile keyword guarantees more than just that volatile variables are written to and read from main memory. I will explain that in the following sections. +Java的volatile关键字是用来标记一个Java变量作为“被存储在主内存”。更确切地说,这意味着,一个volatile变量的每一个读操作将在电脑的主内存中读取,而不是从CPU高速缓存和每一个写入volatile变量将被写入主内存,而不是仅仅在CPU缓存。 + +事实上,从Java5 volatile关键字保证远远不止这些volatile变量写入,并从主内存中读取。我将解释在下面的章节。 + + ##volatile保证变量可见性(Java volatile Guarantees Variable Visibility) The Java volatile keyword guarantees visibility of changes to variables across threads. This may sound a bit abstract, so let me elaborate. From dbbe6ee61c6671cdb6db71e3bc0c79731b9a0af2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 16:29:27 +0800 Subject: [PATCH 263/524] Published with https://stackedit.io/ --- ...47\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 348bdc5..5bafbd5 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -1,8 +1,8 @@ #09.Java的volatile关键字 -The Java volatile keyword is used to mark a Java variable as "being stored in main memory". More precisely that means, that every read of a volatile variable will be read from the computer's main memory, and not from the CPU cache, and that every write to a volatile variable will be written to main memory, and not just to the CPU cache. +Java的**volatile**关键字用来标识让变量**像存储在主内存中一样** (The Java volatile keyword is used to mark a Java variable as "being stored in main memory". )。更准确地说,被volatile声明的变量,它们的读操作都是从**主内存**中而不是**CPU缓存**中读取,同时,以及它们的写操作,都会同时写到**主内存**和**CPU缓存**中。 -Actually, since Java 5 the volatile keyword guarantees more than just that volatile variables are written to and read from main memory. I will explain that in the following sections. +实际上,从Java 5开始,volatile关键字不仅仅只是保证变量从主内存中读取和写入。我会在接下来的章节进行详细讲解。 Java的volatile关键字是用来标记一个Java变量作为“被存储在主内存”。更确切地说,这意味着,一个volatile变量的每一个读操作将在电脑的主内存中读取,而不是从CPU高速缓存和每一个写入volatile变量将被写入主内存,而不是仅仅在CPU缓存。 From d1cc3a1fa9c36b4f9470149e181295a90c959bbb Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 17:06:05 +0800 Subject: [PATCH 264/524] Published with https://stackedit.io/ --- ...04volatile\345\205\263\351\224\256\345\255\227.md" | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 5bafbd5..63e2a46 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -4,19 +4,16 @@ Java的**volatile**关键字用来标识让变量**像存储在主内存中一 实际上,从Java 5开始,volatile关键字不仅仅只是保证变量从主内存中读取和写入。我会在接下来的章节进行详细讲解。 -Java的volatile关键字是用来标记一个Java变量作为“被存储在主内存”。更确切地说,这意味着,一个volatile变量的每一个读操作将在电脑的主内存中读取,而不是从CPU高速缓存和每一个写入volatile变量将被写入主内存,而不是仅仅在CPU缓存。 - -事实上,从Java5 volatile关键字保证远远不止这些volatile变量写入,并从主内存中读取。我将解释在下面的章节。 - - ##volatile保证变量可见性(Java volatile Guarantees Variable Visibility) -The Java volatile keyword guarantees visibility of changes to variables across threads. This may sound a bit abstract, so let me elaborate. +Java的volatile关键字保证了**线程间变量的可见性**。这听起来似乎很抽象, 让我来解释一下。 -In a multithreaded application where the threads operate on non-volatile variables, each thread may copy variables from main memory into a CPU cache while working on them, for performance reasons. If your computer contains more than one CPU, each thread may run on a different CPU. That means, that each thread may copy the variables into the CPU cache of different CPUs. This diagram illustrates such a situation: +在多线程的应用程序中,当多个线程对没有volatile关键字声明的变量进行操作时,基于性能考虑,每个线程都会从主内存中拷贝一份变量的值到CPU缓存里。如果你的计算器拥有多个CPU,那么每个线程都有可能使用不同的CPU运行。这意味着,每个线程都有可能拷贝一份数据到各自的CPU缓存中。这种情况如下图所示: ![enter image description here](http://tutorials.jenkov.com/images/java-concurrency/java-volatile-1.png) + + With non-volatile variables there are no guarantees about when the Java Virtual Machine (JVM) reads data from main memory into CPU caches, or writes data from CPU caches to main memory. Let me explain what problems that can cause with an example: Imagine a situation in which two or more threads have access to a shared object which contains a counter variable declared like this: From e3041c607f97c18f54d01000284f85a82341aff0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 17:09:21 +0800 Subject: [PATCH 265/524] Published with https://stackedit.io/ --- ...\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 63e2a46..f81c95e 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -12,9 +12,9 @@ Java的volatile关键字保证了**线程间变量的可见性**。这听起来 ![enter image description here](http://tutorials.jenkov.com/images/java-concurrency/java-volatile-1.png) +没有使用volatile声明的变量,将不能保证**JVM何时从主内存中读取数据到CPU缓存,以及何时从CPU缓冲中读取数据到内存**。让我解释一下这样会发生什么状况: -With non-volatile variables there are no guarantees about when the Java Virtual Machine (JVM) reads data from main memory into CPU caches, or writes data from CPU caches to main memory. Let me explain what problems that can cause with an example: Imagine a situation in which two or more threads have access to a shared object which contains a counter variable declared like this: From 672b273e2a10c3d22f2f9b5d7b20ca3fbd456aba Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 17:17:19 +0800 Subject: [PATCH 266/524] Published with https://stackedit.io/ --- ...04volatile\345\205\263\351\224\256\345\255\227.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index f81c95e..1199383 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -14,15 +14,16 @@ Java的volatile关键字保证了**线程间变量的可见性**。这听起来 没有使用volatile声明的变量,将不能保证**JVM何时从主内存中读取数据到CPU缓存,以及何时从CPU缓冲中读取数据到内存**。让我解释一下这样会发生什么状况: +想象这样一个场景:多个线程访问同一个共享对象,这个对象包含一个计数器变量: - -Imagine a situation in which two or more threads have access to a shared object which contains a counter variable declared like this: - +```Java public class SharedObject { - public int counter = 0; - } +``` + +线程1读取counter变量值0到CPU缓冲,同时对该变量加1,但并不立即写回主内存。线程2同样读取主内存中的counter变量值0到自己的CPU缓存中,线程2同样对这个值加1,同样也不立即写回主内存。 + Thread 1 could read a shared counter variable with the value 0 into its CPU cache, increment it to 1 and not write the changed value back into main memory. Thread 2 could then read the same counter variable from main memory where the value of the variable is still 0, into its own CPU cache. Thread 2 could then also increment the counter to 1, and also not write it back to main memory. Thread 1 and Thread 2 are now practically out of sync. The real value of the shared counter variable should have been 2, but each of the threads has the value 1 for the variable in their CPU caches, and in main memory the value is still 0. It is a mess! Even if the threads eventually write their value for the shared counter variable back to main memory, the value will be wrong. By declaring the shared counter variable volatile the JVM guarantees that every read of the variable will always be read from main memory, and that all writes to the variable will always be written back to main memory. Here is how the volatile declaration looks: From 1229ef3c784ba30e9de07edcc749fdd04de5fe60 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 17:23:29 +0800 Subject: [PATCH 267/524] Published with https://stackedit.io/ --- ...347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 1199383..50ca32d 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -22,9 +22,8 @@ public class SharedObject { } ``` -线程1读取counter变量值0到CPU缓冲,同时对该变量加1,但并不立即写回主内存。线程2同样读取主内存中的counter变量值0到自己的CPU缓存中,线程2同样对这个值加1,同样也不立即写回主内存。 +线程1读取counter变量值0到CPU缓存,同时对该变量加1,但并不立即写回主内存。线程2同样读取主内存中的counter变量值0到自己的CPU缓存中,同样对这个值加1,也不立即写回主内存。线程1和线程2实际上并不是同步的(Thread 1 and Thread 2 are now practically out of sync. )。此时,counter的正确值应该为2,而线程1和线程2在CPU缓存的值却是1,而主内存中counter的值目前仍然是0。这种情况是十分混乱的,即使线程将CPU缓存的值写回住内存中,这个值也是错误的。 -Thread 1 could read a shared counter variable with the value 0 into its CPU cache, increment it to 1 and not write the changed value back into main memory. Thread 2 could then read the same counter variable from main memory where the value of the variable is still 0, into its own CPU cache. Thread 2 could then also increment the counter to 1, and also not write it back to main memory. Thread 1 and Thread 2 are now practically out of sync. The real value of the shared counter variable should have been 2, but each of the threads has the value 1 for the variable in their CPU caches, and in main memory the value is still 0. It is a mess! Even if the threads eventually write their value for the shared counter variable back to main memory, the value will be wrong. By declaring the shared counter variable volatile the JVM guarantees that every read of the variable will always be read from main memory, and that all writes to the variable will always be written back to main memory. Here is how the volatile declaration looks: From 13117666bdd84cc44a47d6848101fbdf4f69a004 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 17:27:56 +0800 Subject: [PATCH 268/524] Published with https://stackedit.io/ --- ...204volatile\345\205\263\351\224\256\345\255\227.md" | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 50ca32d..c70a62e 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -24,14 +24,16 @@ public class SharedObject { 线程1读取counter变量值0到CPU缓存,同时对该变量加1,但并不立即写回主内存。线程2同样读取主内存中的counter变量值0到自己的CPU缓存中,同样对这个值加1,也不立即写回主内存。线程1和线程2实际上并不是同步的(Thread 1 and Thread 2 are now practically out of sync. )。此时,counter的正确值应该为2,而线程1和线程2在CPU缓存的值却是1,而主内存中counter的值目前仍然是0。这种情况是十分混乱的,即使线程将CPU缓存的值写回住内存中,这个值也是错误的。 +如果使用**volatile**关键字声明counter变量,JVM将会保证每次读取counter的值都会从主内存中读取,每次对counter变量的修改都会立即写回到主内存。 -By declaring the shared counter variable volatile the JVM guarantees that every read of the variable will always be read from main memory, and that all writes to the variable will always be written back to main memory. Here is how the volatile declaration looks: - +```Java public class SharedObject { - public volatile int counter = 0; - } +``` + + + In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. In the situation with the two threads reading and writing the same variable, simply declaring the variable volatile is not enough. Thread 1 may read the counter value 0 into a CPU register in CPU 1. At the same time (or right after) Thread 2 may read the counter value 0 into a CPU register in CPU 2. Both threads have read the value directly from main memory. Now both variables increase the value and writes the value back to main memory. They both increment their register version of counter to 1, and both write the value 1 back to main memory. The value should have been 2 after two increments. From cfdaf15b3866d96264f6ee9f9c08960bc8b1c168 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Sep 2014 17:44:23 +0800 Subject: [PATCH 269/524] Published with https://stackedit.io/ --- ...347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index c70a62e..50abfd6 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -31,11 +31,10 @@ public class SharedObject { public volatile int counter = 0; } ``` +In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. -In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. - In the situation with the two threads reading and writing the same variable, simply declaring the variable volatile is not enough. Thread 1 may read the counter value 0 into a CPU register in CPU 1. At the same time (or right after) Thread 2 may read the counter value 0 into a CPU register in CPU 2. Both threads have read the value directly from main memory. Now both variables increase the value and writes the value back to main memory. They both increment their register version of counter to 1, and both write the value 1 back to main memory. The value should have been 2 after two increments. The problem with multiple threads that do not see the latest value of a variable because that value has not yet been written back to main memory by another thread, is called a "visibility" problem. The updates of one thread are not visible to other threads. From 4d471656b05a2e72974d0b32158959003ef73770 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 09:20:43 +0800 Subject: [PATCH 270/524] Published with https://stackedit.io/ --- ...\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 50abfd6..2e8a466 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -33,7 +33,7 @@ public class SharedObject { ``` In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. - +在一些情况下,简单地将变量用volatile声明,已经足够让变量对多线程可见(每次线程读取的都是最新值,以及每次写操作都会立即让其他线程可见)。 In the situation with the two threads reading and writing the same variable, simply declaring the variable volatile is not enough. Thread 1 may read the counter value 0 into a CPU register in CPU 1. At the same time (or right after) Thread 2 may read the counter value 0 into a CPU register in CPU 2. Both threads have read the value directly from main memory. Now both variables increase the value and writes the value back to main memory. They both increment their register version of counter to 1, and both write the value 1 back to main memory. The value should have been 2 after two increments. From 6f4ec0b1aa16adbb5319c5b4f87fde2c7e3b5511 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 09:37:12 +0800 Subject: [PATCH 271/524] Published with https://stackedit.io/ --- ...\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 2e8a466..58eae58 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -24,7 +24,7 @@ public class SharedObject { 线程1读取counter变量值0到CPU缓存,同时对该变量加1,但并不立即写回主内存。线程2同样读取主内存中的counter变量值0到自己的CPU缓存中,同样对这个值加1,也不立即写回主内存。线程1和线程2实际上并不是同步的(Thread 1 and Thread 2 are now practically out of sync. )。此时,counter的正确值应该为2,而线程1和线程2在CPU缓存的值却是1,而主内存中counter的值目前仍然是0。这种情况是十分混乱的,即使线程将CPU缓存的值写回住内存中,这个值也是错误的。 -如果使用**volatile**关键字声明counter变量,JVM将会保证每次读取counter的值都会从主内存中读取,每次对counter变量的修改都会立即写回到主内存。 +如果使用**volatile**关键字声明counter变量,JVM将会保证每次读取counter的值都会从主内存中读取,每次对counter变量的修改都会立即写回到主内存。 ```Java public class SharedObject { @@ -33,7 +33,9 @@ public class SharedObject { ``` In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. -在一些情况下,简单地将变量用volatile声明,已经足够让变量对多线程可见(每次线程读取的都是最新值,以及每次写操作都会立即让其他线程可见)。 +在一些情况下,简单地用volatile声明变量,已经足够让变量对多线程可见(每次线程读取的都是最新值,以及每次写操作都会立即让其他线程可见)。 + +然而,在另一些情况下,简单地用volatile声明变量,并不能保证让变量对多线程可见。线程1读取counter的值0到CPU1的寄存器中,于此同时(或紧接着)线程2读取counter的值0到CPU2的寄存器中。两个线程都是直接从主内存中读取counter的值。然后,两个线程分别对counter的值加1,并写回主内存中。经过加1后,两个寄存器中的值都是1,并且把这个值写回主内存中。然而counter的正确值应该为2 。 In the situation with the two threads reading and writing the same variable, simply declaring the variable volatile is not enough. Thread 1 may read the counter value 0 into a CPU register in CPU 1. At the same time (or right after) Thread 2 may read the counter value 0 into a CPU register in CPU 2. Both threads have read the value directly from main memory. Now both variables increase the value and writes the value back to main memory. They both increment their register version of counter to 1, and both write the value 1 back to main memory. The value should have been 2 after two increments. From 4c908f80933ec04d89796e3d4e583635941af4fc Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 09:41:09 +0800 Subject: [PATCH 272/524] Published with https://stackedit.io/ --- ...47\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 58eae58..ad3bfac 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -33,9 +33,9 @@ public class SharedObject { ``` In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. -在一些情况下,简单地用volatile声明变量,已经足够让变量对多线程可见(每次线程读取的都是最新值,以及每次写操作都会立即让其他线程可见)。 +在一些情况下,简单地用volatile声明变量,也许已经足够让多个线程每次读取的都是变量的最新值。 -然而,在另一些情况下,简单地用volatile声明变量,并不能保证让变量对多线程可见。线程1读取counter的值0到CPU1的寄存器中,于此同时(或紧接着)线程2读取counter的值0到CPU2的寄存器中。两个线程都是直接从主内存中读取counter的值。然后,两个线程分别对counter的值加1,并写回主内存中。经过加1后,两个寄存器中的值都是1,并且把这个值写回主内存中。然而counter的正确值应该为2 。 +然而,在另一些情况下,当两个线程都对变量读取和写入时,volatile并不足够。线程1读取counter的值0到CPU1的寄存器中,于此同时(或紧接着)线程2读取counter的值0到CPU2的寄存器中。两个线程都是直接从主内存中读取counter的值。然后,两个线程分别对counter的值加1,并写回主内存中。经过加1后,两个寄存器中的值都是1,并且把这个值写回主内存中。然而counter的正确值应该为2 。 In the situation with the two threads reading and writing the same variable, simply declaring the variable volatile is not enough. Thread 1 may read the counter value 0 into a CPU register in CPU 1. At the same time (or right after) Thread 2 may read the counter value 0 into a CPU register in CPU 2. Both threads have read the value directly from main memory. Now both variables increase the value and writes the value back to main memory. They both increment their register version of counter to 1, and both write the value 1 back to main memory. The value should have been 2 after two increments. From 3f9dd7c3766db5427f28a274fb2769ff0c32ce94 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 09:45:28 +0800 Subject: [PATCH 273/524] Published with https://stackedit.io/ --- ...7\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index ad3bfac..a27b809 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -31,12 +31,15 @@ public class SharedObject { public volatile int counter = 0; } ``` -In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. 在一些情况下,简单地用volatile声明变量,也许已经足够让多个线程每次读取的都是变量的最新值。 然而,在另一些情况下,当两个线程都对变量读取和写入时,volatile并不足够。线程1读取counter的值0到CPU1的寄存器中,于此同时(或紧接着)线程2读取counter的值0到CPU2的寄存器中。两个线程都是直接从主内存中读取counter的值。然后,两个线程分别对counter的值加1,并写回主内存中。经过加1后,两个寄存器中的值都是1,并且把这个值写回主内存中。然而counter的正确值应该为2 。 +上述问题中,多个线程并没有读取到变量的最新值,是因为其他线程还没将寄存器的值写回主内存,这就是“** 可见性**”问题。一个线程的更新对其他线程不可见。 + +In some cases simply declaring a variable volatile may be enough to assure that multiple threads accessing the variable see the latest written value. I will get back to which cases volatile is sufficient later. + In the situation with the two threads reading and writing the same variable, simply declaring the variable volatile is not enough. Thread 1 may read the counter value 0 into a CPU register in CPU 1. At the same time (or right after) Thread 2 may read the counter value 0 into a CPU register in CPU 2. Both threads have read the value directly from main memory. Now both variables increase the value and writes the value back to main memory. They both increment their register version of counter to 1, and both write the value 1 back to main memory. The value should have been 2 after two increments. The problem with multiple threads that do not see the latest value of a variable because that value has not yet been written back to main memory by another thread, is called a "visibility" problem. The updates of one thread are not visible to other threads. From d1d1a06da84fd246833271e2118e07f9cdcbc523 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 09:50:45 +0800 Subject: [PATCH 274/524] Published with https://stackedit.io/ --- ...232\204volatile\345\205\263\351\224\256\345\255\227.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index a27b809..28c8ace 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -46,6 +46,10 @@ The problem with multiple threads that do not see the latest value of a variable ##valatile的保证(The Java volatile Guarantee) +从Java 5之后,volatile关键字不仅仅只是保证每次都是从主内存中读取和写入数据。实际上volatile关键字保证: + +> 如果线程A对volatile变量进行修改,紧接着线程B对这个变量进行读取, + Since Java 5 the volatile keyword guarantees more than just the reading and writing of a variable from and to main memory. Actually, the volatile keyword guarantees this: If Thread A writes to a volatile variable and Thread B subsequently reads the same volatile variable, then all variables visible to Thread A before writing the volatile variable, will also be visible to Thread B. @@ -53,6 +57,7 @@ If Thread A writes to a volatile variable and Thread B subsequently reads the sa The reading and writing instructions of volatile variables cannot be reordered by the JVM (the JVM may reorder instructions for performance reasons as long as the JVM detects no change in program behaviour from the reordering). Instructions before and after can be reordered, but the volatile read or write cannot be mixed with these instructions. Whatever instructions follow a read or write of a volatile variable are guaranteed to happen after the read or write. Look at this example: +```Java Thread A: sharedObject.nonVolatile = 123; sharedObject.counter = sharedObject.counter + 1; @@ -60,6 +65,8 @@ Thread A: Thread B: int counter = sharedObject.counter; int nonVolatile = sharedObject.nonVolatile; +``` + Since Thread A writes the non-volatile variable sharedObject.nonVolatile before writing to the volatile sharedObject.counter, then both sharedObject.nonVolatile and sharedObject.counter are written to main memory. Since Thread B starts by reading the volatile sharedObject.counter, then both the sharedObject.counter and sharedObject.nonVolatile are read in from main memory. From 166efaaae04907a7025c00c7c29a9aee6697aa60 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 09:56:53 +0800 Subject: [PATCH 275/524] Published with https://stackedit.io/ --- ...32\204volatile\345\205\263\351\224\256\345\255\227.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 28c8ace..bbcde8e 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -1,5 +1,7 @@ #09.Java的volatile关键字 +未完,有疑惑,待续! + Java的**volatile**关键字用来标识让变量**像存储在主内存中一样** (The Java volatile keyword is used to mark a Java variable as "being stored in main memory". )。更准确地说,被volatile声明的变量,它们的读操作都是从**主内存**中而不是**CPU缓存**中读取,同时,以及它们的写操作,都会同时写到**主内存**和**CPU缓存**中。 实际上,从Java 5开始,volatile关键字不仅仅只是保证变量从主内存中读取和写入。我会在接下来的章节进行详细讲解。 @@ -48,11 +50,7 @@ The problem with multiple threads that do not see the latest value of a variable 从Java 5之后,volatile关键字不仅仅只是保证每次都是从主内存中读取和写入数据。实际上volatile关键字保证: -> 如果线程A对volatile变量进行修改,紧接着线程B对这个变量进行读取, - -Since Java 5 the volatile keyword guarantees more than just the reading and writing of a variable from and to main memory. Actually, the volatile keyword guarantees this: - -If Thread A writes to a volatile variable and Thread B subsequently reads the same volatile variable, then all variables visible to Thread A before writing the volatile variable, will also be visible to Thread B. +> If Thread A writes to a volatile variable and Thread B subsequently reads the same volatile variable, then all variables visible to Thread A before writing the volatile variable, will also be visible to Thread B. The reading and writing instructions of volatile variables cannot be reordered by the JVM (the JVM may reorder instructions for performance reasons as long as the JVM detects no change in program behaviour from the reordering). Instructions before and after can be reordered, but the volatile read or write cannot be mixed with these instructions. Whatever instructions follow a read or write of a volatile variable are guaranteed to happen after the read or write. Look at this example: From 4e8ab0cbaac2cb16c098a67050d32443d9cb586a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 10:01:43 +0800 Subject: [PATCH 276/524] Published with https://stackedit.io/ --- ...7\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index bbcde8e..5534dd9 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -73,6 +73,11 @@ The reading and writing of the non-volatile variable cannot be reordered to happ ##volatile足够了吗?(When is volatile Enough?) +正如前面我所提到的,当两个线程都对共享变量进行读取和写入时,使用volatile关键字是不足够的。你需要 +对变量的读取和写入进行同步,保证这些操作都是原子性的。 + + + As I have mentioned earlier, if two threads are both reading and writing to a shared variable, then using the volatile keyword for that is not enough. You need to use synchronization in that case to guarantee that the reading and writing of the variable is atomic. But in case one thread reads and writes the value of a volatile variable, and other threads only read the variable, then the reading threads are guaranteed to see the latest value written to the volatile variable. Without making the variable volatile, this would not be guaranteed. From 3783cca7f95a384997ece04dc7fc616354c978ad Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 10:04:06 +0800 Subject: [PATCH 277/524] Published with https://stackedit.io/ --- ...\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 5534dd9..fc2c43e 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -76,7 +76,7 @@ The reading and writing of the non-volatile variable cannot be reordered to happ 正如前面我所提到的,当两个线程都对共享变量进行读取和写入时,使用volatile关键字是不足够的。你需要 对变量的读取和写入进行同步,保证这些操作都是原子性的。 - +当如果只有一个线程对变量进行读取和写入,而其它线程都只对变量进行读取,那么就可以保证读线程每次读到的都是volatile变量的最新值。如果没有volatile关键字,这些都是不可以保证的。 As I have mentioned earlier, if two threads are both reading and writing to a shared variable, then using the volatile keyword for that is not enough. You need to use synchronization in that case to guarantee that the reading and writing of the variable is atomic. From 03049be504cf35ef7b2cbb489f41e2e355a206cd Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 10:08:31 +0800 Subject: [PATCH 278/524] Published with https://stackedit.io/ --- ...\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index fc2c43e..68a6eb8 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -84,5 +84,7 @@ But in case one thread reads and writes the value of a volatile variable, and ot ##volatile的性能考虑(Performance Considerations of volatile) +volatile关键字保证变量的读取和写入都会在主内存中进行。相比从CPU缓存中读取和写入数据,在主内存中读取和写入数据是相对比较消耗性能的。 + Reading and writing of volatile variables causes the variable to be read or written to main memory. Reading from and writing to main memory is more expensive than accessing the CPU cache. Accessing volatile variables also prevent instruction reordering which is anormal performance enhancement techqniqe. Thus, you should only use volatile variables when you really need to enforce visibility of variables. From 73263be006bf23b433743d14ba09dac4991327aa Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 10:12:35 +0800 Subject: [PATCH 279/524] Published with https://stackedit.io/ --- ...\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" index 68a6eb8..4cf1bfb 100644 --- "a/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/Java-Concurrency/09.Java\347\232\204volatile\345\205\263\351\224\256\345\255\227.md" @@ -84,7 +84,7 @@ But in case one thread reads and writes the value of a volatile variable, and ot ##volatile的性能考虑(Performance Considerations of volatile) -volatile关键字保证变量的读取和写入都会在主内存中进行。相比从CPU缓存中读取和写入数据,在主内存中读取和写入数据是相对比较消耗性能的。 +volatile关键字保证变量的读取和写入都会在主内存中进行。相比从CPU缓存中读取和写入数据,在主内存中读取和写入数据是相对比较消耗性能的。volatile关键字会阻止指令重排(指令重排是很常见的用于增强性能的技术)。因此,只有当真正需要让变量强制可见时才使用volatile关键字。 Reading and writing of volatile variables causes the variable to be read or written to main memory. Reading from and writing to main memory is more expensive than accessing the CPU cache. Accessing volatile variables also prevent instruction reordering which is anormal performance enhancement techqniqe. Thus, you should only use volatile variables when you really need to enforce visibility of variables. From b4e70d431296d5e6a5106604e8e66a0f7c76c8b4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 10:14:24 +0800 Subject: [PATCH 280/524] Published with https://stackedit.io/ From e1cf2a3b7adb57b3e45d9bafaabe27dcc597e88d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 14:27:30 +0800 Subject: [PATCH 281/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 122 +++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 "Java-Security/01.\351\224\201.md" diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" new file mode 100644 index 0000000..21c5b6a --- /dev/null +++ "b/Java-Security/01.\351\224\201.md" @@ -0,0 +1,122 @@ +#锁 + +##Do not synchronize on objects that may be reused + +Misuse of synchronization primitives is a common source of concurrency issues. Synchronizing on objects that may be reused can result in deadlock and nondeterministic behavior. Consequently, programs must never synchronize on objects that may be reused. +Noncompliant Code Example (Boolean Lock Object) +This noncompliant code example synchronizes on a Boolean lock object. + +``` +private final Boolean initialized = Boolean.FALSE; + +public void doSomething() { + synchronized (initialized) { + // ... + } +} +``` + +The Boolean type is unsuitable for locking purposes because it allows only two values: true and false. Boolean literals containing the same value share unique instances of the Boolean class in the Java Virtual Machine (JVM). In this example, initialized refers to the instance corresponding to the value Boolean.FALSE. If any other code were to inadvertently synchronize on a Boolean literal with this value, the lock instance would be reused and the system could become unresponsive or could deadlock. +Noncompliant Code Example (Boxed Primitive) +This noncompliant code example locks on a boxed Integer object. +private int count = 0; +private final Integer Lock = count; // Boxed primitive Lock is shared + +public void doSomething() { + synchronized (Lock) { + count++; + // ... + } +} +Boxed types may use the same instance for a range of integer values; consequently, they suffer from the same reuse problem as Boolean constants. The wrapper object are reused when the value can be represented as a byte; JVM implementations are also permitted to reuse wrapper objects for larger ranges of values. While use of the intrinsic lock associated with the boxed Integer wrapper object is insecure; instances of the Integer object constructed using the new operator (new Integer(value)) are unique and not reused. In general, locks on any data type that contains a boxed value are insecure. +Compliant Solution (Integer) +This compliant solution locks on a nonboxed Integer, using a variant of the private lock object idiom. The doSomething() method synchronizes using the intrinsic lock of the Integer instance, Lock. +private int count = 0; +private final Integer Lock = new Integer(count); + +public void doSomething() { + synchronized (Lock) { + count++; + // ... + } +} +When explicitly constructed, an Integer object has a unique reference and its own intrinsic lock that is distinct not only from other Integer objects, but also from boxed integers that have the same value. While this is an acceptable solution, it can cause maintenance problems because developers can incorrectly assume that boxed integers are also appropriate lock objects. A more appropriate solution is to synchronize on a private final lock object as described in the final compliant solution for this rule. +Noncompliant Code Example (Interned String Object) +This noncompliant code example locks on an interned String object. +private final String lock = new String("LOCK").intern(); + +public void doSomething() { + synchronized (lock) { + // ... + } +} +According to the Java API class java.lang.String documentation [API 2006]: +When the intern() method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. +Consequently, an interned String object behaves like a global variable in the JVM. As demonstrated in this noncompliant code example, even when every instance of an object maintains its own lock field, the fields all refer to a common String constant. Locking on String constants has the same reuse problem as locking on Boolean constants. +Additionally, hostile code from any other package can exploit this vulnerability, if the class is accessible. See rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code for more information. +Noncompliant Code Example (String Literal) +This noncompliant code example locks on a final String literal. +// This bug was found in jetty-6.1.3 BoundedThreadPool +private final String lock = "LOCK"; + +public void doSomething() { + synchronized (lock) { + // ... + } +} +String literals are constant and are automatically interned. Consequently, this example suffers from the same pitfalls as the preceding noncompliant code example. +Compliant Solution (String Instance) +This compliant solution locks on a noninterned String instance. +private final String lock = new String("LOCK"); + +public void doSomething() { + synchronized (lock) { + // ... + } +} +A String instance differs from a String literal. The instance has a unique reference and its own intrinsic lock that is distinct from other String object instances or literals. Nevertheless, a better approach is to synchronize on a private final lock object, as shown in the following compliant solution. +Compliant Solution (Private Final Lock Object) +This compliant solution synchronizes on a private final lock object. This is one of the few cases in which a java.lang.Object instance is useful. +private final Object lock = new Object(); + +public void doSomething() { + synchronized (lock) { + // ... + } +} +For more information on using an Object as a lock, see rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code. +Risk Assessment +A significant number of concurrency vulnerabilities arise from locking on the wrong kind of object. It is important to consider the properties of the lock object rather than simply scavenging for objects on which to synchronize. +Rule +Severity +Likelihood +Remediation Cost +Priority +Level +LCK01-J +medium +probable +medium +P8 +L2 +Automated Detection +Some static analysis tools can detect violations of this rule. +Tool +Version +Checker +Description +ThreadSafe 1.3 +CCE_CC_REUSEDOBJ_SYNC +Implemented +Bibliography +[API 2006] +Class String, Collections +[Findbugs 2008] + +[Miller 2009] +Locking +[Pugh 2008] +Synchronization +[Tutorials 2008] +Wrapper Implementations + \ No newline at end of file From 6b598b57ad417ecfcef00592ca3b7c88dcf467e0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 14:28:02 +0800 Subject: [PATCH 282/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 21c5b6a..1b84b86 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -1,9 +1,9 @@ -#锁 +#01.锁 ##Do not synchronize on objects that may be reused Misuse of synchronization primitives is a common source of concurrency issues. Synchronizing on objects that may be reused can result in deadlock and nondeterministic behavior. Consequently, programs must never synchronize on objects that may be reused. -Noncompliant Code Example (Boolean Lock Object) +Noncompliant Code Example (Boolean Lock Object)01. This noncompliant code example synchronizes on a Boolean lock object. ``` From d02b65e63ff331a2da1ec6ff56b091588495c647 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 14:33:37 +0800 Subject: [PATCH 283/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 1b84b86..93b45da 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -1,6 +1,6 @@ #01.锁 -##Do not synchronize on objects that may be reused +##不要在可重用的对象上加锁 Misuse of synchronization primitives is a common source of concurrency issues. Synchronizing on objects that may be reused can result in deadlock and nondeterministic behavior. Consequently, programs must never synchronize on objects that may be reused. Noncompliant Code Example (Boolean Lock Object)01. @@ -8,7 +8,6 @@ This noncompliant code example synchronizes on a Boolean lock object. ``` private final Boolean initialized = Boolean.FALSE; - public void doSomething() { synchronized (initialized) { // ... @@ -119,4 +118,9 @@ Locking Synchronization [Tutorials 2008] Wrapper Implementations + + +---------- + + \ No newline at end of file From 76e719698e7e68792277c106872eb4635cba2fe0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 15:00:52 +0800 Subject: [PATCH 284/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 93b45da..2264052 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -2,9 +2,7 @@ ##不要在可重用的对象上加锁 -Misuse of synchronization primitives is a common source of concurrency issues. Synchronizing on objects that may be reused can result in deadlock and nondeterministic behavior. Consequently, programs must never synchronize on objects that may be reused. -Noncompliant Code Example (Boolean Lock Object)01. -This noncompliant code example synchronizes on a Boolean lock object. +不要在可重用的对象上加锁,如果你这样做了,可能导致死锁或其他不可预测的行为。例如下面这个例子: ``` private final Boolean initialized = Boolean.FALSE; @@ -15,12 +13,34 @@ public void doSomething() { } ``` +在这个例子里,Boolean类型并不适合加锁。Boolean.TRUE或Boolean.FALSE都是指向同一个Boolean实例对象。因此,假如其他线程也在Boolean类型上加锁,则可能导致死锁或其他不预测的行为。 + +同样的例子,还有Integer类型,String字面量: + +``` +private final Integer lock = new Integer(10); +public void doSomething() { + synchronized (lock) { + // ... + } +} +``` + +``` +private final String lock = "lock"; +public void doSomething() { + synchronized (lock) { + // ... + } +} +``` + + The Boolean type is unsuitable for locking purposes because it allows only two values: true and false. Boolean literals containing the same value share unique instances of the Boolean class in the Java Virtual Machine (JVM). In this example, initialized refers to the instance corresponding to the value Boolean.FALSE. If any other code were to inadvertently synchronize on a Boolean literal with this value, the lock instance would be reused and the system could become unresponsive or could deadlock. Noncompliant Code Example (Boxed Primitive) This noncompliant code example locks on a boxed Integer object. private int count = 0; private final Integer Lock = count; // Boxed primitive Lock is shared - public void doSomething() { synchronized (Lock) { count++; From 5bda3d8d70d7c6d9e6cc1eeeebb8ca89f1d340a6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 15:01:43 +0800 Subject: [PATCH 285/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 2264052..a5bbcd1 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -4,10 +4,10 @@ 不要在可重用的对象上加锁,如果你这样做了,可能导致死锁或其他不可预测的行为。例如下面这个例子: -``` -private final Boolean initialized = Boolean.FALSE; +```Java +private final Boolean lock= Boolean.FALSE; public void doSomething() { - synchronized (initialized) { + synchronized (lock) { // ... } } @@ -17,7 +17,7 @@ public void doSomething() { 同样的例子,还有Integer类型,String字面量: -``` +```Java private final Integer lock = new Integer(10); public void doSomething() { synchronized (lock) { @@ -26,7 +26,7 @@ public void doSomething() { } ``` -``` +```Java private final String lock = "lock"; public void doSomething() { synchronized (lock) { From af3c4008b340831c24c64e69375bf6fa342fa431 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 15:45:33 +0800 Subject: [PATCH 286/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index a5bbcd1..141e119 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -2,7 +2,9 @@ ##不要在可重用的对象上加锁 -不要在可重用的对象上加锁,如果你这样做了,可能导致死锁或其他不可预测的行为。例如下面这个例子: +不要在可重用的对象上加锁,如果你这样做了,可能导致死锁或其他不可预测的行为。 + +###不合规的代码(Boolean类型锁) ```Java private final Boolean lock= Boolean.FALSE; @@ -26,6 +28,8 @@ public void doSomething() { } ``` + + ```Java private final String lock = "lock"; public void doSomething() { From d5b29e571b26434cd9899afdd1dbea3105a2fe18 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 15:46:09 +0800 Subject: [PATCH 287/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 141e119..0e204ce 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -4,7 +4,7 @@ 不要在可重用的对象上加锁,如果你这样做了,可能导致死锁或其他不可预测的行为。 -###不合规的代码(Boolean类型锁) +####不合规的代码(Boolean类型锁) ```Java private final Boolean lock= Boolean.FALSE; From 1810a1c90a08ae8f27e4cbdde303f22e3e6913c5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 15:47:17 +0800 Subject: [PATCH 288/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 0e204ce..141e119 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -4,7 +4,7 @@ 不要在可重用的对象上加锁,如果你这样做了,可能导致死锁或其他不可预测的行为。 -####不合规的代码(Boolean类型锁) +###不合规的代码(Boolean类型锁) ```Java private final Boolean lock= Boolean.FALSE; From 734923b9701346a88113571d4725f70446155152 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:00:19 +0800 Subject: [PATCH 289/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 141e119..ae02670 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -4,7 +4,9 @@ 不要在可重用的对象上加锁,如果你这样做了,可能导致死锁或其他不可预测的行为。 -###不合规的代码(Boolean类型锁) +####不合规的代码(Boolean类型锁) + +下面的代码在Boolean类型上加锁: ```Java private final Boolean lock= Boolean.FALSE; @@ -15,6 +17,10 @@ public void doSomething() { } ``` +Boolean类型对象并不适合加锁,因为它只有两个值:`true`和`false`。在JVM中,Boolean类型的两个字面量值都分别都指向同一个共享对象。在这里例子中,lock指向JVM中的一个Boolean.FALSE实例,而这个实例的所有线程共享的。如果有其他的线程不注意地也使用了Boolean.FALSE进行加锁,就可能导致死锁或不可预测的行为。 + + + 在这个例子里,Boolean类型并不适合加锁。Boolean.TRUE或Boolean.FALSE都是指向同一个Boolean实例对象。因此,假如其他线程也在Boolean类型上加锁,则可能导致死锁或其他不预测的行为。 同样的例子,还有Integer类型,String字面量: From 5dca9ff3798ce0343808512bc5622ac82371c2a5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:02:12 +0800 Subject: [PATCH 290/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 33 +++++------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index ae02670..762cd20 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -19,44 +19,21 @@ public void doSomething() { Boolean类型对象并不适合加锁,因为它只有两个值:`true`和`false`。在JVM中,Boolean类型的两个字面量值都分别都指向同一个共享对象。在这里例子中,lock指向JVM中的一个Boolean.FALSE实例,而这个实例的所有线程共享的。如果有其他的线程不注意地也使用了Boolean.FALSE进行加锁,就可能导致死锁或不可预测的行为。 +####不合规的代码(Integer的自动装箱) - -在这个例子里,Boolean类型并不适合加锁。Boolean.TRUE或Boolean.FALSE都是指向同一个Boolean实例对象。因此,假如其他线程也在Boolean类型上加锁,则可能导致死锁或其他不预测的行为。 - -同样的例子,还有Integer类型,String字面量: - -```Java -private final Integer lock = new Integer(10); -public void doSomething() { - synchronized (lock) { - // ... - } -} -``` - - +This noncompliant code example locks on a boxed Integer object. ```Java -private final String lock = "lock"; +private int count = 0; +private final Integer lock = 0; // Boxed primitive lock is shared public void doSomething() { synchronized (lock) { + count++; // ... } } ``` - -The Boolean type is unsuitable for locking purposes because it allows only two values: true and false. Boolean literals containing the same value share unique instances of the Boolean class in the Java Virtual Machine (JVM). In this example, initialized refers to the instance corresponding to the value Boolean.FALSE. If any other code were to inadvertently synchronize on a Boolean literal with this value, the lock instance would be reused and the system could become unresponsive or could deadlock. -Noncompliant Code Example (Boxed Primitive) -This noncompliant code example locks on a boxed Integer object. -private int count = 0; -private final Integer Lock = count; // Boxed primitive Lock is shared -public void doSomething() { - synchronized (Lock) { - count++; - // ... - } -} Boxed types may use the same instance for a range of integer values; consequently, they suffer from the same reuse problem as Boolean constants. The wrapper object are reused when the value can be represented as a byte; JVM implementations are also permitted to reuse wrapper objects for larger ranges of values. While use of the intrinsic lock associated with the boxed Integer wrapper object is insecure; instances of the Integer object constructed using the new operator (new Integer(value)) are unique and not reused. In general, locks on any data type that contains a boxed value are insecure. Compliant Solution (Integer) This compliant solution locks on a nonboxed Integer, using a variant of the private lock object idiom. The doSomething() method synchronizes using the intrinsic lock of the Integer instance, Lock. From 5611f36f57ce0a622587ee13eb889a86e9280e66 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:04:47 +0800 Subject: [PATCH 291/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 762cd20..38476e8 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -21,7 +21,7 @@ Boolean类型对象并不适合加锁,因为它只有两个值:`true`和`fal ####不合规的代码(Integer的自动装箱) -This noncompliant code example locks on a boxed Integer object. +这个例子中的不合规代码在自动装箱的Integer类型上加锁: ```Java private int count = 0; @@ -34,6 +34,8 @@ public void doSomething() { } ``` + + Boxed types may use the same instance for a range of integer values; consequently, they suffer from the same reuse problem as Boolean constants. The wrapper object are reused when the value can be represented as a byte; JVM implementations are also permitted to reuse wrapper objects for larger ranges of values. While use of the intrinsic lock associated with the boxed Integer wrapper object is insecure; instances of the Integer object constructed using the new operator (new Integer(value)) are unique and not reused. In general, locks on any data type that contains a boxed value are insecure. Compliant Solution (Integer) This compliant solution locks on a nonboxed Integer, using a variant of the private lock object idiom. The doSomething() method synchronizes using the intrinsic lock of the Integer instance, Lock. From 7c3d51122e2d99f931c90412c8cfdd701fbf930b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:06:28 +0800 Subject: [PATCH 292/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 38476e8..b2a2337 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -24,7 +24,6 @@ Boolean类型对象并不适合加锁,因为它只有两个值:`true`和`fal 这个例子中的不合规代码在自动装箱的Integer类型上加锁: ```Java -private int count = 0; private final Integer lock = 0; // Boxed primitive lock is shared public void doSomething() { synchronized (lock) { @@ -34,7 +33,7 @@ public void doSomething() { } ``` - + 自动装箱的Integer对象,在一定范围内是共享的( 这个范围是-128到127)。 Boxed types may use the same instance for a range of integer values; consequently, they suffer from the same reuse problem as Boolean constants. The wrapper object are reused when the value can be represented as a byte; JVM implementations are also permitted to reuse wrapper objects for larger ranges of values. While use of the intrinsic lock associated with the boxed Integer wrapper object is insecure; instances of the Integer object constructed using the new operator (new Integer(value)) are unique and not reused. In general, locks on any data type that contains a boxed value are insecure. Compliant Solution (Integer) From 7ce223519e9737f5e06846f9426f08fa424b4c7a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:26:52 +0800 Subject: [PATCH 293/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index b2a2337..c5e88f6 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -33,10 +33,12 @@ public void doSomething() { } ``` - 自动装箱的Integer对象,在一定范围内是共享的( 这个范围是-128到127)。 +自动装箱的Integer对象,在一定范围内是共享的( 这个范围是-128到127),因此,这会导致跟Boolean常量一样的问题。JVM的常量池中缓存了Integer(-128)到Integer(127)这个范围的Integer对象,在这个范围内的自动装箱Integer对象,都是从这个常量池中共享这些对象。有一些JVM实现也允许大于这个范围的Integer常量池。所以,在自动装箱的对象上加锁是不安全的。而使用`new Integer(value)`创建的Integer实例对象是不共享的。**一般来说,在自动装箱的数据类型上加锁都是不可取和不安全的。** + +####解决方案(Integer) + + -Boxed types may use the same instance for a range of integer values; consequently, they suffer from the same reuse problem as Boolean constants. The wrapper object are reused when the value can be represented as a byte; JVM implementations are also permitted to reuse wrapper objects for larger ranges of values. While use of the intrinsic lock associated with the boxed Integer wrapper object is insecure; instances of the Integer object constructed using the new operator (new Integer(value)) are unique and not reused. In general, locks on any data type that contains a boxed value are insecure. -Compliant Solution (Integer) This compliant solution locks on a nonboxed Integer, using a variant of the private lock object idiom. The doSomething() method synchronizes using the intrinsic lock of the Integer instance, Lock. private int count = 0; private final Integer Lock = new Integer(count); From dacc92c9ef61f63938ecc7f0aee4d7442d3c9ba2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:34:30 +0800 Subject: [PATCH 294/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index c5e88f6..ca1a4ff 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -24,7 +24,8 @@ Boolean类型对象并不适合加锁,因为它只有两个值:`true`和`fal 这个例子中的不合规代码在自动装箱的Integer类型上加锁: ```Java -private final Integer lock = 0; // Boxed primitive lock is shared +private int = 0; +private final Integer lock = count; // Boxed primitive lock is shared public void doSomething() { synchronized (lock) { count++; @@ -37,18 +38,22 @@ public void doSomething() { ####解决方案(Integer) +上面例子的解决方法就是在非装箱的Integer对象上加锁。如下面的代码所示: - -This compliant solution locks on a nonboxed Integer, using a variant of the private lock object idiom. The doSomething() method synchronizes using the intrinsic lock of the Integer instance, Lock. +```Java private int count = 0; -private final Integer Lock = new Integer(count); +private final Integer lock = new Integer(count); public void doSomething() { - synchronized (Lock) { + synchronized (lock) { count++; // ... } } +``` + + + When explicitly constructed, an Integer object has a unique reference and its own intrinsic lock that is distinct not only from other Integer objects, but also from boxed integers that have the same value. While this is an acceptable solution, it can cause maintenance problems because developers can incorrectly assume that boxed integers are also appropriate lock objects. A more appropriate solution is to synchronize on a private final lock object as described in the final compliant solution for this rule. Noncompliant Code Example (Interned String Object) This noncompliant code example locks on an interned String object. From c22e62e7c826c37f8fddb92ca09d80b237e40da7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:45:44 +0800 Subject: [PATCH 295/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index ca1a4ff..cfa116a 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -19,7 +19,7 @@ public void doSomething() { Boolean类型对象并不适合加锁,因为它只有两个值:`true`和`false`。在JVM中,Boolean类型的两个字面量值都分别都指向同一个共享对象。在这里例子中,lock指向JVM中的一个Boolean.FALSE实例,而这个实例的所有线程共享的。如果有其他的线程不注意地也使用了Boolean.FALSE进行加锁,就可能导致死锁或不可预测的行为。 -####不合规的代码(Integer的自动装箱) +####不合规的代码示例(Integer的自动装箱) 这个例子中的不合规代码在自动装箱的Integer类型上加锁: @@ -51,21 +51,25 @@ public void doSomething() { } } ``` +当使用构造方法时,会创建独立的Integer对象,而不会使用常量池中共享的Intege对象。这是一个可接受的解决方法,但这会导致维护问题,开发人员会错误地认为使用自动装箱的Integer也是可以的。更好的解决方法就是`new Object()`对象,最后一个例子会详细介绍。 +####不合规的代码示例(new String("lock").intern()) +下面是一个不合规的代码示例: -When explicitly constructed, an Integer object has a unique reference and its own intrinsic lock that is distinct not only from other Integer objects, but also from boxed integers that have the same value. While this is an acceptable solution, it can cause maintenance problems because developers can incorrectly assume that boxed integers are also appropriate lock objects. A more appropriate solution is to synchronize on a private final lock object as described in the final compliant solution for this rule. -Noncompliant Code Example (Interned String Object) -This noncompliant code example locks on an interned String object. +```Java private final String lock = new String("LOCK").intern(); - public void doSomething() { synchronized (lock) { // ... } } -According to the Java API class java.lang.String documentation [API 2006]: -When the intern() method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. +``` + +Java API对java.lang.String类的inern()方法解释如下: + +>When the intern() method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. + Consequently, an interned String object behaves like a global variable in the JVM. As demonstrated in this noncompliant code example, even when every instance of an object maintains its own lock field, the fields all refer to a common String constant. Locking on String constants has the same reuse problem as locking on Boolean constants. Additionally, hostile code from any other package can exploit this vulnerability, if the class is accessible. See rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code for more information. Noncompliant Code Example (String Literal) From f240c7f9754cc0ebc47e5004f92dbee1f9f4efb4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 16:52:34 +0800 Subject: [PATCH 296/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index cfa116a..197014e 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -68,9 +68,12 @@ public void doSomething() { Java API对java.lang.String类的inern()方法解释如下: ->When the intern() method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. +> 当调用`intern()`方法时,如果常量池中存在这个字符串对象,则会返回这个字符串对象,否则创建这个这个字符串对象,放置常量池并返回。 + +因此,`new String("lock").intern()`返回的对象有可能是JVM中共享的。即使这个字符串对象已经用`private`和`final`修饰,其他的线程仍然可以从JVM的常量池中共享这个对象。使用字符串常量也同样会有这个问题。 + + -Consequently, an interned String object behaves like a global variable in the JVM. As demonstrated in this noncompliant code example, even when every instance of an object maintains its own lock field, the fields all refer to a common String constant. Locking on String constants has the same reuse problem as locking on Boolean constants. Additionally, hostile code from any other package can exploit this vulnerability, if the class is accessible. See rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code for more information. Noncompliant Code Example (String Literal) This noncompliant code example locks on a final String literal. From 9a11143dd90d5144db654879dfcd291e6e466d91 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:00:24 +0800 Subject: [PATCH 297/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 47 +++++++++--------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 197014e..a0bbf6a 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -72,9 +72,11 @@ Java API对java.lang.String类的inern()方法解释如下: 因此,`new String("lock").intern()`返回的对象有可能是JVM中共享的。即使这个字符串对象已经用`private`和`final`修饰,其他的线程仍然可以从JVM的常量池中共享这个对象。使用字符串常量也同样会有这个问题。 - +除此,恶意代码可能会利用这个漏洞进行攻击。详见:https://www.securecoding.cert.org/confluence/display/java/LCK00-J.+Use+private+final+lock+objects+to+synchronize+classes+that+may+interact+with+untrusted+code Additionally, hostile code from any other package can exploit this vulnerability, if the class is accessible. See rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code for more information. + + Noncompliant Code Example (String Literal) This noncompliant code example locks on a final String literal. // This bug was found in jetty-6.1.3 BoundedThreadPool @@ -88,6 +90,8 @@ public void doSomething() { String literals are constant and are automatically interned. Consequently, this example suffers from the same pitfalls as the preceding noncompliant code example. Compliant Solution (String Instance) This compliant solution locks on a noninterned String instance. + +```Java private final String lock = new String("LOCK"); public void doSomething() { @@ -95,9 +99,13 @@ public void doSomething() { // ... } } +``` + A String instance differs from a String literal. The instance has a unique reference and its own intrinsic lock that is distinct from other String object instances or literals. Nevertheless, a better approach is to synchronize on a private final lock object, as shown in the following compliant solution. Compliant Solution (Private Final Lock Object) This compliant solution synchronizes on a private final lock object. This is one of the few cases in which a java.lang.Object instance is useful. + +```Java private final Object lock = new Object(); public void doSomething() { @@ -105,44 +113,15 @@ public void doSomething() { // ... } } +``` + For more information on using an Object as a lock, see rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code. Risk Assessment A significant number of concurrency vulnerabilities arise from locking on the wrong kind of object. It is important to consider the properties of the lock object rather than simply scavenging for objects on which to synchronize. -Rule -Severity -Likelihood -Remediation Cost -Priority -Level -LCK01-J -medium -probable -medium -P8 -L2 -Automated Detection -Some static analysis tools can detect violations of this rule. -Tool -Version -Checker -Description -ThreadSafe 1.3 -CCE_CC_REUSEDOBJ_SYNC -Implemented -Bibliography -[API 2006] -Class String, Collections -[Findbugs 2008] - -[Miller 2009] -Locking -[Pugh 2008] -Synchronization -[Tutorials 2008] -Wrapper Implementations - ---------- +##另一个主题 + \ No newline at end of file From f194b678c7ae6305debcb922474615b19e1e8d56 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:02:21 +0800 Subject: [PATCH 298/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index a0bbf6a..f22195d 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -74,11 +74,12 @@ Java API对java.lang.String类的inern()方法解释如下: 除此,恶意代码可能会利用这个漏洞进行攻击。详见:https://www.securecoding.cert.org/confluence/display/java/LCK00-J.+Use+private+final+lock+objects+to+synchronize+classes+that+may+interact+with+untrusted+code -Additionally, hostile code from any other package can exploit this vulnerability, if the class is accessible. See rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code for more information. +####不合规的代码(字符串字面量) -Noncompliant Code Example (String Literal) This noncompliant code example locks on a final String literal. + +```Java // This bug was found in jetty-6.1.3 BoundedThreadPool private final String lock = "LOCK"; @@ -87,6 +88,8 @@ public void doSomething() { // ... } } +``` + String literals are constant and are automatically interned. Consequently, this example suffers from the same pitfalls as the preceding noncompliant code example. Compliant Solution (String Instance) This compliant solution locks on a noninterned String instance. From 34cbca6c4fdb01f29054a52961eac51e34cd944b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:04:29 +0800 Subject: [PATCH 299/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index f22195d..3f60b41 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -77,11 +77,11 @@ Java API对java.lang.String类的inern()方法解释如下: ####不合规的代码(字符串字面量) -This noncompliant code example locks on a final String literal. +下面不合规代码在字符串的字面量上加锁: ```Java // This bug was found in jetty-6.1.3 BoundedThreadPool -private final String lock = "LOCK"; +private final String lock = "lock"; public void doSomething() { synchronized (lock) { From 5081d2292f3cb0dca3856fae44bc7e26bd027eac Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:08:11 +0800 Subject: [PATCH 300/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 3f60b41..064bebd 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -90,8 +90,10 @@ public void doSomething() { } ``` -String literals are constant and are automatically interned. Consequently, this example suffers from the same pitfalls as the preceding noncompliant code example. -Compliant Solution (String Instance) +String字面量实际上是个常量,在内部会调用`intern()`方法。因此,这段代码会陷入上面所说的陷阱: + +####解决方法(String实例) + This compliant solution locks on a noninterned String instance. ```Java From 3a1c2dec69cc62f52b413c5f5f827846dc78296b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:12:46 +0800 Subject: [PATCH 301/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 064bebd..195d0a9 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -106,6 +106,10 @@ public void doSomething() { } ``` +String实例不同于String字面量。String实例拥有各自独立的引用,并不会使用常量池中存在的String实例,因此拥有自己独立的锁。然而,这不是最好的解决方法。最好的解决方法是下面一个。 + +####解决方法(private final Obejct = new Object()) + A String instance differs from a String literal. The instance has a unique reference and its own intrinsic lock that is distinct from other String object instances or literals. Nevertheless, a better approach is to synchronize on a private final lock object, as shown in the following compliant solution. Compliant Solution (Private Final Lock Object) This compliant solution synchronizes on a private final lock object. This is one of the few cases in which a java.lang.Object instance is useful. From 3cb2e732ad96daa2044380b60d9eab3013c1e9b3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:14:04 +0800 Subject: [PATCH 302/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 195d0a9..233d2fe 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -110,9 +110,7 @@ String实例不同于String字面量。String实例拥有各自独立的引用 ####解决方法(private final Obejct = new Object()) -A String instance differs from a String literal. The instance has a unique reference and its own intrinsic lock that is distinct from other String object instances or literals. Nevertheless, a better approach is to synchronize on a private final lock object, as shown in the following compliant solution. -Compliant Solution (Private Final Lock Object) -This compliant solution synchronizes on a private final lock object. This is one of the few cases in which a java.lang.Object instance is useful. +使用Object对象,能够轻松解决上面的问题: ```Java private final Object lock = new Object(); @@ -124,6 +122,8 @@ public void doSomething() { } ``` + + For more information on using an Object as a lock, see rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code. Risk Assessment A significant number of concurrency vulnerabilities arise from locking on the wrong kind of object. It is important to consider the properties of the lock object rather than simply scavenging for objects on which to synchronize. From 7a4eabe1cbd028961f154c1717f015d2488a50a4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:18:11 +0800 Subject: [PATCH 303/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 233d2fe..3d62aeb 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -122,10 +122,11 @@ public void doSomething() { } ``` +更多的详细信息,请看这里:https://www.securecoding.cert.org/confluence/display/java/LCK00-J.+Use+private+final+lock+objects+to+synchronize+classes+that+may+interact+with+untrusted+code +在私有的不可变Object对象上加锁,可以轻松解决上面遇到的问题。 -For more information on using an Object as a lock, see rule LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code. -Risk Assessment +####风险评估(Risk Assessment) A significant number of concurrency vulnerabilities arise from locking on the wrong kind of object. It is important to consider the properties of the lock object rather than simply scavenging for objects on which to synchronize. ---------- From edb0a940ec0f963ff27829f2cc444a3724bc34d9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:19:48 +0800 Subject: [PATCH 304/524] Published with https://stackedit.io/ --- "Java-Security/01.\351\224\201.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/Java-Security/01.\351\224\201.md" "b/Java-Security/01.\351\224\201.md" index 3d62aeb..0b798e3 100644 --- "a/Java-Security/01.\351\224\201.md" +++ "b/Java-Security/01.\351\224\201.md" @@ -19,7 +19,7 @@ public void doSomething() { Boolean类型对象并不适合加锁,因为它只有两个值:`true`和`false`。在JVM中,Boolean类型的两个字面量值都分别都指向同一个共享对象。在这里例子中,lock指向JVM中的一个Boolean.FALSE实例,而这个实例的所有线程共享的。如果有其他的线程不注意地也使用了Boolean.FALSE进行加锁,就可能导致死锁或不可预测的行为。 -####不合规的代码示例(Integer的自动装箱) +####有缺陷的代码示例(Integer的自动装箱) 这个例子中的不合规代码在自动装箱的Integer类型上加锁: @@ -53,7 +53,7 @@ public void doSomething() { ``` 当使用构造方法时,会创建独立的Integer对象,而不会使用常量池中共享的Intege对象。这是一个可接受的解决方法,但这会导致维护问题,开发人员会错误地认为使用自动装箱的Integer也是可以的。更好的解决方法就是`new Object()`对象,最后一个例子会详细介绍。 -####不合规的代码示例(new String("lock").intern()) +####有缺陷的代码示例(new String("lock").intern()) 下面是一个不合规的代码示例: @@ -75,7 +75,7 @@ Java API对java.lang.String类的inern()方法解释如下: 除此,恶意代码可能会利用这个漏洞进行攻击。详见:https://www.securecoding.cert.org/confluence/display/java/LCK00-J.+Use+private+final+lock+objects+to+synchronize+classes+that+may+interact+with+untrusted+code -####不合规的代码(字符串字面量) +####有缺陷的代码(字符串字面量) 下面不合规代码在字符串的字面量上加锁: @@ -127,6 +127,7 @@ public void doSomething() { 在私有的不可变Object对象上加锁,可以轻松解决上面遇到的问题。 ####风险评估(Risk Assessment) + A significant number of concurrency vulnerabilities arise from locking on the wrong kind of object. It is important to consider the properties of the lock object rather than simply scavenging for objects on which to synchronize. ---------- From 8b401b03c9313ea42bf082cb857c86702eba6cad Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:22:41 +0800 Subject: [PATCH 305/524] Published with https://stackedit.io/ From 73144e6e98ba3d2bf2658666816f57893b33218e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 19 Sep 2014 17:25:13 +0800 Subject: [PATCH 306/524] Published with https://stackedit.io/ From 0fda86d53cbfb7c9d35cb9f5591d968b94e0977d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 00:02:54 +0800 Subject: [PATCH 307/524] Create README.md --- Java-Security/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Java-Security/README.md diff --git a/Java-Security/README.md b/Java-Security/README.md new file mode 100644 index 0000000..e7fe136 --- /dev/null +++ b/Java-Security/README.md @@ -0,0 +1,2 @@ + +翻译自:https://www.securecoding.cert.org/confluence/display/java/The+CERT+Oracle+Secure+Coding+Standard+for+Java From 162963d3668e0565a7823c3d8a211a441330c95a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 00:37:54 +0800 Subject: [PATCH 308/524] Published with https://stackedit.io/ --- ...04\350\257\273\345\206\231\351\224\201.md" | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 5c56693..4f74162 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -19,6 +19,7 @@ A thread that wants write access to the resource can be granted so when no threa With these simple rules in mind we can implement a ReadWriteLock as shown below: +```Java public class ReadWriteLock{ private int readers = 0; @@ -52,6 +53,8 @@ public class ReadWriteLock{ notifyAll(); } } +``` + The ReadWriteLock has two lock methods and two unlock methods. One lock and unlock method for read access and one lock and unlock for write access. The rules for read access are implemented in the lockRead() method. All threads get read access unless there is a thread with write access, or one or more threads have requested write access. @@ -77,13 +80,14 @@ In this situation the previous ReadWriteLock would lock up - a situation similar To make the ReadWriteLock reentrant it is necessary to make a few changes. Reentrance for readers and writers will be dealt with separately. -Read Reentrance +##Read Reentrance To make the ReadWriteLock reentrant for readers we will first establish the rules for read reentrance: A thread is granted read reentrance if it can get read access (no writers or write requests), or if it already has read access (regardless of write requests). To determine if a thread has read access already a reference to each thread granted read access is kept in a Map along with how many times it has acquired read lock. When determing if read access can be granted this Map will be checked for a reference to the calling thread. Here is how the lockRead() and unlockRead() methods looks after that change: +```Java public class ReadWriteLock{ private Map readingThreads = @@ -130,12 +134,15 @@ public class ReadWriteLock{ } } +``` + As you can see read reentrance is only granted if no threads are currently writing to the resource. Additionally, if the calling thread already has read access this takes precedence over any writeRequests. ##Write Reentrance Write reentrance is granted only if the thread has already write access. Here is how the lockWrite() and unlockWrite() methods look after that change: +```Java public class ReadWriteLock{ private Map readingThreads = @@ -179,12 +186,15 @@ public class ReadWriteLock{ return writingThread == callingThread; } } +``` + Notice how the thread currently holding the write lock is now taken into account when determining if the calling thread can get write access. ##Read to Write Reentrance Sometimes it is necessary for a thread that have read access to also obtain write access. For this to be allowed the thread must be the only reader. To achieve this the writeLock() method should be changed a bit. Here is what it would look like: +```Java public class ReadWriteLock{ private Map readingThreads = @@ -234,12 +244,15 @@ public class ReadWriteLock{ } } +``` + Now the ReadWriteLock class is read-to-write access reentrant. -Write to Read Reentrance +##Write to Read Reentrance Sometimes a thread that has write access needs read access too. A writer should always be granted read access if requested. If a thread has write access no other threads can have read nor write access, so it is not dangerous. Here is how the canGrantReadAccess() method will look with that change: +```Java public class ReadWriteLock{ private boolean canGrantReadAccess(Thread callingThread){ @@ -251,11 +264,13 @@ public class ReadWriteLock{ } } +```` ##Fully Reentrant ReadWriteLock Below is the fully reentran ReadWriteLock implementation. I have made a few refactorings to the access conditions to make them easier to read, and thereby easier to convince yourself that they are correct. +```Java public class ReadWriteLock{ private Map readingThreads = @@ -362,15 +377,19 @@ public class ReadWriteLock{ } } +``` ##Calling unlock() From a finally-clause When guarding a critical section with a ReadWriteLock, and the critical section may throw exceptions, it is important to call the readUnlock() and writeUnlock() methods from inside a finally-clause. Doing so makes sure that the ReadWriteLock is unlocked so other threads can lock it. Here is an example: +```Java lock.lockWrite(); try{ //do critical section code, which may throw exception } finally { lock.unlockWrite(); } +``` + This little construct makes sure that the ReadWriteLock is unlocked in case an exception is thrown from the code in the critical section. If unlockWrite() was not called from inside a finally-clause, and an exception was thrown from the critical section, the ReadWriteLock would remain write locked forever, causing all threads calling lockRead() or lockWrite() on that ReadWriteLock instance to halt indefinately. The only thing that could unlock the ReadWriteLockagain would be if the ReadWriteLock is reentrant, and the thread that had it locked when the exception was thrown, later succeeds in locking it, executing the critical section and calling unlockWrite() again afterwards. That would unlock the ReadWriteLock again. But why wait for that to happen, if it happens? Calling unlockWrite() from a finally-clause is a much more robust solution. From 43a2e6a6868282cec8f621adb08ecb221d4d2123 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 00:48:15 +0800 Subject: [PATCH 309/524] Published with https://stackedit.io/ --- ...70\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 4f74162..08662ed 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -6,13 +6,15 @@ Java 5的`java.util.concurrent`包含了读写锁。即使如此,了解读写 ##Java中读/写锁的实现(Read / Write Lock Java Implementation) -首先,我们对写操作和读操作做一个概述: +首先,我们对**读访问**和**写访问**做一个概述: ``` Read Access If no threads are writing, and no threads have requested write access. Write Access If no threads are reading or writing. ``` +如果一个线程请求对资源进行读操作,如果没有线程对资源进行写操作和没有线程请求对资源进行写 + If a thread wants to read the resource, it is okay as long as no threads are writing to it, and no threads have requested write access to the resource. By up-prioritizing write-access requests we assume that write requests are more important than read-requests. Besides, if reads are what happens most often, and we did not up-prioritize writes, starvation could occur. Threads requesting write access would be blocked until all readers had unlocked the ReadWriteLock. If new threads were constantly granted read access the thread waiting for write access would remain blocked indefinately, resulting in starvation. Therefore a thread can only be granted read access if no thread has currently locked the ReadWriteLock for writing, or requested it locked for writing. A thread that wants write access to the resource can be granted so when no threads are reading nor writing to the resource. It doesn't matter how many threads have requested write access or in what sequence, unless you want to guarantee fairness between threads requesting write access. From 1638d5aa47c16ff393913331f6f93a2c3e1a02a4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 01:33:04 +0800 Subject: [PATCH 310/524] Published with https://stackedit.io/ --- ...\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 08662ed..bc44696 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -13,7 +13,7 @@ Read Access If no threads are writing, and no threads have requested write ac Write Access If no threads are reading or writing. ``` -如果一个线程请求对资源进行读操作,如果没有线程对资源进行写操作和没有线程请求对资源进行写 +一个线程请求对资源进行读操作,如果此时没有线程对资源进行写操作和没有线程请求对资源进行写访问,则这个线程可以正常对资源进行读操作。我们假定写访问比读访问更加重要,因此具有更高的优先级。另外,如果写访问更加频繁,而如果我们不降低写访问的优先级,饥饿就会发生。请求写访问的线程会一直阻塞,直到所有的读访问的线程持有的读写锁被释放。如果新的读访问线程总是能够获得锁,写访问的线程就会陷入阻塞,从而造成饥饿。因此, If a thread wants to read the resource, it is okay as long as no threads are writing to it, and no threads have requested write access to the resource. By up-prioritizing write-access requests we assume that write requests are more important than read-requests. Besides, if reads are what happens most often, and we did not up-prioritize writes, starvation could occur. Threads requesting write access would be blocked until all readers had unlocked the ReadWriteLock. If new threads were constantly granted read access the thread waiting for write access would remain blocked indefinately, resulting in starvation. Therefore a thread can only be granted read access if no thread has currently locked the ReadWriteLock for writing, or requested it locked for writing. From ea613a7f8bd069e598766ab776866f84a245c656 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 01:47:10 +0800 Subject: [PATCH 311/524] Published with https://stackedit.io/ --- ...\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index bc44696..fc15233 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -13,7 +13,7 @@ Read Access If no threads are writing, and no threads have requested write ac Write Access If no threads are reading or writing. ``` -一个线程请求对资源进行读操作,如果此时没有线程对资源进行写操作和没有线程请求对资源进行写访问,则这个线程可以正常对资源进行读操作。我们假定写访问比读访问更加重要,因此具有更高的优先级。另外,如果写访问更加频繁,而如果我们不降低写访问的优先级,饥饿就会发生。请求写访问的线程会一直阻塞,直到所有的读访问的线程持有的读写锁被释放。如果新的读访问线程总是能够获得锁,写访问的线程就会陷入阻塞,从而造成饥饿。因此, +一个线程请求对资源进行读操作,如果此时没有线程对资源进行写操作和没有线程请求对资源进行写访问,则这个线程可以正常对资源进行读操作。我们假定写访问比读访问更加重要,因此具有更高的优先级。另外,如果读访问更加频繁,而如果我们不降低写访问的优先级,饥饿就会发生。请求写访问的线程会一直阻塞,直到所有的读访问的线程持有的读写锁被释放。如果新的读访问线程总是能够获得锁,写访问的线程就会陷入阻塞,从而造成饥饿。因此,只有当没有线程正在对共享对象进行写访问并且没有线程请求对共享对象进行写访问,读访问线程才能够获得共享对象的锁。 If a thread wants to read the resource, it is okay as long as no threads are writing to it, and no threads have requested write access to the resource. By up-prioritizing write-access requests we assume that write requests are more important than read-requests. Besides, if reads are what happens most often, and we did not up-prioritize writes, starvation could occur. Threads requesting write access would be blocked until all readers had unlocked the ReadWriteLock. If new threads were constantly granted read access the thread waiting for write access would remain blocked indefinately, resulting in starvation. Therefore a thread can only be granted read access if no thread has currently locked the ReadWriteLock for writing, or requested it locked for writing. From 694f6c09aefd0737de6ce7bc45a01fd1eb67243e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 01:54:28 +0800 Subject: [PATCH 312/524] Published with https://stackedit.io/ --- ...\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index fc15233..e371d04 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -15,6 +15,8 @@ Write Access If no threads are reading or writing. 一个线程请求对资源进行读操作,如果此时没有线程对资源进行写操作和没有线程请求对资源进行写访问,则这个线程可以正常对资源进行读操作。我们假定写访问比读访问更加重要,因此具有更高的优先级。另外,如果读访问更加频繁,而如果我们不降低写访问的优先级,饥饿就会发生。请求写访问的线程会一直阻塞,直到所有的读访问的线程持有的读写锁被释放。如果新的读访问线程总是能够获得锁,写访问的线程就会陷入阻塞,从而造成饥饿。因此,只有当没有线程正在对共享对象进行写访问并且没有线程请求对共享对象进行写访问,读访问线程才能够获得共享对象的锁。 +当一个线程需要对资源写访问时,如果没有其他线程正在进行读操作或写操作,则这个线程可以获得授权。不管当前有多少线程请求对资源进行写访问以及它们的顺序如何,除非你想实现对写访问请求的公平锁实现。 + If a thread wants to read the resource, it is okay as long as no threads are writing to it, and no threads have requested write access to the resource. By up-prioritizing write-access requests we assume that write requests are more important than read-requests. Besides, if reads are what happens most often, and we did not up-prioritize writes, starvation could occur. Threads requesting write access would be blocked until all readers had unlocked the ReadWriteLock. If new threads were constantly granted read access the thread waiting for write access would remain blocked indefinately, resulting in starvation. Therefore a thread can only be granted read access if no thread has currently locked the ReadWriteLock for writing, or requested it locked for writing. A thread that wants write access to the resource can be granted so when no threads are reading nor writing to the resource. It doesn't matter how many threads have requested write access or in what sequence, unless you want to guarantee fairness between threads requesting write access. From 9031162811e79e13fcd171154e75a8f58082e583 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 01:55:28 +0800 Subject: [PATCH 313/524] Published with https://stackedit.io/ --- ...255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index e371d04..8e9ef27 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -17,15 +17,10 @@ Write Access If no threads are reading or writing. 当一个线程需要对资源写访问时,如果没有其他线程正在进行读操作或写操作,则这个线程可以获得授权。不管当前有多少线程请求对资源进行写访问以及它们的顺序如何,除非你想实现对写访问请求的公平锁实现。 -If a thread wants to read the resource, it is okay as long as no threads are writing to it, and no threads have requested write access to the resource. By up-prioritizing write-access requests we assume that write requests are more important than read-requests. Besides, if reads are what happens most often, and we did not up-prioritize writes, starvation could occur. Threads requesting write access would be blocked until all readers had unlocked the ReadWriteLock. If new threads were constantly granted read access the thread waiting for write access would remain blocked indefinately, resulting in starvation. Therefore a thread can only be granted read access if no thread has currently locked the ReadWriteLock for writing, or requested it locked for writing. - -A thread that wants write access to the resource can be granted so when no threads are reading nor writing to the resource. It doesn't matter how many threads have requested write access or in what sequence, unless you want to guarantee fairness between threads requesting write access. - -With these simple rules in mind we can implement a ReadWriteLock as shown below: +根据这个简单的需求,我们可以参照下面这样实现ReadWriteLock: ```Java public class ReadWriteLock{ - private int readers = 0; private int writers = 0; private int writeRequests = 0; From 1e945c0a0ce861dae0fa4e51054743e77e63c51d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 02:07:29 +0800 Subject: [PATCH 314/524] Published with https://stackedit.io/ From 133384179569e513756d5dc5248252c746e47517 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 02:13:58 +0800 Subject: [PATCH 315/524] Published with https://stackedit.io/ --- ...\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 8e9ef27..d5da0b0 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -54,6 +54,8 @@ public class ReadWriteLock{ } ``` +这个ReadWriteLock类有两个加锁方法以及两个释放锁方法。一个`lock()`方法和一个`unlock()`方法用于读访问,一个`lock()`方法和一个`unlock()`方法用于写访问。 + The ReadWriteLock has two lock methods and two unlock methods. One lock and unlock method for read access and one lock and unlock for write access. The rules for read access are implemented in the lockRead() method. All threads get read access unless there is a thread with write access, or one or more threads have requested write access. From d68ffa34d5d408df8221a636181cfa7481388ea2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Sat, 20 Sep 2014 02:18:19 +0800 Subject: [PATCH 316/524] Published with https://stackedit.io/ From 43a97e45ac863e414348e820d39fb80cb89d4ef7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 13:14:37 +0800 Subject: [PATCH 317/524] Delete Java --- Java | 131 ----------------------------------------------------------- 1 file changed, 131 deletions(-) delete mode 100644 Java diff --git a/Java b/Java deleted file mode 100644 index 872a216..0000000 --- a/Java +++ /dev/null @@ -1,131 +0,0 @@ -#13.嵌套管程锁死(Nested Monitor Lockout) - -How Nested Monitor Lockout Occurs - -Nested monitor lockout is a problem similar to deadlock. A nested monitor lockout occurs like this: - -Thread 1 synchronizes on A -Thread 1 synchronizes on B (while synchronized on A) -Thread 1 decides to wait for a signal from another thread before continuing -Thread 1 calls B.wait() thereby releasing the lock on B, but not A. - -Thread 2 needs to lock both A and B (in that sequence) - to send Thread 1 the signal. -Thread 2 cannot lock A, since Thread 1 still holds the lock on A. -Thread 2 remain blocked indefinately waiting for Thread1 - to release the lock on A - -Thread 1 remain blocked indefinately waiting for the signal from - Thread 2, thereby - never releasing the lock on A, that must be released to make - it possible for Thread 2 to send the signal to Thread 1, etc. -This may sound like a pretty theoretical situation, but look at the naive Lock implemenation below: - -//lock implementation with nested monitor lockout problem - -public class Lock{ - protected MonitorObject monitorObject = new MonitorObject(); - protected boolean isLocked = false; - - public void lock() throws InterruptedException{ - synchronized(this){ - while(isLocked){ - synchronized(this.monitorObject){ - this.monitorObject.wait(); - } - } - isLocked = true; - } - } - - public void unlock(){ - synchronized(this){ - this.isLocked = false; - synchronized(this.monitorObject){ - this.monitorObject.notify(); - } - } - } -} -Notice how the lock() method first synchronizes on "this", then synchronizes on the monitorObject member. If isLocked is false there is no problem. The thread does not call monitorObject.wait(). If isLocked is true however, the thread calling lock() is parked waiting in the monitorObject.wait() call. - -The problem with this is, that the call to monitorObject.wait() only releases the synchronization monitor on the monitorObject member, and not the synchronization monitor associated with "this". In other words, the thread that was just parked waiting is still holding the synchronization lock on "this". - -When the thread that locked the Lock in the first place tries to unlock it by calling unlock() it will be blocked trying to enter the synchronized(this) block in the unlock() method. It will remain blocked until the thread waiting in lock() leaves the synchronized(this) block. But the thread waiting in the lock() method will not leave that block until the isLocked is set to false, and a monitorObject.notify() is executed, as it happens in unlock(). - -Put shortly, the thread waiting in lock() needs an unlock() call to execute successfully for it to exit lock() and the synchronized blocks inside it. But, no thread can actually execute unlock() until the thread waiting in lock() leaves the outer synchronized block. - -This result is that any thread calling either lock() or unlock() will become blocked indefinately. This is called a nested monitor lockout. - -A More Realistic Example - -You may claim that you would never implement a lock like the one shown earlier. That you would not call wait() and notify() on an internal monitor object, but rather on the This is probably true. But there are situations in which designs like the one above may arise. For instance, if you were to implement fairness in a Lock. When doing so you want each thread to call wait() on each their own queue object, so that you can notify the threads one at a time. - -Look at this naive implementation of a fair lock: - -//Fair Lock implementation with nested monitor lockout problem - -public class FairLock { - private boolean isLocked = false; - private Thread lockingThread = null; - private List waitingThreads = - new ArrayList(); - - public void lock() throws InterruptedException{ - QueueObject queueObject = new QueueObject(); - - synchronized(this){ - waitingThreads.add(queueObject); - - while(isLocked || waitingThreads.get(0) != queueObject){ - - synchronized(queueObject){ - try{ - queueObject.wait(); - }catch(InterruptedException e){ - waitingThreads.remove(queueObject); - throw e; - } - } - } - waitingThreads.remove(queueObject); - isLocked = true; - lockingThread = Thread.currentThread(); - } - } - - public synchronized void unlock(){ - if(this.lockingThread != Thread.currentThread()){ - throw new IllegalMonitorStateException( - "Calling thread has not locked this lock"); - } - isLocked = false; - lockingThread = null; - if(waitingThreads.size() > 0){ - QueueObject queueObject = waitingThread.get(0); - synchronized(queueObject){ - queueObject.notify(); - } - } - } -} -public class QueueObject {} -At first glance this implementation may look fine, but notice how the lock() method calls queueObject.wait(); from inside two synchronized blocks. One synchronized on "this", and nested inside that, a block synchronized on the queueObject local variable. When a thread calls queueObject.wait()it releases the lock on the QueueObject instance, but not the lock associated with "this". - -Notice too, that the unlock() method is declared synchronized which equals a synchronized(this) block. This means, that if a thread is waiting inside lock() the monitor object associated with "this" will be locked by the waiting thread. All threads calling unlock() will remain blocked indefinately, waiting for the waiting thread to release the lock on "this". But this will never happen, since this only happens if a thread succeeds in sending a signal to the waiting thread, and this can only be sent by executing the unlock() method. - -And so, the FairLock implementation from above could lead to nested monitor lockout. A better implementation of a fair lock is described in the text Starvation and Fairness. - -Nested Monitor Lockout vs. Deadlock - -The result of nested monitor lockout and deadlock are pretty much the same: The threads involved end up blocked forever waiting for each other. - -The two situations are not equal though. As explained in the text on Deadlock a deadlock occurs when two threads obtain locks in different order. Thread 1 locks A, waits for B. Thread 2 has locked B, and now waits for A. As explained in the text on Deadlock Prevention deadlocks can be avoided by always locking the locks in the same order (Lock Ordering). However, a nested monitor lockout occurs exactly by two threads taking the locks in the same order. Thread 1 locks A and B, then releases B and waits for a signal from Thread 2. Thread 2 needs both A and B to send Thread 1 the signal. So, one thread is waiting for a signal, and another for a lock to be released. - -The difference is summed up here: - -In deadlock, two threads are waiting for each other to release locks. - -In nested monitor lockout, Thread 1 is holding a lock A, and waits -for a signal from Thread 2. Thread 2 needs the lock A to send the -signal to Thread 1. From c9aa4e7d52c8da729314e40737db7e6fe4b4854d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 13:18:02 +0800 Subject: [PATCH 318/524] Published with https://stackedit.io/ From 8771de7f960794fa518be4e29062fb1c29c970f0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 14:09:30 +0800 Subject: [PATCH 319/524] Published with https://stackedit.io/ --- ...47\232\204\350\257\273\345\206\231\351\224\201.md" | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index d5da0b0..7cbc6e2 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -56,7 +56,14 @@ public class ReadWriteLock{ 这个ReadWriteLock类有两个加锁方法以及两个释放锁方法。一个`lock()`方法和一个`unlock()`方法用于读访问,一个`lock()`方法和一个`unlock()`方法用于写访问。 -The ReadWriteLock has two lock methods and two unlock methods. One lock and unlock method for read access and one lock and unlock for write access. +读访问的实现在`lockRead()`方法中。如果当前没有线程持有写访问的锁以及没有线程请求写访问,则线程请求读访问都可以授权。 + +写访问的实现在`lockWrite()`方法中。线程请求写访问,会将`writeRequest`加1,然后检查是否可以获得写访问授权。如果当前没有线程在进行读访问以及没有线程写访问,则可以获得写访问授权。 + + + + +(The ReadWriteLock has two lock methods and two unlock methods. One lock and unlock method for read access and one lock and unlock for write access. The rules for read access are implemented in the lockRead() method. All threads get read access unless there is a thread with write access, or one or more threads have requested write access. @@ -66,7 +73,7 @@ It is worth noting that both unlockRead() and unlockWrite() calls notifyAll() ra Inside the ReadWriteLock there are threads waiting for read access, and threads waiting for write access. If a thread awakened by notify() was a read access thread, it would be put back to waiting because there are threads waiting for write access. However, none of the threads awaiting write access are awakened, so nothing more happens. No threads gain neither read nor write access. By calling noftifyAll() all waiting threads are awakened and check if they can get the desired access. -Calling notifyAll() also has another advantage. If multiple threads are waiting for read access and none for write access, and unlockWrite() is called, all threads waiting for read access are granted read access at once - not one by one. +Calling notifyAll() also has another advantage. If multiple threads are waiting for read access and none for write access, and unlockWrite() is called, all threads waiting for read access are granted read access at once - not one by one.) ##读/写锁的可重入性(Read / Write Lock Reentrance) From 1f808c6cf4319ab130a0ffeb8ccd759c77e2fc0e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:12:38 +0800 Subject: [PATCH 320/524] Published with https://stackedit.io/ --- ...270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 7cbc6e2..bbf04bf 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -60,8 +60,11 @@ public class ReadWriteLock{ 写访问的实现在`lockWrite()`方法中。线程请求写访问,会将`writeRequest`加1,然后检查是否可以获得写访问授权。如果当前没有线程在进行读访问以及没有线程写访问,则可以获得写访问授权。 +值得注意的是,`unlockRead()`方法和`unlockWrite()`方法调用的是`notifyAll()`方法而非`notify()`方法。至于原因,考虑下面的场景: +假设当前有多个请求**读访问**和**写访问**的线程,当调用`notify()`方法唤醒的线程是**读访问**线程时因为此时有请求**写访问**的线程,被唤醒的线程会继续进入等待状态。然而,因为没有写访问请求的线程被唤醒,所以程序都会因此停止,线程既不能获得读访问授权,也不能获得写访问授权。而调用`notifyAll()`方法可以唤醒所有等待的线程,并检测它们自身是否可以获得锁。 +调用`notifyAll()`方法还有一个好处就是,假设当前有很多请求**读访问**的线程,当**写访问**的线程调用`unlockWrite()`释放锁后,所有的请求**读访问**都可以同时获得授权,而不是一个接着一个授权。 (The ReadWriteLock has two lock methods and two unlock methods. One lock and unlock method for read access and one lock and unlock for write access. From 65d9d57af2dcbdddb2c1f118add773170c9b61be Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:34:06 +0800 Subject: [PATCH 321/524] Published with https://stackedit.io/ --- ...7\232\204\350\257\273\345\206\231\351\224\201.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index bbf04bf..e9bc7d4 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -80,6 +80,18 @@ Calling notifyAll() also has another advantage. If multiple threads are waiting ##读/写锁的可重入性(Read / Write Lock Reentrance) +上面实现的ReadWriteLock类并不具有可重入性。如果持有**写访问**锁的线程再次调用`lockWrite()` 方法,则会陷入阻塞。除此之外,考虑下这种情况: + +``` +线程1 授权读访问 +线程2 请求写访问,因为线程1正在读,所以线程2会进入等待状态 +线程1 再次请求读访问,因为当前已有一个写访问请求,所以线程1会进入等待状态 +``` + +这种情况下,ReadWriteLock会被锁死(lock up)(类似于死锁)。其他的读访问和写访问请求也因此不能再获得授权。 + + + The ReadWriteLock class shown earlier is not reentrant. If a thread that has write access requests it again, it will block because there is already one writer - itself. Furthermore, consider this case: Thread 1 gets read access. From 91490af09d0b70be6ca39c866e0083c5bb28e0ed Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:39:24 +0800 Subject: [PATCH 322/524] Published with https://stackedit.io/ --- ...\232\204\350\257\273\345\206\231\351\224\201.md" | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index e9bc7d4..949f557 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -90,18 +90,7 @@ Calling notifyAll() also has another advantage. If multiple threads are waiting 这种情况下,ReadWriteLock会被锁死(lock up)(类似于死锁)。其他的读访问和写访问请求也因此不能再获得授权。 - - -The ReadWriteLock class shown earlier is not reentrant. If a thread that has write access requests it again, it will block because there is already one writer - itself. Furthermore, consider this case: - -Thread 1 gets read access. - -Thread 2 requests write access but is blocked because there is one reader. - -Thread 1 re-requests read access (re-enters the lock), but is blocked because there is a write request -In this situation the previous ReadWriteLock would lock up - a situation similar to deadlock. No threads requesting neither read nor write access would be granted so. - -To make the ReadWriteLock reentrant it is necessary to make a few changes. Reentrance for readers and writers will be dealt with separately. +有必要对`ReadWriteLock`做一些修改让它具有**可重入性**。**读访问**和**写访问**的**可重入性**将分别进行处理。 ##Read Reentrance From ca158f800bc813d2996d79a0a824b456d443b65d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:41:25 +0800 Subject: [PATCH 323/524] Published with https://stackedit.io/ --- ...\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 949f557..58e28c2 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -92,7 +92,7 @@ Calling notifyAll() also has another advantage. If multiple threads are waiting 有必要对`ReadWriteLock`做一些修改让它具有**可重入性**。**读访问**和**写访问**的**可重入性**将分别进行处理。 -##Read Reentrance +##读可重入性(Read Reentrance) To make the ReadWriteLock reentrant for readers we will first establish the rules for read reentrance: From 6e00efa01b5dc04322f659cd362fdb1e2c07c4a7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:44:38 +0800 Subject: [PATCH 324/524] Published with https://stackedit.io/ --- ...47\232\204\350\257\273\345\206\231\351\224\201.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 58e28c2..621f171 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -94,6 +94,10 @@ Calling notifyAll() also has another advantage. If multiple threads are waiting ##读可重入性(Read Reentrance) +为了让`ReadWriteLock`类具有**读可重入性**,我们需要建立读可重入的规则: + +> + To make the ReadWriteLock reentrant for readers we will first establish the rules for read reentrance: A thread is granted read reentrance if it can get read access (no writers or write requests), or if it already has read access (regardless of write requests). @@ -101,9 +105,7 @@ To determine if a thread has read access already a reference to each thread gran ```Java public class ReadWriteLock{ - - private Map readingThreads = - new HashMap(); + private Map readingThreads = new HashMap(); private int writers = 0; private int writeRequests = 0; @@ -114,8 +116,7 @@ public class ReadWriteLock{ wait(); } - readingThreads.put(callingThread, - (getAccessCount(callingThread) + 1)); + readingThreads.put(callingThread,(getAccessCount(callingThread) + 1)); } From a9e967d7807105b90b4948004b6a2852604cf113 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:45:26 +0800 Subject: [PATCH 325/524] Published with https://stackedit.io/ --- ...\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 621f171..305d788 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -96,7 +96,7 @@ Calling notifyAll() also has another advantage. If multiple threads are waiting 为了让`ReadWriteLock`类具有**读可重入性**,我们需要建立读可重入的规则: -> +> A thread is granted read reentrance if it can get read access (no writers or write requests), or if it already has read access (regardless of write requests). To make the ReadWriteLock reentrant for readers we will first establish the rules for read reentrance: From 547039412038e1e19c19f64e5dc78bbe19339dd3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:46:24 +0800 Subject: [PATCH 326/524] Published with https://stackedit.io/ --- ...270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index 305d788..b163d30 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -101,6 +101,9 @@ Calling notifyAll() also has another advantage. If multiple threads are waiting To make the ReadWriteLock reentrant for readers we will first establish the rules for read reentrance: A thread is granted read reentrance if it can get read access (no writers or write requests), or if it already has read access (regardless of write requests). + + + To determine if a thread has read access already a reference to each thread granted read access is kept in a Map along with how many times it has acquired read lock. When determing if read access can be granted this Map will be checked for a reference to the calling thread. Here is how the lockRead() and unlockRead() methods looks after that change: ```Java From ef6e5e271f9a4fe79e6c5707a60f14fecbed0be3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:55:38 +0800 Subject: [PATCH 327/524] Published with https://stackedit.io/ --- ...5\347\232\204\350\257\273\345\206\231\351\224\201.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" index b163d30..8fea652 100644 --- "a/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" +++ "b/Java-Concurrency/17.Java\344\270\255\347\232\204\350\257\273\345\206\231\351\224\201.md" @@ -154,7 +154,7 @@ public class ReadWriteLock{ As you can see read reentrance is only granted if no threads are currently writing to the resource. Additionally, if the calling thread already has read access this takes precedence over any writeRequests. -##Write Reentrance +##写可重入性(Write Reentrance) Write reentrance is granted only if the thread has already write access. Here is how the lockWrite() and unlockWrite() methods look after that change: @@ -206,7 +206,7 @@ public class ReadWriteLock{ Notice how the thread currently holding the write lock is now taken into account when determining if the calling thread can get write access. -##Read to Write Reentrance +##读到写的可重入性(Read to Write Reentrance) Sometimes it is necessary for a thread that have read access to also obtain write access. For this to be allowed the thread must be the only reader. To achieve this the writeLock() method should be changed a bit. Here is what it would look like: @@ -264,7 +264,7 @@ public class ReadWriteLock{ Now the ReadWriteLock class is read-to-write access reentrant. -##Write to Read Reentrance +##写到读的可重入性(Write to Read Reentrance) Sometimes a thread that has write access needs read access too. A writer should always be granted read access if requested. If a thread has write access no other threads can have read nor write access, so it is not dangerous. Here is how the canGrantReadAccess() method will look with that change: @@ -289,8 +289,7 @@ Below is the fully reentran ReadWriteLock implementation. I have made a few refa ```Java public class ReadWriteLock{ - private Map readingThreads = - new HashMap(); + private Map readingThreads = new HashMap(); private int writeAccesses = 0; private int writeRequests = 0; From 4aeff8b5bc8ba9633cc0606c88f7c853c0238ecb Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 15:58:24 +0800 Subject: [PATCH 328/524] Published with https://stackedit.io/ From 36208ceb3afc7fb46c160b9a33ac4fb58ee23682 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 16:04:32 +0800 Subject: [PATCH 329/524] Published with https://stackedit.io/ --- ...9.\344\277\241\345\217\267\351\207\217.md" | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 706ac5a..67ff97a 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -1,13 +1,21 @@ #19.信号量 + + A Semaphore is a thread synchronization construct that can be used either to send signals between threads to avoid missed signals, or to guard a critical section like you would with a lock. Java 5 comes with semaphore implementations in the java.util.concurrent package so you don't have to implement your own semaphores. Still, it can be useful to know the theory behind their implementation and use. Java 5 comes with a built-in Semaphore so you don't have to implement your own. You can read more about it in the java.util.concurrent.Semaphore text, in my java.util.concurrent tutorial. -##Simple Semaphore +一个信号是可以使用,也可以在线程之间发送信号,以避免错过的信号,或守卫的关键部分,就像您有锁的线程同步结构。 Java 5中自带的java.util.concurrent包信号量的实现,所以你不必实现自己的信号量。不过,这可能是有用的,以知道它们的实施和使用背后的理论。 + +Java 5中带有一个内置的信号量,这样你就不必实现自己。你可以阅读更多关于它的java.util.concurrent.Semaphore中的文字,在我的java.util.concurrent教程。 + + +##简单的信号量实现(Simple Semaphore) Here is a simple Semaphore implementation: +```Java public class Semaphore { private boolean signal = false; @@ -22,6 +30,8 @@ public class Semaphore { } } +``` + The take() method sends a signal which is stored internally in the Semaphore. The release() method waits for a signal. When received the signal flag is cleared again, and the release() method exited. Using a semaphore like this you can avoid missed signals. You will call take() instead of notify() and release() instead of wait(). If the call to take() happens before the call to release() the thread calling release() will still know that take() was called, because the signal is stored internally in the signal variable. This is not the case with wait() and notify(). @@ -32,6 +42,7 @@ The names take() and release() may seem a bit odd when using a semaphore for sig Here is a simplified example of two threads signaling each other using a Semaphore: +```Java Semaphore semaphore = new Semaphore(); SendingThread sender = new SendingThread(semaphore); @@ -69,11 +80,14 @@ public class RecevingThread { } } } +``` + ##Counting Semaphore The Semaphore implementation in the previous section does not count the number of signals sent to it by take() method calls. We can change the Semaphore to do so. This is called a counting semaphore. Here is a simple implementation of a counting semaphore: +```Java public class CountingSemaphore { private int signals = 0; @@ -88,11 +102,14 @@ public class CountingSemaphore { } } +``` + ##Bounded Semaphore The CoutingSemaphore has no upper bound on how many signals it can store. We can change the semaphore implementation to have an upper bound, like this: +```Java public class BoundedSemaphore { private int signals = 0; private int bound = 0; @@ -113,12 +130,15 @@ public class BoundedSemaphore { this.notify(); } } +``` + Notice how the take() method now blocks if the number of signals is equal to the upper bound. Not until a thread has called release() will the thread calling take() be allowed to deliver its signal, if the BoundedSemaphore has reached its upper signal limit. -Using Semaphores as Locks +##Using Semaphores as Locks It is possible to use a bounded semaphore as a lock. To do so, set the upper bound to 1, and have the call to take() and release() guard the critical section. Here is an example: +```Java BoundedSemaphore semaphore = new BoundedSemaphore(1); ... @@ -130,6 +150,8 @@ try{ } finally { semaphore.release(); } +``` + In contrast to the signaling use case the methods take() and release() are now called by the same thread. Since only one thread is allowed to take the semaphore, all other threads calling take() will be blocked until release() is called. The call to release() will never block since there has always been a call to take() first. You can also use a bounded semaphore to limit the number of threads allowed into a section of code. For instance, in the example above, what would happen if you set the limit of the BoundedSemaphore to 5? 5 threads would be allowed to enter the critical section at a time. You would have to make sure though, that the thread operations do not conflict for these 5 threads, or you application will fail. From 52bc9fccb268e6d8907603bca007ef97cc51ca32 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 16:13:12 +0800 Subject: [PATCH 330/524] Published with https://stackedit.io/ --- .../19.\344\277\241\345\217\267\351\207\217.md" | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 67ff97a..b68b247 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -1,16 +1,13 @@ #19.信号量 +信号量是一种线程同步结构,它可以用于线程间的信号通信,以及可以像锁一样来保护临界区。Java 5在`java.util.concurrency`包中引入了信号量(Semaphores)的实现。但是,了解信号量背后的实现原来对我们也是非常有帮助的。 +Java 5引入了信号量的实现,因此,你不必自己去实现信号量。详细的介绍请看这里:http://tutorials.jenkov.com/java-util-concurrent/semaphore.html A Semaphore is a thread synchronization construct that can be used either to send signals between threads to avoid missed signals, or to guard a critical section like you would with a lock. Java 5 comes with semaphore implementations in the java.util.concurrent package so you don't have to implement your own semaphores. Still, it can be useful to know the theory behind their implementation and use. Java 5 comes with a built-in Semaphore so you don't have to implement your own. You can read more about it in the java.util.concurrent.Semaphore text, in my java.util.concurrent tutorial. -一个信号是可以使用,也可以在线程之间发送信号,以避免错过的信号,或守卫的关键部分,就像您有锁的线程同步结构。 Java 5中自带的java.util.concurrent包信号量的实现,所以你不必实现自己的信号量。不过,这可能是有用的,以知道它们的实施和使用背后的理论。 - -Java 5中带有一个内置的信号量,这样你就不必实现自己。你可以阅读更多关于它的java.util.concurrent.Semaphore中的文字,在我的java.util.concurrent教程。 - - ##简单的信号量实现(Simple Semaphore) Here is a simple Semaphore implementation: From 23ed9adcec28fe55e5e8e858c2c83cabdf1f6eb4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 16:13:36 +0800 Subject: [PATCH 331/524] Published with https://stackedit.io/ --- "Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index b68b247..c890efd 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -10,7 +10,7 @@ Java 5 comes with a built-in Semaphore so you don't have to implement your own. ##简单的信号量实现(Simple Semaphore) -Here is a simple Semaphore implementation: +下面是一个简单的信号量类的实现: ```Java public class Semaphore { From 43a59aa55d2175db41cef12d11de7541f43f4da6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 16:57:42 +0800 Subject: [PATCH 332/524] Published with https://stackedit.io/ --- "Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index c890efd..930ec1e 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -22,7 +22,9 @@ public class Semaphore { } public synchronized void release() throws InterruptedException{ - while(!this.signal) wait(); + while(!this.signal) { + wait(); + } this.signal = false; } From d3c59f6e93f27795dbd049087e567a47632250de Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 17:06:06 +0800 Subject: [PATCH 333/524] Published with https://stackedit.io/ --- .../19.\344\277\241\345\217\267\351\207\217.md" | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 930ec1e..460f9b4 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -1,13 +1,9 @@ #19.信号量 -信号量是一种线程同步结构,它可以用于线程间的信号通信,以及可以像锁一样来保护临界区。Java 5在`java.util.concurrency`包中引入了信号量(Semaphores)的实现。但是,了解信号量背后的实现原来对我们也是非常有帮助的。 +信号量是一种线程同步结构,它可以用于线程间的信号通信,也可以用来像锁一样来保护临界区。Java 5在`java.util.concurrency`包中引入了信号量(Semaphores)的实现。但是,了解信号量背后的实现原来对我们也是非常有帮助的。 Java 5引入了信号量的实现,因此,你不必自己去实现信号量。详细的介绍请看这里:http://tutorials.jenkov.com/java-util-concurrent/semaphore.html -A Semaphore is a thread synchronization construct that can be used either to send signals between threads to avoid missed signals, or to guard a critical section like you would with a lock. Java 5 comes with semaphore implementations in the java.util.concurrent package so you don't have to implement your own semaphores. Still, it can be useful to know the theory behind their implementation and use. - -Java 5 comes with a built-in Semaphore so you don't have to implement your own. You can read more about it in the java.util.concurrent.Semaphore text, in my java.util.concurrent tutorial. - ##简单的信号量实现(Simple Semaphore) 下面是一个简单的信号量类的实现: From e489ccec56170cfe71667ce49686faaeeaa57ea6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 17:21:46 +0800 Subject: [PATCH 334/524] Published with https://stackedit.io/ --- .../19.\344\277\241\345\217\267\351\207\217.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 460f9b4..cf35307 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -27,6 +27,12 @@ public class Semaphore { } ``` +Semmaphore类的`take()`方法用于发送信号,`release()`方法用于等待信号。 + +使用信号量可以避免信号丢失的问题。在这里,`take()`方法代替了`notify()`方法,`release()`方法代替了`wait()`方法。如果我们在调用`take()`方法之前调用了`release()`方法,`release()`方法通过判断signal变量可以判断`take()`被调用过,因此不会造成信号丢失的问题。而直接`wait()`和`notify()`则会有这个问题。 + +在使用信号量(Semaphore )进行信号通信(Signaling)时,`take()`和`release()`方法的命名似乎有点过时。 + The take() method sends a signal which is stored internally in the Semaphore. The release() method waits for a signal. When received the signal flag is cleared again, and the release() method exited. Using a semaphore like this you can avoid missed signals. You will call take() instead of notify() and release() instead of wait(). If the call to take() happens before the call to release() the thread calling release() will still know that take() was called, because the signal is stored internally in the signal variable. This is not the case with wait() and notify(). From 1640276f641bd30c07fd4bfe112c25145b666370 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 17:30:37 +0800 Subject: [PATCH 335/524] Published with https://stackedit.io/ --- ...9.\344\277\241\345\217\267\351\207\217.md" | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index cf35307..0ed8ece 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -31,27 +31,21 @@ Semmaphore类的`take()`方法用于发送信号,`release()`方法用于等待 使用信号量可以避免信号丢失的问题。在这里,`take()`方法代替了`notify()`方法,`release()`方法代替了`wait()`方法。如果我们在调用`take()`方法之前调用了`release()`方法,`release()`方法通过判断signal变量可以判断`take()`被调用过,因此不会造成信号丢失的问题。而直接`wait()`和`notify()`则会有这个问题。 -在使用信号量(Semaphore )进行信号通信(Signaling)时,`take()`和`release()`方法的命名似乎有点过时。 +在使用信号量(Semaphore )进行信号通信(Signaling)时,`take()`和`release()`方法的命名似乎有点过时。下面的示例中会使用Lock中的方法命名,使得方法命名更加**语义化**( The names origin from the use of semaphores as locks, as explained later in this text. In that case the names make more sense.)。 -The take() method sends a signal which is stored internally in the Semaphore. The release() method waits for a signal. When received the signal flag is cleared again, and the release() method exited. +##使用信号量通信(Using Semaphores for Signaling) -Using a semaphore like this you can avoid missed signals. You will call take() instead of notify() and release() instead of wait(). If the call to take() happens before the call to release() the thread calling release() will still know that take() was called, because the signal is stored internally in the signal variable. This is not the case with wait() and notify(). - -The names take() and release() may seem a bit odd when using a semaphore for signaling. The names origin from the use of semaphores as locks, as explained later in this text. In that case the names make more sense. - -##Using Semaphores for Signaling - -Here is a simplified example of two threads signaling each other using a Semaphore: +下面的示例的两个线程使用信号量进行通信: ```Java Semaphore semaphore = new Semaphore(); SendingThread sender = new SendingThread(semaphore); - ReceivingThread receiver = new ReceivingThread(semaphore); receiver.start(); sender.start(); + public class SendingThread { Semaphore semaphore = null; @@ -67,6 +61,7 @@ public class SendingThread { } } } + public class RecevingThread { Semaphore semaphore = null; @@ -84,7 +79,7 @@ public class RecevingThread { ``` -##Counting Semaphore +##计数信号量(Counting Semaphore) The Semaphore implementation in the previous section does not count the number of signals sent to it by take() method calls. We can change the Semaphore to do so. This is called a counting semaphore. Here is a simple implementation of a counting semaphore: @@ -106,7 +101,7 @@ public class CountingSemaphore { ``` -##Bounded Semaphore +##右界信号量(Bounded Semaphore) The CoutingSemaphore has no upper bound on how many signals it can store. We can change the semaphore implementation to have an upper bound, like this: @@ -135,7 +130,7 @@ public class BoundedSemaphore { Notice how the take() method now blocks if the number of signals is equal to the upper bound. Not until a thread has called release() will the thread calling take() be allowed to deliver its signal, if the BoundedSemaphore has reached its upper signal limit. -##Using Semaphores as Locks +##像锁一样使用信号量(Using Semaphores as Locks) It is possible to use a bounded semaphore as a lock. To do so, set the upper bound to 1, and have the call to take() and release() guard the critical section. Here is an example: From 50252f8229c72215e0af06c3ec39684ddda91856 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 17:38:05 +0800 Subject: [PATCH 336/524] Published with https://stackedit.io/ --- .../19.\344\277\241\345\217\267\351\207\217.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 0ed8ece..667c807 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -81,7 +81,7 @@ public class RecevingThread { ##计数信号量(Counting Semaphore) -The Semaphore implementation in the previous section does not count the number of signals sent to it by take() method calls. We can change the Semaphore to do so. This is called a counting semaphore. Here is a simple implementation of a counting semaphore: +上面实现的Semaphore类,并没有计算通过调用`take()`方法发送的信号的次数。我们通过修改让它提供这个功能。这个称之为**计数信号量**。下面是一个简单的计数信号量的实现: ```Java public class CountingSemaphore { @@ -93,7 +93,9 @@ public class CountingSemaphore { } public synchronized void release() throws InterruptedException{ - while(this.signals == 0) wait(); + while(this.signals == 0) { + wait(); + } this.signals--; } From 9c9e460c66dcc7ae3d390f974c48e3ea5b7dc06e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 17:49:02 +0800 Subject: [PATCH 337/524] Published with https://stackedit.io/ --- .../19.\344\277\241\345\217\267\351\207\217.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 667c807..c52e627 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -103,9 +103,9 @@ public class CountingSemaphore { ``` -##右界信号量(Bounded Semaphore) +##有界信号量(Bounded Semaphore) -The CoutingSemaphore has no upper bound on how many signals it can store. We can change the semaphore implementation to have an upper bound, like this: +CountingSemaphores只是存储了发送的信号量的个数,但是没有限定信号量的个数。我们可以按照下面这个例子让它限制信号量的上界: ```Java public class BoundedSemaphore { @@ -130,6 +130,8 @@ public class BoundedSemaphore { } ``` + + Notice how the take() method now blocks if the number of signals is equal to the upper bound. Not until a thread has called release() will the thread calling take() be allowed to deliver its signal, if the BoundedSemaphore has reached its upper signal limit. ##像锁一样使用信号量(Using Semaphores as Locks) From 5e328f22c951ec021fa26e0ac8b68c5534488649 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 17:54:02 +0800 Subject: [PATCH 338/524] Published with https://stackedit.io/ --- .../19.\344\277\241\345\217\267\351\207\217.md" | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index c52e627..82038cd 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -117,22 +117,24 @@ public class BoundedSemaphore { } public synchronized void take() throws InterruptedException{ - while(this.signals == bound) wait(); + while(this.signals == bound) { + wait(); + } this.signals++; this.notify(); } public synchronized void release() throws InterruptedException{ - while(this.signals == 0) wait(); + while(this.signals == 0) { + wait(); + } this.signals--; this.notify(); } } ``` - - -Notice how the take() method now blocks if the number of signals is equal to the upper bound. Not until a thread has called release() will the thread calling take() be allowed to deliver its signal, if the BoundedSemaphore has reached its upper signal limit. +注意这里的`take()`方法,如果signals的个数达到上限则线程进入阻塞,直到有线程调用`release()`方法,当前线程才能被允许发送信号。 ##像锁一样使用信号量(Using Semaphores as Locks) From 803d6dfde3583a371c79d4345df3424ea7d15269 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 17:57:03 +0800 Subject: [PATCH 339/524] Published with https://stackedit.io/ --- "Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 82038cd..cb368f0 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -138,13 +138,13 @@ public class BoundedSemaphore { ##像锁一样使用信号量(Using Semaphores as Locks) +我们可以把有**界信号量(bounded semaphore)**当成锁使用。这时候,我们将上界设置为1,用`take()`方法和`release()`方法包裹临界区。如下面这个例子: + It is possible to use a bounded semaphore as a lock. To do so, set the upper bound to 1, and have the call to take() and release() guard the critical section. Here is an example: ```Java BoundedSemaphore semaphore = new BoundedSemaphore(1); -... - semaphore.take(); try{ From dabdaabb109c7995e81134821cb8dfd5b1ff048b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 18:07:27 +0800 Subject: [PATCH 340/524] Published with https://stackedit.io/ --- "Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index cb368f0..357618e 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -154,7 +154,9 @@ try{ } ``` -In contrast to the signaling use case the methods take() and release() are now called by the same thread. Since only one thread is allowed to take the semaphore, all other threads calling take() will be blocked until release() is called. The call to release() will never block since there has always been a call to take() first. +与发送信号不同,这里的`take()`方法和`release()`方法都是在同一个线程里面调用的。这是因为当上界为1时,一个线程调用`take()`方法后,其他调用`take()`方法的线程都会阻塞,直到这个线程调用`release()`方法。 + +你也可以利用**有界信号量**去限制同时进入同一个临界区的线程数量。举个例子,在上面的例子中,假如将limit的值设置为5会发生什么情况呢?5个线程会被允许同时进入同一个临界区。 You can also use a bounded semaphore to limit the number of threads allowed into a section of code. For instance, in the example above, what would happen if you set the limit of the BoundedSemaphore to 5? 5 threads would be allowed to enter the critical section at a time. You would have to make sure though, that the thread operations do not conflict for these 5 threads, or you application will fail. From 36cee013ea69ee96a4ea83a792da1565a7f3eff6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 18:11:06 +0800 Subject: [PATCH 341/524] Published with https://stackedit.io/ --- .../19.\344\277\241\345\217\267\351\207\217.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" index 357618e..5fdcae9 100644 --- "a/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" +++ "b/Java-Concurrency/19.\344\277\241\345\217\267\351\207\217.md" @@ -156,9 +156,7 @@ try{ 与发送信号不同,这里的`take()`方法和`release()`方法都是在同一个线程里面调用的。这是因为当上界为1时,一个线程调用`take()`方法后,其他调用`take()`方法的线程都会阻塞,直到这个线程调用`release()`方法。 -你也可以利用**有界信号量**去限制同时进入同一个临界区的线程数量。举个例子,在上面的例子中,假如将limit的值设置为5会发生什么情况呢?5个线程会被允许同时进入同一个临界区。 +你也可以利用**有界信号量**去限制同时进入同一个临界区的线程数量。举个例子,在上面的例子中,假如将limit的值设置为5会发生什么情况呢?5个线程会被允许同时进入同一个临界区。当然,你也需要确保这5个线程间的操作不会互相干扰,否则应用程序会因此挂掉。 -You can also use a bounded semaphore to limit the number of threads allowed into a section of code. For instance, in the example above, what would happen if you set the limit of the BoundedSemaphore to 5? 5 threads would be allowed to enter the critical section at a time. You would have to make sure though, that the thread operations do not conflict for these 5 threads, or you application will fail. - -The relase() method is called from inside a finally-block to make sure it is called even if an exception is thrown from the critical section. +`release()`方法在`finally`块中被调用,这样就可以确保即使临界区发生异常时,`release()`总能够被调用。 From 7d49d8a84ad330d64c34d4416831d3490227da9d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 18:22:13 +0800 Subject: [PATCH 342/524] Published with https://stackedit.io/ From 9936de097d2de6c58cdd2a80e85cbfb894b6c176 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 18:35:12 +0800 Subject: [PATCH 343/524] Published with https://stackedit.io/ --- .../20.\351\230\273\345\241\236\351\230\237\345\210\227.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" index 96bd0dc..4c3b1aa 100644 --- "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" +++ "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" @@ -1,5 +1,7 @@ #20.阻塞队列 +**阻塞队列**是这样一种队列:当队列为空时**出列(dequeue)**会阻塞,当队列满时**入队**会阻塞。 + A blocking queue is a queue that blocks when you try to dequeue from it and the queue is empty, or if you try to enqueue items to it and the queue is already full. A thread trying to dequeue from an empty queue is blocked until some other thread inserts an item into the queue. A thread trying to enqueue an item in a full queue is blocked until some other thread makes space in the queue, either by dequeuing one or more items or clearing the queue completely. Here is a diagram showing two threads cooperating via a blocking queue: @@ -11,7 +13,7 @@ A BlockingQueue with one thread putting into it, and another thread taking from Java 5 comes with blocking queue implementations in the java.util.concurrent package. You can read about that class in my java.util.concurrent.BlockingQueue tutorial. Even if Java 5 comes with a blocking queue implementation, it can be useful to know the theory behind their implementation. -Blocking Queue Implementation +##Blocking Queue Implementation The implementation of a blocking queue looks similar to a Bounded Semaphore. Here is a simple implementation of a blocking queue: From ab198442f582e8992a3c233297ebe2e48d981a18 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 18:49:40 +0800 Subject: [PATCH 344/524] Published with https://stackedit.io/ --- ...273\345\241\236\351\230\237\345\210\227.md" | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" index 4c3b1aa..004c00a 100644 --- "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" +++ "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" @@ -1,22 +1,19 @@ #20.阻塞队列 -**阻塞队列**是这样一种队列:当队列为空时**出列(dequeue)**会阻塞,当队列满时**入队**会阻塞。 +**阻塞队列**是这样一种队列:当队列为空时**出列(dequeue)**会阻塞,当队列满时**入队**会阻塞。当一个线程试图从一个空队列出列就会进入阻塞,直到其他线程将元素入列;当一个线程试图从一个满的队列中入列也会阻塞,直到其他线程将对队列中的元素出列或者将队列清空。 -A blocking queue is a queue that blocks when you try to dequeue from it and the queue is empty, or if you try to enqueue items to it and the queue is already full. A thread trying to dequeue from an empty queue is blocked until some other thread inserts an item into the queue. A thread trying to enqueue an item in a full queue is blocked until some other thread makes space in the queue, either by dequeuing one or more items or clearing the queue completely. +下面的图展示了两个线程如何跟阻塞队列进行交互: -Here is a diagram showing two threads cooperating via a blocking queue: -![enter image description here](http://tutorials.jenkov.com/images/java-concurrency-utils/blocking-queue.png) +![A BlockingQueue with one thread putting into it, and another thread taking from it.](http://tutorials.jenkov.com/images/java-concurrency-utils/blocking-queue.png) -A BlockingQueue with one thread putting into it, and another thread taking from it. -A BlockingQueue with one thread putting into it, and another thread taking from it. -Java 5 comes with blocking queue implementations in the java.util.concurrent package. You can read about that class in my java.util.concurrent.BlockingQueue tutorial. Even if Java 5 comes with a blocking queue implementation, it can be useful to know the theory behind their implementation. +Java 5的`java.util.concurrent`包中引入了阻塞队列的实现。即使如此,了解底层的实现原理也是非常有必要和有帮助的。 +##阻塞队列的实现(Blocking Queue Implementation) -##Blocking Queue Implementation - -The implementation of a blocking queue looks similar to a Bounded Semaphore. Here is a simple implementation of a blocking queue: + **阻塞队列**的实现跟**有界信号量**的实现类似。下面是一个阻塞队列的实现: +```Java public class BlockingQueue { private List queue = new LinkedList(); @@ -52,5 +49,6 @@ public class BlockingQueue { } } +``` Notice how notifyAll() is only called from enqueue() and dequeue() if the queue size is equal to the size bounds (0 or limit). If the queue size is not equal to either bound when enqueue() or dequeue() is called, there can be no threads waiting to either enqueue or dequeue items. \ No newline at end of file From d0740497a3c40f1e3349502db551d9719c2c1d62 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 18:50:34 +0800 Subject: [PATCH 345/524] Published with https://stackedit.io/ --- .../20.\351\230\273\345\241\236\351\230\237\345\210\227.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" index 004c00a..a2061b1 100644 --- "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" +++ "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" @@ -24,8 +24,7 @@ public class BlockingQueue { } - public synchronized void enqueue(Object item) - throws InterruptedException { + public synchronized void enqueue(Object item) throws InterruptedException { while(this.queue.size() == this.limit) { wait(); } @@ -36,8 +35,7 @@ public class BlockingQueue { } - public synchronized Object dequeue() - throws InterruptedException{ + public synchronized Object dequeue() throws InterruptedException{ while(this.queue.size() == 0){ wait(); } From b03a6c9983c5e3e643b1fea8237e13fa1f634fe7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 22 Sep 2014 18:54:38 +0800 Subject: [PATCH 346/524] Published with https://stackedit.io/ --- .../20.\351\230\273\345\241\236\351\230\237\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" index a2061b1..660a140 100644 --- "a/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" +++ "b/Java-Concurrency/20.\351\230\273\345\241\236\351\230\237\345\210\227.md" @@ -49,4 +49,4 @@ public class BlockingQueue { } ``` -Notice how notifyAll() is only called from enqueue() and dequeue() if the queue size is equal to the size bounds (0 or limit). If the queue size is not equal to either bound when enqueue() or dequeue() is called, there can be no threads waiting to either enqueue or dequeue items. \ No newline at end of file +ok,很简单,也不过多解释了! \ No newline at end of file From eba5e579aa42d746665c809d61d9dc2b16965282 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 00:10:58 +0800 Subject: [PATCH 347/524] Published with https://stackedit.io/ From a5f88c0b662258db15ff094f42cdafb8a6cee3e6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 00:11:31 +0800 Subject: [PATCH 348/524] Published with https://stackedit.io/ --- "Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" index c457eef..759a402 100644 --- "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" +++ "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" @@ -10,6 +10,7 @@ Java 5 comes with built in thread pools in the java.util.concurrent package, so Here is a simple thread pool implementation: +```Java public class ThreadPool { private BlockingQueue taskQueue = null; @@ -72,6 +73,9 @@ public class PoolThread extends Thread { return isStopped; } } +``` + + The thread pool implementation consists of two parts. A ThreadPool class which is the public interface to the thread pool, and a PoolThread class which implements the threads that execute the tasks. To execute a task the method ThreadPool.execute(Runnable r) is called with a Runnable implementation as parameter. The Runnable is enqueued in the blocking queue internally, waiting to be dequeued. From 4dde4557b0cd2279b9394fc4c6bf06b5bb073204 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 00:45:20 +0800 Subject: [PATCH 349/524] Published with https://stackedit.io/ --- "Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" index 759a402..4a784da 100644 --- "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" +++ "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" @@ -1,5 +1,9 @@ #21.线程池 +当你需要在应用程序中限制同一时间线程的数量时,线程池就显得非常有用,因为创建并启动新的线程是消耗性能的。 + +给每个任务创建并启动单独的线程不同,你可以将任务交给线程池,当线程中有线程空闲时,x + Thread Pools are useful when you need to limit the number of threads running in your application at the same time. There is a performance overhead associated with starting a new thread, and each thread is also allocated some memory for its stack etc. Instead of starting a new thread for every task to execute concurrently, the task can be passed to a thread pool. As soon as the pool has any idle threads the task is assigned to one of them and executed. Internally the tasks are inserted into a Blocking Queue which the threads in the pool are dequeuing from. When a new task is inserted into the queue one of the idle threads will dequeue it successfully and execute it. The rest of the idle threads in the pool will be blocked waiting to dequeue tasks. From 77f2921ea65b0eeaaa737bdd928386dc504ecc92 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 01:24:10 +0800 Subject: [PATCH 350/524] Published with https://stackedit.io/ --- ...1.\347\272\277\347\250\213\346\261\240.md" | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" index 4a784da..dee496f 100644 --- "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" +++ "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" @@ -2,21 +2,16 @@ 当你需要在应用程序中限制同一时间线程的数量时,线程池就显得非常有用,因为创建并启动新的线程是消耗性能的。 -给每个任务创建并启动单独的线程不同,你可以将任务交给线程池,当线程中有线程空闲时,x +给每个任务创建并启动单独的线程不同,你可以将任务交给线程池,当线程中有线程空闲时,线程池就会将任务非配给线程执行。在线程池内部,任务被插入到一个阻塞队列里面,空闲线程将从这个队列汇总出列(dequeue)需要执行的任务。如果队列中没有任务,线程池中的空闲线程就会进入阻塞等待新的任务。 -Thread Pools are useful when you need to limit the number of threads running in your application at the same time. There is a performance overhead associated with starting a new thread, and each thread is also allocated some memory for its stack etc. +线程池经常被用于多线程处理的服务器中。每个到达服务器的连接都会被包装成一个任务然后交给线程池进行处理,线程池中的线程会并行地对这些任务进行处理。 -Instead of starting a new thread for every task to execute concurrently, the task can be passed to a thread pool. As soon as the pool has any idle threads the task is assigned to one of them and executed. Internally the tasks are inserted into a Blocking Queue which the threads in the pool are dequeuing from. When a new task is inserted into the queue one of the idle threads will dequeue it successfully and execute it. The rest of the idle threads in the pool will be blocked waiting to dequeue tasks. +Java 5中内置了线程池的实现,所以你不必要自己去实现线程池。但是了解其中的实现原理是非常有必要和有帮助的。 -Thread pools are often used in multi threaded servers. Each connection arriving at the server via the network is wrapped as a task and passed on to a thread pool. The threads in the thread pool will process the requests on the connections concurrently. A later trail will get into detail about implementing multithreaded servers in Java. - -Java 5 comes with built in thread pools in the java.util.concurrent package, so you don't have to implement your own thread pool. You can read more about it in my text on the java.util.concurrent.ExecutorService. Still it can be useful to know a bit about the implementation of a thread pool anyways. - -Here is a simple thread pool implementation: +下面是一个线程池的简单实现: ```Java public class ThreadPool { - private BlockingQueue taskQueue = null; private List threads = new ArrayList(); private boolean isStopped = false; @@ -33,9 +28,9 @@ public class ThreadPool { } public void synchronized execute(Runnable task){ - if(this.isStopped) throw - new IllegalStateException("ThreadPool is stopped"); - + if(this.isStopped) { + throw new IllegalStateException("ThreadPool is stopped"); + } this.taskQueue.enqueue(task); } From d20c2e1f044e20fc8cc4348380d5f40a29469fe5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 01:51:04 +0800 Subject: [PATCH 351/524] Published with https://stackedit.io/ --- ...1.\347\272\277\347\250\213\346\261\240.md" | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" index dee496f..035bad8 100644 --- "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" +++ "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" @@ -40,10 +40,9 @@ public class ThreadPool { thread.stop(); } } - } -public class PoolThread extends Thread { +public class PoolThread extends Thread { private BlockingQueue taskQueue = null; private boolean isStopped = false; @@ -74,13 +73,21 @@ public class PoolThread extends Thread { } ``` +线程池的实现由两部分组成。ThreadPool类是公开的线程池接口,PoolThread类继承Thread用于执行线程。 + +执行任务的`PoolThread.execute(Runnable r)`方法带有一个Runnable作为参数。Runnable对象入列到**阻塞队列**中并等待出列被线程执行。 + +当线程池中有空闲线程时,阻塞队列的Runnable对象就会被出列并被线程执行。你可以看下`PoolThread.run()`方法的实现,当前任务执行完后,会再次检查阻塞队列是否有任务执行,直到`stop()`方法被调用。 + +当需要停止线程池可以调用`ThreadPool.stop()`方法,此时会有一个isStopped成员变量来标记线程池被停止。然后逐个调用线程池中线程的`PoolThread.stop()`方法。注意当线程池被停止后再调用`execute()`方法,则会抛出IllegaStateException异常。 + + -The thread pool implementation consists of two parts. A ThreadPool class which is the public interface to the thread pool, and a PoolThread class which implements the threads that execute the tasks. -To execute a task the method ThreadPool.execute(Runnable r) is called with a Runnable implementation as parameter. The Runnable is enqueued in the blocking queue internally, waiting to be dequeued. +The threads will stop after finishing any task they are currently executing. Notice the this.interrupt() call in PoolThread.stop(). This makes sure that a thread blocked in a wait() call inside the taskQueue.dequeue() call breaks out of the wait() call, and leaves the dequeue() method call with an InterruptedException thrown. This exception is caught in the PoolThread.run() method, reported, and then the isStopped variable is checked. Since isStopped is now true, the PoolThread.run() will exit and the thread dies. -The Runnable will be dequeued by an idle PoolThread and executed. You can see this in the PoolThread.run() method. After execution the PoolThread loops and tries to dequeue a task again, until stopped. +可运行将闲置PoolThread离队并执行。你可以看到在PoolThread.run()方法。执行后PoolThread循环,并尝试再次出列任务,直到停止。 -To stop the ThreadPool the method ThreadPool.stop() is called. The stop called is noted internally in the isStopped member. Then each thread in the pool is stopped by calling PoolThread.stop(). Notice how the execute() method will throw an IllegalStateException if execute() is called after stop() has been called. +停止线程池的方法ThreadPool.stop()被调用。所谓停止在内部指出,在isStopped成员。然后在池中的每个线程通过调用PoolThread.stop停止()。注意execute()方法将如何抛出IllegalStateException如果执行()停止后称为()被调用。 -The threads will stop after finishing any task they are currently executing. Notice the this.interrupt() call in PoolThread.stop(). This makes sure that a thread blocked in a wait() call inside the taskQueue.dequeue() call breaks out of the wait() call, and leaves the dequeue() method call with an InterruptedException thrown. This exception is caught in the PoolThread.run() method, reported, and then the isStopped variable is checked. Since isStopped is now true, the PoolThread.run() will exit and the thread dies. \ No newline at end of file +整理他们目前正在执行的所有任务后,线程将停止。注意在PoolThread.stop的this.interrupt()()的调用。这将确保一个线程阻塞在taskQueue.dequeue()调用中断了wait()调用内部的wait()调用,并离开出列()方法调用抛出一个InterruptedException。这个异常被捕获在PoolThread.run()方法,报告,然后isStopped变量进行检查。由于isStopped现在是真,PoolThread.run()将退出与线程死亡。 From f588a9bf2bd6e823744f06f6fc4dbf91f6a13ed5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 01:53:30 +0800 Subject: [PATCH 352/524] Published with https://stackedit.io/ --- .../21.\347\272\277\347\250\213\346\261\240.md" | 9 --------- 1 file changed, 9 deletions(-) diff --git "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" index 035bad8..47fa13f 100644 --- "a/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" +++ "b/Java-Concurrency/21.\347\272\277\347\250\213\346\261\240.md" @@ -81,13 +81,4 @@ public class PoolThread extends Thread { 当需要停止线程池可以调用`ThreadPool.stop()`方法,此时会有一个isStopped成员变量来标记线程池被停止。然后逐个调用线程池中线程的`PoolThread.stop()`方法。注意当线程池被停止后再调用`execute()`方法,则会抛出IllegaStateException异常。 - - - The threads will stop after finishing any task they are currently executing. Notice the this.interrupt() call in PoolThread.stop(). This makes sure that a thread blocked in a wait() call inside the taskQueue.dequeue() call breaks out of the wait() call, and leaves the dequeue() method call with an InterruptedException thrown. This exception is caught in the PoolThread.run() method, reported, and then the isStopped variable is checked. Since isStopped is now true, the PoolThread.run() will exit and the thread dies. - -可运行将闲置PoolThread离队并执行。你可以看到在PoolThread.run()方法。执行后PoolThread循环,并尝试再次出列任务,直到停止。 - -停止线程池的方法ThreadPool.stop()被调用。所谓停止在内部指出,在isStopped成员。然后在池中的每个线程通过调用PoolThread.stop停止()。注意execute()方法将如何抛出IllegalStateException如果执行()停止后称为()被调用。 - -整理他们目前正在执行的所有任务后,线程将停止。注意在PoolThread.stop的this.interrupt()()的调用。这将确保一个线程阻塞在taskQueue.dequeue()调用中断了wait()调用内部的wait()调用,并离开出列()方法调用抛出一个InterruptedException。这个异常被捕获在PoolThread.run()方法,报告,然后isStopped变量进行检查。由于isStopped现在是真,PoolThread.run()将退出与线程死亡。 From 95277f5d0d97aecaf3117c47b4687d942320c5e3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 01:54:37 +0800 Subject: [PATCH 353/524] Published with https://stackedit.io/ From fc4b12640d96c528afce81e9e22d4ec8641e7b11 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 01:57:00 +0800 Subject: [PATCH 354/524] Published with https://stackedit.io/ --- ...20\345\220\214\346\255\245\345\231\250.md" | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index 89aa638..41bb786 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -15,12 +15,13 @@ Test and Set Method Set Method Not all synchronizers have all of these parts, and those that have may not have them exactly as they are described here. Usually you can find one or more of these parts, though. -State +##State The state of a synchronizer is used by the access condition to determine if a thread can be granted access. In a Lock the state is kept in a boolean saying whether the Lock is locked or not. In a Bounded Semaphore the internal state is kept in a counter (int) and an upper bound (int) which state the current number of "takes" and the maximum number of "takes". In a Blocking Queue the state is kept in the List of elements in the queue and the maximum queue size (int) member (if any). Here are two code snippets from both Lock and a BoundedSemaphore. The state code is marked in bold. +```Java public class Lock{ //state is kept here @@ -53,7 +54,9 @@ public class BoundedSemaphore { } ... } -Access Condition +``` + +##Access Condition The access conditions is what determines if a thread calling a test-and-set-state method can be allowed to set the state or not. The access condition is typically based on the state of the synchronizer. The access condition is typically checked in a while loop to guard against Spurious Wakeups. When the access condition is evaluated it is either true or false. @@ -61,6 +64,7 @@ In a Lock the access condition simply checks the value of the isLocked member va Here are two code snippets of a Lock and a BoundedSemaphore with the access condition marked in bold. Notice how the conditions is always checked inside a while loop. +```Java public class Lock{ private boolean isLocked = false; @@ -98,7 +102,9 @@ public class BoundedSemaphore { this.notify(); } } -State Changes +``` + +##State Changes Once a thread gains access to the critical section it has to change the state of the synchronizer to (possibly) block other threads from entering it. In other words, the state needs to reflect the fact that a thread is now executing inside the critical section. This should affect the access conditions of other threads attempting to gain access. @@ -106,6 +112,7 @@ In a Lock the state change is the code setting isLocked = true. In a semaphore i Here are two code snippets with the state change code marked in bold: +```Java public class Lock{ private boolean isLocked = false; @@ -147,15 +154,20 @@ public class BoundedSemaphore { this.notify(); } } -Notification Strategy +`` + +##Notification Strategy Once a thread has changed the state of a synchronizer it may sometimes need to notify other waiting threads about the state change. Perhaps this state change might turn the access condition true for other threads. Notification Strategies typically fall into three categories. +``` Notify all waiting threads. Notify 1 random of N waiting threads. Notify 1 specific of N waiting thread. +``` + Notifying all waiting threads is pretty easy. All waiting threads call wait() on the same object. Once a thread want to notify the waiting threads it calls notifyAll() on the object the waiting threads called wait() on. Notifying a single random waiting thread is also pretty easy. Just have the notifying thread call notify() on the object the waiting threads have called wait() on. Calling notify makes no guarantee about which of the waiting threads will be notified. Hence the term "random waiting thread". @@ -164,6 +176,7 @@ Sometimes you may need to notify a specific rather than a random waiting thread. Below is a code snippet with the notification strategy (notify 1 random waiting thread) marked in bold: +```Java public class Lock{ private boolean isLocked = false; @@ -182,7 +195,9 @@ public class Lock{ notify(); //notification strategy } } -Test and Set Method +``` + +##Test and Set Method Synchronizer most often have two types of methods of which test-and-set is the first type (set is the other). Test-and-set means that the thread calling this method tests the internal state of the synchronizer against the access condition. If the condition is met the thread sets the internal state of the synchronizer to reflect that the thread has gained access. @@ -198,6 +213,7 @@ If access condition is not met, wait If access condition is met, set state, and notify waiting threads if necessary The lockWrite() method of a ReadWriteLock class shown below is an example of a test-and-set method. Threads calling lockWrite() first sets the state before the test (writeRequests++). Then it tests the internal state against the access condition in the canGrantWriteAccess() method. If the test succeeds the internal state is set again before the method is exited. Notice that this method does not notify waiting threads. +```Java public class ReadWriteLock{ private Map readingThreads = new HashMap(); @@ -223,9 +239,12 @@ public class ReadWriteLock{ ... } +``` + The BoundedSemaphore class shown below has two test-and-set methods: take() and release(). Both methods test and sets the internal state. +```Java public class BoundedSemaphore { private int signals = 0; private int bound = 0; @@ -248,7 +267,9 @@ public class BoundedSemaphore { } } -Set Method +``` + +##Set Method The set method is the second type of method that synchronizers often contain. The set method just sets the internal state of the synchronizer without testing it first. A typical example of a set method is the unlock() method of a Lock class. A thread holding the lock can always unlock it without having to test if the Lock is unlocked. @@ -258,6 +279,7 @@ Set internal state Notify waiting threads Here is an example unlock() method: +```Java public class Lock{ private boolean isLocked = false; @@ -267,4 +289,5 @@ public class Lock{ notify(); } -} \ No newline at end of file +} +``` \ No newline at end of file From 435dd728f85e4301c071851ec5991c792a6c6b97 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 01:58:57 +0800 Subject: [PATCH 355/524] Published with https://stackedit.io/ --- ...11\226\346\236\220\345\220\214\346\255\245\345\231\250.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index 41bb786..f843bf4 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -154,7 +154,7 @@ public class BoundedSemaphore { this.notify(); } } -`` +``` ##Notification Strategy @@ -162,7 +162,7 @@ Once a thread has changed the state of a synchronizer it may sometimes need to n Notification Strategies typically fall into three categories. -``` +```Java Notify all waiting threads. Notify 1 random of N waiting threads. Notify 1 specific of N waiting thread. From c497558f016d25ce53b0cdde0a5b5fa0250f026c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 02:03:10 +0800 Subject: [PATCH 356/524] Published with https://stackedit.io/ --- ...26\346\236\220\345\220\214\346\255\245\345\231\250.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index f843bf4..23fe3e9 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -15,7 +15,7 @@ Test and Set Method Set Method Not all synchronizers have all of these parts, and those that have may not have them exactly as they are described here. Usually you can find one or more of these parts, though. -##State +##状态(State) The state of a synchronizer is used by the access condition to determine if a thread can be granted access. In a Lock the state is kept in a boolean saying whether the Lock is locked or not. In a Bounded Semaphore the internal state is kept in a counter (int) and an upper bound (int) which state the current number of "takes" and the maximum number of "takes". In a Blocking Queue the state is kept in the List of elements in the queue and the maximum queue size (int) member (if any). @@ -56,7 +56,7 @@ public class BoundedSemaphore { } ``` -##Access Condition +##访问条件(Access Condition) The access conditions is what determines if a thread calling a test-and-set-state method can be allowed to set the state or not. The access condition is typically based on the state of the synchronizer. The access condition is typically checked in a while loop to guard against Spurious Wakeups. When the access condition is evaluated it is either true or false. @@ -104,7 +104,7 @@ public class BoundedSemaphore { } ``` -##State Changes +##状态变化(State Changes) Once a thread gains access to the critical section it has to change the state of the synchronizer to (possibly) block other threads from entering it. In other words, the state needs to reflect the fact that a thread is now executing inside the critical section. This should affect the access conditions of other threads attempting to gain access. @@ -156,7 +156,7 @@ public class BoundedSemaphore { } ``` -##Notification Strategy +##通知策略(Notification Strategy) Once a thread has changed the state of a synchronizer it may sometimes need to notify other waiting threads about the state change. Perhaps this state change might turn the access condition true for other threads. From 4895d88323f8ccf65e1cc126a73dc3e198ec5da9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 02:05:39 +0800 Subject: [PATCH 357/524] Published with https://stackedit.io/ --- ...6\220\345\220\214\346\255\245\345\231\250.md" | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index 23fe3e9..5a42d0f 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -117,8 +117,7 @@ public class Lock{ private boolean isLocked = false; - public synchronized void lock() - throws InterruptedException{ + public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } @@ -181,8 +180,7 @@ public class Lock{ private boolean isLocked = false; - public synchronized void lock() - throws InterruptedException{ + public synchronized void lock() throws InterruptedException{ while(isLocked){ //wait strategy - related to notification strategy wait(); @@ -215,26 +213,24 @@ The lockWrite() method of a ReadWriteLock class shown below is an example of a t ```Java public class ReadWriteLock{ - private Map readingThreads = - new HashMap(); + private Map readingThreads = new HashMap(); private int writeAccesses = 0; private int writeRequests = 0; private Thread writingThread = null; ... - - public synchronized void lockWrite() throws InterruptedException{ + public synchronized void lockWrite() throws InterruptedException{ writeRequests++; Thread callingThread = Thread.currentThread(); while(! canGrantWriteAccess(callingThread)){ - wait(); + wait(); } writeRequests--; writeAccesses++; writingThread = callingThread; - } + } ... From 7bc694c5074e0a8fb1a8bf00e58ff59d710823d2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 02:06:15 +0800 Subject: [PATCH 358/524] Published with https://stackedit.io/ --- ...20\345\220\214\346\255\245\345\231\250.md" | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index 5a42d0f..30bb9b5 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -250,17 +250,17 @@ public class BoundedSemaphore { } - public synchronized void take() throws InterruptedException{ - while(this.signals == bound) wait(); - this.signals++; - this.notify(); - } - - public synchronized void release() throws InterruptedException{ - while(this.signals == 0) wait(); - this.signals--; - this.notify(); - } + public synchronized void take() throws InterruptedException{ + while(this.signals == bound) wait(); + this.signals++; + this.notify(); + } + + public synchronized void release() throws InterruptedException{ + while(this.signals == 0) wait(); + this.signals--; + this.notify(); + } } ``` @@ -280,10 +280,10 @@ public class Lock{ private boolean isLocked = false; - public synchronized void unlock(){ - isLocked = false; + public synchronized void unlock(){ + isLocked = false; notify(); - } + } } ``` \ No newline at end of file From c8e31c50260c29430cbab8263d12ff0d82b24db6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 02:21:18 +0800 Subject: [PATCH 359/524] Published with https://stackedit.io/ --- ...11\226\346\236\220\345\220\214\346\255\245\345\231\250.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index 30bb9b5..fd5a369 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -1,9 +1,9 @@ #22.剖析同步器 -Even if many synchronizers (locks, semaphores, blocking queue etc.) are different in function, they are often not that different in their internal design. In other words, they consist of the same (or similar) basic parts internally. Knowing these basic parts can be a great help when designing synchronizers. It is these parts this text looks closer at. +虽然很多同步器(锁、信号量、阻塞队列等)在使用方式上不同,但是它们的内部设计上并非总不一样。换言之,**它们内部都是由相同或相似的基本部件组成**。了解这些基本部件对设计同步器非常有帮助,这正是本文将要讲的内容。 -Note: The content of this text is a part result of a M.Sc. student project at the IT University of Copenhagen in the spring 2004 by Jakob Jenkov, Toke Johansen and Lars Bjørn. During this project we asked Doug Lea if he knew of similar work. Interestingly he had come up with similar conclusions independently of this project during the development of the Java 5 concurrency utilities. Doug Lea's work, I believe, is described in the book "Java Concurrency in Practice". This book also contains a chapter with the title "Anatomy of a Synchronizer" with content similar to this text, though not exactly the same. +(Note: The content of this text is a part result of a M.Sc. student project at the IT University of Copenhagen in the spring 2004 by Jakob Jenkov, Toke Johansen and Lars Bjørn. During this project we asked Doug Lea if he knew of similar work. Interestingly he had come up with similar conclusions independently of this project during the development of the Java 5 concurrency utilities. Doug Lea's work, I believe, is described in the book "Java Concurrency in Practice". This book also contains a chapter with the title "Anatomy of a Synchronizer" with content similar to this text, though not exactly the same.) The purpose of most (if not all) synchronizers is to guard some area of the code (critical section) from concurrent access by threads. To do this the following parts are often needed in a synchronizer: From 10494c6fd71260665a45672aa1788782d8f8d388 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 02:42:27 +0800 Subject: [PATCH 360/524] Published with https://stackedit.io/ --- ...20\345\220\214\346\255\245\345\231\250.md" | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index fd5a369..5ed2e9e 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -5,18 +5,22 @@ (Note: The content of this text is a part result of a M.Sc. student project at the IT University of Copenhagen in the spring 2004 by Jakob Jenkov, Toke Johansen and Lars Bjørn. During this project we asked Doug Lea if he knew of similar work. Interestingly he had come up with similar conclusions independently of this project during the development of the Java 5 concurrency utilities. Doug Lea's work, I believe, is described in the book "Java Concurrency in Practice". This book also contains a chapter with the title "Anatomy of a Synchronizer" with content similar to this text, though not exactly the same.) -The purpose of most (if not all) synchronizers is to guard some area of the code (critical section) from concurrent access by threads. To do this the following parts are often needed in a synchronizer: -State -Access Condition -State Changes -Notification Strategy -Test and Set Method -Set Method -Not all synchronizers have all of these parts, and those that have may not have them exactly as they are described here. Usually you can find one or more of these parts, though. +绝大部分同步器的目的都是为了在多线程并发环境中保护**临界区(critical section)**。为了实现这些功能,同步器需要包含以下部件: + +* 状态(State) +* 访问条件(Access Condition) +* 状态变化(State Changes) +* 通知策略(Notification Strategy) +* Test and Set Method +* Set Method + +并不是所有的同步器都包含以上组件,也不是所有的部件都如这里描述的完全一样,然而,你还是可以中找到一个或更多的部件。 ##状态(State) + + The state of a synchronizer is used by the access condition to determine if a thread can be granted access. In a Lock the state is kept in a boolean saying whether the Lock is locked or not. In a Bounded Semaphore the internal state is kept in a counter (int) and an upper bound (int) which state the current number of "takes" and the maximum number of "takes". In a Blocking Queue the state is kept in the List of elements in the queue and the maximum queue size (int) member (if any). Here are two code snippets from both Lock and a BoundedSemaphore. The state code is marked in bold. From 55c379e931605e5efb2071f95368526aef711af1 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 03:06:18 +0800 Subject: [PATCH 361/524] Published with https://stackedit.io/ --- ...26\346\236\220\345\220\214\346\255\245\345\231\250.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index 5ed2e9e..41ff374 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -19,17 +19,15 @@ ##状态(State) - - The state of a synchronizer is used by the access condition to determine if a thread can be granted access. In a Lock the state is kept in a boolean saying whether the Lock is locked or not. In a Bounded Semaphore the internal state is kept in a counter (int) and an upper bound (int) which state the current number of "takes" and the maximum number of "takes". In a Blocking Queue the state is kept in the List of elements in the queue and the maximum queue size (int) member (if any). -Here are two code snippets from both Lock and a BoundedSemaphore. The state code is marked in bold. +下面两段代码片段分别来自于**Lock**类和**BoundedSemaphore**类。状态的代码使用粗体标识: ```Java public class Lock{ - //state is kept here - private boolean isLocked = false; + **//state is kept here** + **private boolean isLocked = false;** public synchronized void lock() throws InterruptedException{ From 38599dfc1262ef22ebbcfb46fb5d3993898d861c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 03:07:13 +0800 Subject: [PATCH 362/524] Published with https://stackedit.io/ --- ...\236\220\345\220\214\346\255\245\345\231\250.md" | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index 41ff374..e25c5bf 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -21,16 +21,15 @@ The state of a synchronizer is used by the access condition to determine if a thread can be granted access. In a Lock the state is kept in a boolean saying whether the Lock is locked or not. In a Bounded Semaphore the internal state is kept in a counter (int) and an upper bound (int) which state the current number of "takes" and the maximum number of "takes". In a Blocking Queue the state is kept in the List of elements in the queue and the maximum queue size (int) member (if any). -下面两段代码片段分别来自于**Lock**类和**BoundedSemaphore**类。状态的代码使用粗体标识: +下面两段代码片段分别来自于**Lock**类和**BoundedSemaphore**类。状态的代码注释标识: ```Java public class Lock{ - **//state is kept here** - **private boolean isLocked = false;** + //state is kept here + private boolean isLocked = false; - public synchronized void lock() - throws InterruptedException{ + public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } @@ -42,8 +41,8 @@ public class Lock{ public class BoundedSemaphore { //state is kept here - private int signals = 0; - private int bound = 0; + private int signals = 0; + private int bound = 0; public BoundedSemaphore(int upperBound){ this.bound = upperBound; From c3be38c3168b3f9cfd3a5564248a673ee3b92ae1 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 03:09:22 +0800 Subject: [PATCH 363/524] Published with https://stackedit.io/ --- ...236\220\345\220\214\346\255\245\345\231\250.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index e25c5bf..c26d9a0 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -59,7 +59,7 @@ public class BoundedSemaphore { ##访问条件(Access Condition) -The access conditions is what determines if a thread calling a test-and-set-state method can be allowed to set the state or not. The access condition is typically based on the state of the synchronizer. The access condition is typically checked in a while loop to guard against Spurious Wakeups. When the access condition is evaluated it is either true or false. +The access conditions is what determines if a thread calling a **test-and-set-state** method can be allowed to set the state or not. The access condition is typically based on the state of the synchronizer. The access condition is typically checked in a while loop to guard against Spurious Wakeups. When the access condition is evaluated it is either true or false. In a Lock the access condition simply checks the value of the isLocked member variable. In a Bounded Semaphore there are actually two access conditions depending on whether you are trying to "take" or "release" the semaphore. If a thread tries to take the semaphore the signals variable is checked against the upper bound. If a thread tries to release the semaphore the signals variable is checked against 0. @@ -67,11 +67,9 @@ Here are two code snippets of a Lock and a BoundedSemaphore with the access cond ```Java public class Lock{ - private boolean isLocked = false; - public synchronized void lock() - throws InterruptedException{ + public synchronized void lock() throws InterruptedException{ //access condition while(isLocked){ wait(); @@ -258,9 +256,11 @@ public class BoundedSemaphore { } public synchronized void release() throws InterruptedException{ - while(this.signals == 0) wait(); - this.signals--; - this.notify(); + while(this.signals == 0) { + wait(); + } + this.signals--; + this.notify(); } } From 213c7761dfbbca9dd93a74d6973f109d05390396 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 03:09:43 +0800 Subject: [PATCH 364/524] Published with https://stackedit.io/ --- ...5\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index c26d9a0..e1fb969 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -278,7 +278,6 @@ Here is an example unlock() method: ```Java public class Lock{ - private boolean isLocked = false; public synchronized void unlock(){ From 2626ec4fd115c95adb14755eea11079e2ea7c3ae Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 03:10:20 +0800 Subject: [PATCH 365/524] Published with https://stackedit.io/ --- ...26\346\236\220\345\220\214\346\255\245\345\231\250.md" | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index e1fb969..ab38472 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -250,9 +250,11 @@ public class BoundedSemaphore { public synchronized void take() throws InterruptedException{ - while(this.signals == bound) wait(); - this.signals++; - this.notify(); + while(this.signals == bound) { + wait(); + } + this.signals++; + this.notify(); } public synchronized void release() throws InterruptedException{ From 29f3771665f6f1fd2e19faa716f38e85ea722d2a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 03:18:55 +0800 Subject: [PATCH 366/524] Published with https://stackedit.io/ --- ...\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" index ab38472..a9b42ef 100644 --- "a/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" +++ "b/Java-Concurrency/22.\345\211\226\346\236\220\345\220\214\346\255\245\345\231\250.md" @@ -59,7 +59,7 @@ public class BoundedSemaphore { ##访问条件(Access Condition) -The access conditions is what determines if a thread calling a **test-and-set-state** method can be allowed to set the state or not. The access condition is typically based on the state of the synchronizer. The access condition is typically checked in a while loop to guard against Spurious Wakeups. When the access condition is evaluated it is either true or false. +**访问条件(Access Condition)**用来决定线程调用**test-and-set-state**方法是否可以改变**状态(State)**。访问条件通常基于同步器的状态。访问条件通常在while循环中进行判断以防止**假唤醒(Spurious Wakeups)**。当对访问条件进行判断时,只返回true或false。 In a Lock the access condition simply checks the value of the isLocked member variable. In a Bounded Semaphore there are actually two access conditions depending on whether you are trying to "take" or "release" the semaphore. If a thread tries to take the semaphore the signals variable is checked against the upper bound. If a thread tries to release the semaphore the signals variable is checked against 0. From c444902cb5c298587cfdc1feb199df87724e4d8d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 09:55:56 +0800 Subject: [PATCH 367/524] Published with https://stackedit.io/ From c05d7216f520433b134662c1393206b4cade9782 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:06:52 +0800 Subject: [PATCH 368/524] Published with https://stackedit.io/ --- .../06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index bf8a103..634f305 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -102,7 +102,7 @@ Channel channel = selectionKey.channel(); Selector selector = selectionKey.selector(); ``` -###Attaching Objects +###附加对象(Attaching Objects) You can attach an object to a SelectionKey this is a handy way of recognizing a given channel, or attaching further information to the channel. For instance, you may attach the Buffer you are using with the channel, or an object containing more aggregate data. Here is how you attach objects: @@ -120,7 +120,7 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); ##Selecting Channels via a Selector - 当向选择器注册一个或多个通道后,可以调用`Selector.slect(...)`方法,这个返回会当前已经就绪的通道(说明该通道有选择器监听的事件就绪)的个数。换言之,如果选择器监听了一个通道的读事件,当该通道有数据可读时,`Selector.select(...)`操作就会返回 1。 +当向选择器注册一个或多个通道后,可以调用`Selector.slect(...)`方法,这个返回会当前已经就绪的通道(说明该通道有选择器监听的事件就绪)的个数。换言之,如果选择器监听了一个通道的读事件,当该通道有数据可读时,`Selector.select(...)`操作就会返回 1。 有多个重载的`select()`方法: @@ -144,8 +144,6 @@ SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); Set selectedKeys = selector.selectedKeys(); ``` -当你通过`SelectableChannel.register()`注册通道时,返回一个SeletionKey对象。 - When you register a channel with a Selector the Channel.register() method returns a SelectionKey object. This key represents that channels registration with that selector. It is these keys you can access via the selectedKeySet() method. From the SelectionKey. You can iterate this selected key set to access the ready channels. Here is how that looks: From 94c2f07273ff06bf68e2d3c9b436d55204fbf114 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:07:52 +0800 Subject: [PATCH 369/524] Published with https://stackedit.io/ --- "Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" index 634f305..5af294c 100644 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -176,7 +176,7 @@ while(keyIterator.hasNext()) { This loop iterates the keys in the selected key set. For each key it tests the key to determine what the channel referenced by the key is ready for. -Notice the keyIterator.remove() call at the end of each iteration. The Selector does not remove the SelectionKey instances from the selected key set itself. You have to do this, when you are done processing the channel. The next time the channel becomes "ready" the Selector will add it to the selected key set again. +Notice the `keyIterator.remove()` call at the end of each iteration. The Selector does not remove the SelectionKey instances from the selected key set itself. You have to do this, when you are done processing the channel. The next time the channel becomes "ready" the Selector will add it to the selected key set again. The channel returned by the SelectionKey.channel() method should be cast to the channel you need to work with, e.g a ServerSocketChannel or SocketChannel etc. From 1b2edd6befdbc5dc1e5365d580d8fe9d686d69c8 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:09:24 +0800 Subject: [PATCH 370/524] Published with https://stackedit.io/ --- ...IO\351\200\211\346\213\251\345\231\250.md" | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 "Java-NIO/07.Java NIO\351\200\211\346\213\251\345\231\250.md" diff --git "a/Java-NIO/07.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/07.Java NIO\351\200\211\346\213\251\345\231\250.md" new file mode 100644 index 0000000..e11a4f6 --- /dev/null +++ "b/Java-NIO/07.Java NIO\351\200\211\346\213\251\345\231\250.md" @@ -0,0 +1,235 @@ +#07.Java NIO选择器 + +选择器(Selector)是Java NIO中的一个组件,它用于检测一个或多个通道,并确定哪些通道可以进行读、写。这就是为什么Java NIO中可以使用单个线程对多个通道或网络连接进行管理。 + + +##为何要使用选择器(Why Use a Selector?) + +使用选择器的优势在于:**使用单个线程就可以对多个管道进行操作,从而可以减少处理通道的线程数量**。实际上,你可以仅仅使用一个线程来处理所有的通道。在操作系统中,线程的切换是非常昂贵的,并且,每个线程需要消耗一定的系统资源(例如内存)。因此,线程使用越少越好。 + +不过,随着操作系统软硬件的更新迭代,多线程的开销越来越小,性能也越来越优异。而事实上,如果计算机拥有多个CPU内核,这时候如果不采用多线程,反而是对CPU资源的浪费。然而,这已不属于本教程讨论的范畴。 + +下面的图片描绘了如何使用一个选择器来处理3个通道: + +![Java NIO: A Thread uses a Selector to handle 3 Channel's](http://tutorials.jenkov.com/images/java-nio/overview-selectors.png) + +##创建选择器(Creating a Selector) + +可以通过`Selector.open()`方法来创建选择器: + +```Java +Selector selector = Selector.open(); +``` + +#Registering Channels with the Selector + +为了让选择器能够处理通道,必须向选择器注册需要处理的通道,调用`SelectableChannel.register()`方法来完成注册: + +``` +channel.configureBlocking(false); + +SelectionKey key = channel.register(selector, SelectionKey.OP_READ); +``` + +注册的通道必须先设置为**非阻塞模式(non-blocking mode)**。由于**FileChannel**不能设置为非阻塞模式,所以FileChannel不能进行注册,而**SocketChanne**l则可以。 + +注意`SelectableChannel.register()`方法的第二个参数。这个参数代表着**选择器需要监听通道的事件类型**。总共有四种不同的事件类型: + +通道**触发一个事件**,我们称之为**事件就绪**。所以,如果通道跟远程服务器建立了连接,称之为**连接就绪**;服务器socket接受客户端连接,称为**接收就绪**;通道中有数据可读,称为**读就绪**,可向通道中写数据,称为**写就绪**。 + +以上四个事件分别由`SelectionKey`类中的四个常量来表示: + +```Java +SelectionKey.OP_CONNECT +SelectionKey.OP_ACCEPT +SelectionKey.OP_READ +SelectionKey.OP_WRITE +``` + +如果需要监听多个事件,可以使用OR操作符: + +```Java +int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE; +``` +由于SelectionKey中是四个常量OP\_READ、OP\_WRITE、OP\_CONNECT、OP\_ACCEPTF分别用二进制0001、0010、0100、1000表示,所以可以通过interestSet中的二进制判断监听的事件类型。 + +##SelectionKey's + +上面的例子中,当调用`SelectableChannel.register()`向选择器注册通道后,该返回会返回一个`SeletionKey`对象。该`SelectionKey`对象包含以下属性: + +``` +The interest set(监听的事件集合) +The ready set(就绪的事件集合) +The Channel(通道) +The Selector(选择器) +An attached object (optional) +``` + +###Interest Set(监听的事件集合) + +InterestSet表示的是监听的时间集合,可以通过`SelctionKey.interestOPs()`方法获取监听的时间集合,它是一个int类型数据,由于SelectionKey中是四个常量OP\_READ、OP\_WRITE、OP\_CONNECT、OP\_ACCEPTF分别用二进制0001、0010、0100、1000表示,所以,我们可以通过**按位与**操作判断监听的事件类型: + +```Java +int interestSet = selectionKey.interestOps(); + +boolean isInterestedInAccept = interestSet & SelectionKey.OP_ACCEPT; +boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT; +boolean isInterestedInRead = interestSet & SelectionKey.OP_READ; +boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE; +``` + +###Ready Set(就绪集合) + +可以通过`SelectionKey.readyOps()`方法获取就绪集合。同样地,通过按位与操作判断就绪的事件类型: + +```Java +int readySet = selectionKey.readyOps(); + +selectionKey.isAcceptable(); +selectionKey.isConnectable(); +selectionKey.isReadable(); +selectionKey.isWritable(); +``` + + +###Channel + Selector(通道和选择器) + +Accessing the channel + selector from the SelectionKey is trivial. Here is how it's done: + +```Java +Channel channel = selectionKey.channel(); + +Selector selector = selectionKey.selector(); +``` + +###附加对象(Attaching Objects) + +You can attach an object to a SelectionKey this is a handy way of recognizing a given channel, or attaching further information to the channel. For instance, you may attach the Buffer you are using with the channel, or an object containing more aggregate data. Here is how you attach objects: + +```Java +selectionKey.attach(theObject); + +Object attachedObj = selectionKey.attachment(); +``` + +You can also attach an object already while registering the Channel with the Selector, in the register() method. Here is how that looks: + +```Java +SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); +``` + +##Selecting Channels via a Selector + +当向选择器注册一个或多个通道后,可以调用`Selector.slect(...)`方法,这个返回会当前已经就绪的通道(说明该通道有选择器监听的事件就绪)的个数。换言之,如果选择器监听了一个通道的读事件,当该通道有数据可读时,`Selector.select(...)`操作就会返回 1。 + +有多个重载的`select()`方法: + +> int select() +> int select(long timeout) +> int selectNow() + +`select()`方法会阻塞直到有通道事件就绪。 + +`select(long timeout)`方法会阻塞直到有通道事件就绪或超时。 + +`selectNow()`方法不管有没有通道事件就绪,都会立即返回。 + +`select()`返回值为int类型,代表从上次调用`select()`方法到这次的就绪通道数量。当你调用select返回1时,则代表上次调用select方法到这次调用之间有一个通道变成了就绪状态,然后,再次调用select方法,如果返回值为1,则说明又有一个通道变成了就绪状态。如果你没对第一个就绪通道进行处理,则此时共有两个就绪通道,虽然最后一次select的返回值为1。 + +###selectedKeys() + +当你调用select()方法返回值不为0时,则说明有一个或多个通道已经就绪。你可以通过调用`selector.selectedKeys()`获取就绪的通道: + +```Java +Set selectedKeys = selector.selectedKeys(); +``` + +When you register a channel with a Selector the Channel.register() method returns a SelectionKey object. This key represents that channels registration with that selector. It is these keys you can access via the selectedKeySet() method. From the SelectionKey. + +You can iterate this selected key set to access the ready channels. Here is how that looks: + +```Java +Set selectedKeys = selector.selectedKeys(); + +Iterator keyIterator = selectedKeys.iterator(); + +while(keyIterator.hasNext()) { + + SelectionKey key = keyIterator.next(); + + if(key.isAcceptable()) { + // a connection was accepted by a ServerSocketChannel. + + } else if (key.isConnectable()) { + // a connection was established with a remote server. + + } else if (key.isReadable()) { + // a channel is ready for reading + + } else if (key.isWritable()) { + // a channel is ready for writing + } + + keyIterator.remove(); +} +``` + +This loop iterates the keys in the selected key set. For each key it tests the key to determine what the channel referenced by the key is ready for. + +Notice the `keyIterator.remove()` call at the end of each iteration. The Selector does not remove the SelectionKey instances from the selected key set itself. You have to do this, when you are done processing the channel. The next time the channel becomes "ready" the Selector will add it to the selected key set again. + +The channel returned by the SelectionKey.channel() method should be cast to the channel you need to work with, e.g a ServerSocketChannel or SocketChannel etc. + +###wakeUp() + +A thread that has called the select() method which is blocked, can be made to leave the select() method, even if no channels are yet ready. This is done by having a different thread call the Selector.wakeup() method on the Selector which the first thread has called select() on. The thread waiting inside select() will then return immediately. + +If a different thread calls wakeup() and no thread is currently blocked inside select(), the next thread that calls select() will "wake up" immediately. + +###close() + +When you are finished with the Selector you call its close() method. This closes the Selector and invalidates all SelectionKey instances registered with this Selector. The channels themselves are not closed. + +##Full Selector Example + +Here is a full example which opens a Selector, registers a channel with it (the channel instantiation is left out), and keeps monitoring the Selector for "readiness" of the four events (accept, connect, read, write). + +Selector selector = Selector.open(); + +channel.configureBlocking(false); + +SelectionKey key = channel.register(selector, SelectionKey.OP_READ); + +```Java +while(true) { + + int readyChannels = selector.select(); + + if(readyChannels == 0) continue; + + + Set selectedKeys = selector.selectedKeys(); + + Iterator keyIterator = selectedKeys.iterator(); + + while(keyIterator.hasNext()) { + + SelectionKey key = keyIterator.next(); + + if(key.isAcceptable()) { + // a connection was accepted by a ServerSocketChannel. + + } else if (key.isConnectable()) { + // a connection was established with a remote server. + + } else if (key.isReadable()) { + // a channel is ready for reading + + } else if (key.isWritable()) { + // a channel is ready for writing + } + + keyIterator.remove(); + } +} +``` \ No newline at end of file From 75669b9d813bd147f5582a52b6d1146a76bab527 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:09:43 +0800 Subject: [PATCH 371/524] =?UTF-8?q?Delete=2006.Java=20NIO=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=99=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...IO\351\200\211\346\213\251\345\231\250.md" | 235 ------------------ 1 file changed, 235 deletions(-) delete mode 100644 "Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" diff --git "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" "b/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" deleted file mode 100644 index 5af294c..0000000 --- "a/Java-NIO/06.Java NIO\351\200\211\346\213\251\345\231\250.md" +++ /dev/null @@ -1,235 +0,0 @@ -#06.Java NIO选择器 - -选择器(Selector)是Java NIO中的一个组件,它用于检测一个或多个通道,并确定哪些通道可以进行读、写。这就是为什么Java NIO中可以使用单个线程对多个通道或网络连接进行管理。 - - -##为何要使用选择器(Why Use a Selector?) - -使用选择器的优势在于:**使用单个线程就可以对多个管道进行操作,从而可以减少处理通道的线程数量**。实际上,你可以仅仅使用一个线程来处理所有的通道。在操作系统中,线程的切换是非常昂贵的,并且,每个线程需要消耗一定的系统资源(例如内存)。因此,线程使用越少越好。 - -不过,随着操作系统软硬件的更新迭代,多线程的开销越来越小,性能也越来越优异。而事实上,如果计算机拥有多个CPU内核,这时候如果不采用多线程,反而是对CPU资源的浪费。然而,这已不属于本教程讨论的范畴。 - -下面的图片描绘了如何使用一个选择器来处理3个通道: - -![Java NIO: A Thread uses a Selector to handle 3 Channel's](http://tutorials.jenkov.com/images/java-nio/overview-selectors.png) - -##创建选择器(Creating a Selector) - -可以通过`Selector.open()`方法来创建选择器: - -```Java -Selector selector = Selector.open(); -``` - -#Registering Channels with the Selector - -为了让选择器能够处理通道,必须向选择器注册需要处理的通道,调用`SelectableChannel.register()`方法来完成注册: - -``` -channel.configureBlocking(false); - -SelectionKey key = channel.register(selector, SelectionKey.OP_READ); -``` - -注册的通道必须先设置为**非阻塞模式(non-blocking mode)**。由于**FileChannel**不能设置为非阻塞模式,所以FileChannel不能进行注册,而**SocketChanne**l则可以。 - -注意`SelectableChannel.register()`方法的第二个参数。这个参数代表着**选择器需要监听通道的事件类型**。总共有四种不同的事件类型: - -通道**触发一个事件**,我们称之为**事件就绪**。所以,如果通道跟远程服务器建立了连接,称之为**连接就绪**;服务器socket接受客户端连接,称为**接收就绪**;通道中有数据可读,称为**读就绪**,可向通道中写数据,称为**写就绪**。 - -以上四个事件分别由`SelectionKey`类中的四个常量来表示: - -```Java -SelectionKey.OP_CONNECT -SelectionKey.OP_ACCEPT -SelectionKey.OP_READ -SelectionKey.OP_WRITE -``` - -如果需要监听多个事件,可以使用OR操作符: - -```Java -int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE; -``` -由于SelectionKey中是四个常量OP\_READ、OP\_WRITE、OP\_CONNECT、OP\_ACCEPTF分别用二进制0001、0010、0100、1000表示,所以可以通过interestSet中的二进制判断监听的事件类型。 - -##SelectionKey's - -上面的例子中,当调用`SelectableChannel.register()`向选择器注册通道后,该返回会返回一个`SeletionKey`对象。该`SelectionKey`对象包含以下属性: - -``` -The interest set(监听的事件集合) -The ready set(就绪的事件集合) -The Channel(通道) -The Selector(选择器) -An attached object (optional) -``` - -###Interest Set(监听的事件集合) - -InterestSet表示的是监听的时间集合,可以通过`SelctionKey.interestOPs()`方法获取监听的时间集合,它是一个int类型数据,由于SelectionKey中是四个常量OP\_READ、OP\_WRITE、OP\_CONNECT、OP\_ACCEPTF分别用二进制0001、0010、0100、1000表示,所以,我们可以通过**按位与**操作判断监听的事件类型: - -```Java -int interestSet = selectionKey.interestOps(); - -boolean isInterestedInAccept = interestSet & SelectionKey.OP_ACCEPT; -boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT; -boolean isInterestedInRead = interestSet & SelectionKey.OP_READ; -boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE; -``` - -###Ready Set(就绪集合) - -可以通过`SelectionKey.readyOps()`方法获取就绪集合。同样地,通过按位与操作判断就绪的事件类型: - -```Java -int readySet = selectionKey.readyOps(); - -selectionKey.isAcceptable(); -selectionKey.isConnectable(); -selectionKey.isReadable(); -selectionKey.isWritable(); -``` - - -###Channel + Selector(通道和选择器) - -Accessing the channel + selector from the SelectionKey is trivial. Here is how it's done: - -```Java -Channel channel = selectionKey.channel(); - -Selector selector = selectionKey.selector(); -``` - -###附加对象(Attaching Objects) - -You can attach an object to a SelectionKey this is a handy way of recognizing a given channel, or attaching further information to the channel. For instance, you may attach the Buffer you are using with the channel, or an object containing more aggregate data. Here is how you attach objects: - -```Java -selectionKey.attach(theObject); - -Object attachedObj = selectionKey.attachment(); -``` - -You can also attach an object already while registering the Channel with the Selector, in the register() method. Here is how that looks: - -```Java -SelectionKey key = channel.register(selector, SelectionKey.OP_READ, theObject); -``` - -##Selecting Channels via a Selector - -当向选择器注册一个或多个通道后,可以调用`Selector.slect(...)`方法,这个返回会当前已经就绪的通道(说明该通道有选择器监听的事件就绪)的个数。换言之,如果选择器监听了一个通道的读事件,当该通道有数据可读时,`Selector.select(...)`操作就会返回 1。 - -有多个重载的`select()`方法: - -> int select() -> int select(long timeout) -> int selectNow() - -`select()`方法会阻塞直到有通道事件就绪。 - -`select(long timeout)`方法会阻塞直到有通道事件就绪或超时。 - -`selectNow()`方法不管有没有通道事件就绪,都会立即返回。 - -`select()`返回值为int类型,代表从上次调用`select()`方法到这次的就绪通道数量。当你调用select返回1时,则代表上次调用select方法到这次调用之间有一个通道变成了就绪状态,然后,再次调用select方法,如果返回值为1,则说明又有一个通道变成了就绪状态。如果你没对第一个就绪通道进行处理,则此时共有两个就绪通道,虽然最后一次select的返回值为1。 - -###selectedKeys() - -当你调用select()方法返回值不为0时,则说明有一个或多个通道已经就绪。你可以通过调用`selector.selectedKeys()`获取就绪的通道: - -```Java -Set selectedKeys = selector.selectedKeys(); -``` - -When you register a channel with a Selector the Channel.register() method returns a SelectionKey object. This key represents that channels registration with that selector. It is these keys you can access via the selectedKeySet() method. From the SelectionKey. - -You can iterate this selected key set to access the ready channels. Here is how that looks: - -```Java -Set selectedKeys = selector.selectedKeys(); - -Iterator keyIterator = selectedKeys.iterator(); - -while(keyIterator.hasNext()) { - - SelectionKey key = keyIterator.next(); - - if(key.isAcceptable()) { - // a connection was accepted by a ServerSocketChannel. - - } else if (key.isConnectable()) { - // a connection was established with a remote server. - - } else if (key.isReadable()) { - // a channel is ready for reading - - } else if (key.isWritable()) { - // a channel is ready for writing - } - - keyIterator.remove(); -} -``` - -This loop iterates the keys in the selected key set. For each key it tests the key to determine what the channel referenced by the key is ready for. - -Notice the `keyIterator.remove()` call at the end of each iteration. The Selector does not remove the SelectionKey instances from the selected key set itself. You have to do this, when you are done processing the channel. The next time the channel becomes "ready" the Selector will add it to the selected key set again. - -The channel returned by the SelectionKey.channel() method should be cast to the channel you need to work with, e.g a ServerSocketChannel or SocketChannel etc. - -###wakeUp() - -A thread that has called the select() method which is blocked, can be made to leave the select() method, even if no channels are yet ready. This is done by having a different thread call the Selector.wakeup() method on the Selector which the first thread has called select() on. The thread waiting inside select() will then return immediately. - -If a different thread calls wakeup() and no thread is currently blocked inside select(), the next thread that calls select() will "wake up" immediately. - -###close() - -When you are finished with the Selector you call its close() method. This closes the Selector and invalidates all SelectionKey instances registered with this Selector. The channels themselves are not closed. - -##Full Selector Example - -Here is a full example which opens a Selector, registers a channel with it (the channel instantiation is left out), and keeps monitoring the Selector for "readiness" of the four events (accept, connect, read, write). - -Selector selector = Selector.open(); - -channel.configureBlocking(false); - -SelectionKey key = channel.register(selector, SelectionKey.OP_READ); - -```Java -while(true) { - - int readyChannels = selector.select(); - - if(readyChannels == 0) continue; - - - Set selectedKeys = selector.selectedKeys(); - - Iterator keyIterator = selectedKeys.iterator(); - - while(keyIterator.hasNext()) { - - SelectionKey key = keyIterator.next(); - - if(key.isAcceptable()) { - // a connection was accepted by a ServerSocketChannel. - - } else if (key.isConnectable()) { - // a connection was established with a remote server. - - } else if (key.isReadable()) { - // a channel is ready for reading - - } else if (key.isWritable()) { - // a channel is ready for writing - } - - keyIterator.remove(); - } -} -``` \ No newline at end of file From 975afaac84bd8247fe62dfa8ffee8434c436eb84 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:11:26 +0800 Subject: [PATCH 372/524] Published with https://stackedit.io/ --- ...00\232\351\201\223\347\232\204\344\274\240\350\276\223.md" | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 "Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" diff --git "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" new file mode 100644 index 0000000..84ce60a --- /dev/null +++ "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" @@ -0,0 +1,4 @@ + +##06. Java NIO通道到通道的传输 + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From eb8496f665701300549eb2c4920cbbfd275ee7f9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:21:06 +0800 Subject: [PATCH 373/524] Published with https://stackedit.io/ --- ...23\347\232\204\344\274\240\350\276\223.md" | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" index 84ce60a..1038f11 100644 --- "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" +++ "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" @@ -1,4 +1,40 @@ ##06. Java NIO通道到通道的传输 -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file +In Java NIO you can transfer data directly from one channel to another, if one of the channels is a FileChannel. The FileChannel class has a transferTo() and a transferFrom() method which does this for you. + +##transferFrom() + +The FileChannel.transferFrom() method transfers data from a source channel into the FileChannel. Here is a simple example: + +RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw"); +FileChannel fromChannel = fromFile.getChannel(); + +RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw"); +FileChannel toChannel = toFile.getChannel(); + +long position = 0; +long count = fromChannel.size(); + +toChannel.transferFrom(fromChannel, position, count); +The parameters position and count, tell where in the destination file to start writing (position), and how many bytes to transfer maximally (count). If the source channel has fewer than count bytes, less is transfered. + +Additionally, some SocketChannel implementations may transfer only the data the SocketChannel has ready in its internal buffer here and now - even if the SocketChannel may later have more data available. Thus, it may not transfer the entire data requested (count) from the SocketChannel into FileChannel. + +##transferTo() + +The transferTo() method transfer from a FileChannel into some other channel. Here is a simple example: + +RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw"); +FileChannel fromChannel = fromFile.getChannel(); + +RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw"); +FileChannel toChannel = toFile.getChannel(); + +long position = 0; +long count = fromChannel.size(); + +fromChannel.transferTo(position, count, toChannel); +Notice how similar the example is to the previous. The only real difference is the which FileChannel object the method is called on. The rest is the same. + +The issue with SocketChannel is also present with the transferTo() method. The SocketChannel implementation may only transfer bytes from the FileChannel until the send buffer is full, and then stop. \ No newline at end of file From 04ebf389a8252da543cf0d7d566213da39aba523 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:26:11 +0800 Subject: [PATCH 374/524] Published with https://stackedit.io/ --- ...\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" index 1038f11..dee6f38 100644 --- "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" +++ "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" @@ -1,7 +1,7 @@ ##06. Java NIO通道到通道的传输 -In Java NIO you can transfer data directly from one channel to another, if one of the channels is a FileChannel. The FileChannel class has a transferTo() and a transferFrom() method which does this for you. +在Java NIO中,如果其中一个通道是`FileChannel`,那么你可以在两个通道间直接传输数据。`FileChannel`类提供了`transferTo()`和`transferFrom()` 两个方法来在通道中进行数据传输。 ##transferFrom() From 7506db4ce2326aa7d448344e2aad4c3bd2b60727 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 10:40:04 +0800 Subject: [PATCH 375/524] Published with https://stackedit.io/ --- ...51\201\223\347\232\204\344\274\240\350\276\223.md" | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" index dee6f38..c499cc0 100644 --- "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" +++ "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" @@ -5,8 +5,9 @@ ##transferFrom() -The FileChannel.transferFrom() method transfers data from a source channel into the FileChannel. Here is a simple example: +`FileChannel.transferFrom()`方法用来将其他通道的数据传输给`FileChannel`。看下这个例子: +```Java RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw"); FileChannel fromChannel = fromFile.getChannel(); @@ -17,9 +18,13 @@ long position = 0; long count = fromChannel.size(); toChannel.transferFrom(fromChannel, position, count); -The parameters position and count, tell where in the destination file to start writing (position), and how many bytes to transfer maximally (count). If the source channel has fewer than count bytes, less is transfered. +``` -Additionally, some SocketChannel implementations may transfer only the data the SocketChannel has ready in its internal buffer here and now - even if the SocketChannel may later have more data available. Thus, it may not transfer the entire data requested (count) from the SocketChannel into FileChannel. +*position* 参数和*count*参数指明目标文件从那个地方开始读取与读取的最大字节数。 + +另外,有一些*SocketChannel*实现也许只是传输当前部分可用数据-即使在传输过程中可能会有更多可用数据,因此`SocketChannel`有可能不会将整个数据都传输给`FileChannel`。 + +(Additionally, some SocketChannel implementations may transfer only the data the SocketChannel has ready in its internal buffer here and now - even if the SocketChannel may later have more data available. Thus, it may not transfer the entire data requested (count) from the SocketChannel into FileChannel.) ##transferTo() From 083d3de61eeeb80c606d8e342d6fb5c789b2cc6a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:04:09 +0800 Subject: [PATCH 376/524] Published with https://stackedit.io/ --- ...232\351\201\223\347\232\204\344\274\240\350\276\223.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" index c499cc0..f3b96e4 100644 --- "a/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" +++ "b/Java-NIO/06. Java NIO\351\200\232\351\201\223\345\210\260\351\200\232\351\201\223\347\232\204\344\274\240\350\276\223.md" @@ -28,8 +28,9 @@ toChannel.transferFrom(fromChannel, position, count); ##transferTo() -The transferTo() method transfer from a FileChannel into some other channel. Here is a simple example: +`transferTo()`方法将*FileChannel*的数据传输给其他通道。看下这个例子: +```Java RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw"); FileChannel fromChannel = fromFile.getChannel(); @@ -40,6 +41,8 @@ long position = 0; long count = fromChannel.size(); fromChannel.transferTo(position, count, toChannel); -Notice how similar the example is to the previous. The only real difference is the which FileChannel object the method is called on. The rest is the same. +``` + +这个例子跟之前的有点相似,只是*FileChannel*对象调用的方法有所不同,其他都是一样的。 The issue with SocketChannel is also present with the transferTo() method. The SocketChannel implementation may only transfer bytes from the FileChannel until the send buffer is full, and then stop. \ No newline at end of file From a28acef4c3ce3d23aa8d8e13e386b17c70d5ba20 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:06:31 +0800 Subject: [PATCH 377/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 82 +++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Java-NIO/08.Java NIO FileChannel.md diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md new file mode 100644 index 0000000..76555ea --- /dev/null +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -0,0 +1,82 @@ +#08.Java NIO FileChannel + +A Java NIO FileChannel is a channel that is connected to a file. Using a file channel you can read data from a file, and write data to a file. The Java NIO FileChannel class is NIO's an alternative to reading files with the standard Java IO API. + +A FileChannel cannot be set into non-blocking mode. It always runs in blocking mode. + +Opening a FileChannel + +Before you can use a FileChannel you must open it. You cannot open a FileChannel directly. You need to obtain a FileChannel via an InputStream, OutputStream, or a RandomAccessFile. Here is how you open a FileChannel via a RandomAccessFile: + +RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); +FileChannel inChannel = aFile.getChannel(); + +Reading Data from a FileChannel + +To read data from a FileChannel you call one of the read() methods. Here is an example: + +ByteBuffer buf = ByteBuffer.allocate(48); + +int bytesRead = inChannel.read(buf); +First a Buffer is allocated. The data read from the FileChannel is read into the Buffer. + +Second the FileChannel.read() method is called. This method reads data from the FileChannel into the Buffer. The int returned by the read() method tells how many bytes were witten into the Buffer. If -1 is returned, the end-of-file is reached. + +Writing Data to a FileChannel + +Writing data to a FileChannel is done using the FileChannel.write() method, which takes a Buffer as parameter. Here is an example: + +String newData = "New String to write to file..." + System.currentTimeMillis(); + +ByteBuffer buf = ByteBuffer.allocate(48); +buf.clear(); +buf.put(newData.getBytes()); + +buf.flip(); + +while(buf.hasRemaining()) { + channel.write(buf); +} +Notice how the FileChannel.write() method is called inside a while-loop. There is no guarantee of how many bytes the write() method writes to the FileChannel. Therefore we repeat the write() call until the Buffer has no further bytes to write. + +Closing a FileChannel + +When you are done using a FileChannel you must close it. Here is how that is done: + +channel.close(); +FileChannel Position + +When reading or writing to a FileChannel you do so at a specific position. You can obtain the current position of the FileChannel object by calling the position() method. + +You can also set the position of the FileChannel by calling the position(long pos) method. + +Here are two examples: + +long pos channel.position(); + +channel.position(pos +123); +If you set the position after the end of the file, and try to read from the channel, you will get -1 - the end-of-file marker. + +If you set the position after the end of the file, and write to the channel, the file will be expanded to fit the position and written data. This may result in a "file hole", where the physical file on the disk has gaps in the written data. + +FileChannel Size + +The size() method of the FileChannel object returns the file size of the file the channel is connected to. Here is a simple example: + +long fileSize = channel.size(); +FileChannel Truncate + +You can truncate a file by calling the FileChannel.truncate() method. When you truncate a file, you cut it off at a given length. Here is an example: + +channel.truncate(1024); +This example truncates the file at 1024 bytes in length. + +FileChannel Force + +The FileChannel.force() method flushes all unwritten data from the channel to the disk. An operating system may cache data in memory for performance reasons, so you are not guaranteed that data written to the channel is actually written to disk, until you call the force() method. + +The force() method takes a boolean as parameter, telling whether the file meta data (permission etc.) should be flushed too. + +Here is an example which flushes both data and meta data: + +channel.force(true); \ No newline at end of file From e8430b326630b7d1cf551e5862624c47e2fd0d5f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:09:21 +0800 Subject: [PATCH 378/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 37 ++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index 76555ea..618d8bf 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -4,28 +4,34 @@ A Java NIO FileChannel is a channel that is connected to a file. Using a file ch A FileChannel cannot be set into non-blocking mode. It always runs in blocking mode. -Opening a FileChannel +##Opening a FileChannel Before you can use a FileChannel you must open it. You cannot open a FileChannel directly. You need to obtain a FileChannel via an InputStream, OutputStream, or a RandomAccessFile. Here is how you open a FileChannel via a RandomAccessFile: +```Java RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); +``` -Reading Data from a FileChannel +##Reading Data from a FileChannel To read data from a FileChannel you call one of the read() methods. Here is an example: +```Java ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf); +``` + First a Buffer is allocated. The data read from the FileChannel is read into the Buffer. Second the FileChannel.read() method is called. This method reads data from the FileChannel into the Buffer. The int returned by the read() method tells how many bytes were witten into the Buffer. If -1 is returned, the end-of-file is reached. -Writing Data to a FileChannel +##Writing Data to a FileChannel Writing data to a FileChannel is done using the FileChannel.write() method, which takes a Buffer as parameter. Here is an example: +```Java String newData = "New String to write to file..." + System.currentTimeMillis(); ByteBuffer buf = ByteBuffer.allocate(48); @@ -37,14 +43,19 @@ buf.flip(); while(buf.hasRemaining()) { channel.write(buf); } +``` + Notice how the FileChannel.write() method is called inside a while-loop. There is no guarantee of how many bytes the write() method writes to the FileChannel. Therefore we repeat the write() call until the Buffer has no further bytes to write. -Closing a FileChannel +##Closing a FileChannel When you are done using a FileChannel you must close it. Here is how that is done: +```Java channel.close(); -FileChannel Position +``` + +##FileChannel Position When reading or writing to a FileChannel you do so at a specific position. You can obtain the current position of the FileChannel object by calling the position() method. @@ -52,26 +63,34 @@ You can also set the position of the FileChannel by calling the position(long po Here are two examples: +```Java long pos channel.position(); channel.position(pos +123); +``` + If you set the position after the end of the file, and try to read from the channel, you will get -1 - the end-of-file marker. If you set the position after the end of the file, and write to the channel, the file will be expanded to fit the position and written data. This may result in a "file hole", where the physical file on the disk has gaps in the written data. -FileChannel Size +##FileChannel Size The size() method of the FileChannel object returns the file size of the file the channel is connected to. Here is a simple example: +```Java long fileSize = channel.size(); FileChannel Truncate +``` You can truncate a file by calling the FileChannel.truncate() method. When you truncate a file, you cut it off at a given length. Here is an example: +```Java channel.truncate(1024); +``` + This example truncates the file at 1024 bytes in length. -FileChannel Force +##FileChannel Force The FileChannel.force() method flushes all unwritten data from the channel to the disk. An operating system may cache data in memory for performance reasons, so you are not guaranteed that data written to the channel is actually written to disk, until you call the force() method. @@ -79,4 +98,6 @@ The force() method takes a boolean as parameter, telling whether the file meta d Here is an example which flushes both data and meta data: -channel.force(true); \ No newline at end of file +```Java +channel.force(true); +``` \ No newline at end of file From b83cd78f5da549d648e60b4e9027f4cfde950979 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:16:21 +0800 Subject: [PATCH 379/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index 618d8bf..d129e5f 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -1,6 +1,8 @@ #08.Java NIO FileChannel -A Java NIO FileChannel is a channel that is connected to a file. Using a file channel you can read data from a file, and write data to a file. The Java NIO FileChannel class is NIO's an alternative to reading files with the standard Java IO API. +*FileChannel*是一个用于连接文件的通道类。使用*FileChannel*你可以读取文件的数据或往文件里写入数据。使用*FileChannel*可以代替标准的Java IO API中对文件的操作。 + +*FileChannel*不能设置为非阻塞模式,它总是以阻塞模式运行。 A FileChannel cannot be set into non-blocking mode. It always runs in blocking mode. From e7572d2057cc222a3cad56dcb1f18e62dc0f3802 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:18:55 +0800 Subject: [PATCH 380/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index d129e5f..ab23a02 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -6,7 +6,7 @@ A FileChannel cannot be set into non-blocking mode. It always runs in blocking mode. -##Opening a FileChannel +##打开FileChannel(Opening a FileChannel) Before you can use a FileChannel you must open it. You cannot open a FileChannel directly. You need to obtain a FileChannel via an InputStream, OutputStream, or a RandomAccessFile. Here is how you open a FileChannel via a RandomAccessFile: @@ -15,7 +15,7 @@ RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); ``` -##Reading Data from a FileChannel +##从FileChannel中读取数据(Reading Data from a FileChannel) To read data from a FileChannel you call one of the read() methods. Here is an example: @@ -29,7 +29,7 @@ First a Buffer is allocated. The data read from the FileChannel is read into the Second the FileChannel.read() method is called. This method reads data from the FileChannel into the Buffer. The int returned by the read() method tells how many bytes were witten into the Buffer. If -1 is returned, the end-of-file is reached. -##Writing Data to a FileChannel +##往FileChannel中写入数据(Writing Data to a FileChannel) Writing data to a FileChannel is done using the FileChannel.write() method, which takes a Buffer as parameter. Here is an example: @@ -49,7 +49,7 @@ while(buf.hasRemaining()) { Notice how the FileChannel.write() method is called inside a while-loop. There is no guarantee of how many bytes the write() method writes to the FileChannel. Therefore we repeat the write() call until the Buffer has no further bytes to write. -##Closing a FileChannel +##关闭FileChannel(Closing a FileChannel) When you are done using a FileChannel you must close it. Here is how that is done: From 61be00ea48cd1d22d78f42b141248fc0af217d1f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:22:35 +0800 Subject: [PATCH 381/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index ab23a02..b4200ae 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -4,10 +4,10 @@ *FileChannel*不能设置为非阻塞模式,它总是以阻塞模式运行。 -A FileChannel cannot be set into non-blocking mode. It always runs in blocking mode. - ##打开FileChannel(Opening a FileChannel) +当需要使用*FileChannel*时,你需要首先打开一个*FileChannel* + Before you can use a FileChannel you must open it. You cannot open a FileChannel directly. You need to obtain a FileChannel via an InputStream, OutputStream, or a RandomAccessFile. Here is how you open a FileChannel via a RandomAccessFile: ```Java From 0e24b44480f1224553c81313948a4da5402b976f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:29:38 +0800 Subject: [PATCH 382/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index b4200ae..d35a7f6 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -6,9 +6,7 @@ ##打开FileChannel(Opening a FileChannel) -当需要使用*FileChannel*时,你需要首先打开一个*FileChannel* - -Before you can use a FileChannel you must open it. You cannot open a FileChannel directly. You need to obtain a FileChannel via an InputStream, OutputStream, or a RandomAccessFile. Here is how you open a FileChannel via a RandomAccessFile: +当需要使用*FileChannel*时,你需要首先打开一个*FileChannel*,但你不能直接打开。你必须要通过*InputStream*,*OutputStream*或*RandomAccessFile*来获得一个*FileChannel*实例。如下面这个例子: ```Java RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); @@ -17,7 +15,7 @@ FileChannel inChannel = aFile.getChannel(); ##从FileChannel中读取数据(Reading Data from a FileChannel) -To read data from a FileChannel you call one of the read() methods. Here is an example: +从*FileChannel*中读取数据,可以调用多个重载的`read()`方法。 ```Java ByteBuffer buf = ByteBuffer.allocate(48); @@ -25,12 +23,14 @@ ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf); ``` -First a Buffer is allocated. The data read from the FileChannel is read into the Buffer. +当**缓冲区(Buffer)**分配之后,数据从*FileChannel*中读取到缓冲区。 -Second the FileChannel.read() method is called. This method reads data from the FileChannel into the Buffer. The int returned by the read() method tells how many bytes were witten into the Buffer. If -1 is returned, the end-of-file is reached. +当`FileChannel.read()`被调用后,这个方法会从*FileChannel*中读取数据到缓冲区。`read()`方法会返回一个int值,这个值代表了写入缓冲区的字节数。如果返回值是-1,则没有数据被读取。 ##往FileChannel中写入数据(Writing Data to a FileChannel) + + Writing data to a FileChannel is done using the FileChannel.write() method, which takes a Buffer as parameter. Here is an example: ```Java From ee30e317509d4ea0e7aa30b84773d7296bba44b6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:31:23 +0800 Subject: [PATCH 383/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index d35a7f6..ccb09fa 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -29,9 +29,7 @@ int bytesRead = inChannel.read(buf); ##往FileChannel中写入数据(Writing Data to a FileChannel) - - -Writing data to a FileChannel is done using the FileChannel.write() method, which takes a Buffer as parameter. Here is an example: +往*FileChannel*中写数据用的是`FileChannel.write()`方法,这个方法也会带有个Buffer类型参数。 ```Java String newData = "New String to write to file..." + System.currentTimeMillis(); From 2c8570ac7e9184251aae574c7a6b6fe7c2fc7942 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:34:22 +0800 Subject: [PATCH 384/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index ccb09fa..b3c02f6 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -45,7 +45,7 @@ while(buf.hasRemaining()) { } ``` -Notice how the FileChannel.write() method is called inside a while-loop. There is no guarantee of how many bytes the write() method writes to the FileChannel. Therefore we repeat the write() call until the Buffer has no further bytes to write. + 注意这里的`FileChannel.write()`方法是在while循环里面进行的。我们并不知道有多少数据要写入到*FileChannel*中,因此我们需要重复地调用`write()`方法直到缓冲区中没有数据可写。 ##关闭FileChannel(Closing a FileChannel) From 458dcea91bca9fe0f410cba7cd1f42145bdb9b5a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:51:16 +0800 Subject: [PATCH 385/524] Published with https://stackedit.io/ --- Java-NIO/08.Java NIO FileChannel.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/Java-NIO/08.Java NIO FileChannel.md b/Java-NIO/08.Java NIO FileChannel.md index b3c02f6..19c14a8 100644 --- a/Java-NIO/08.Java NIO FileChannel.md +++ b/Java-NIO/08.Java NIO FileChannel.md @@ -49,7 +49,8 @@ while(buf.hasRemaining()) { ##关闭FileChannel(Closing a FileChannel) -When you are done using a FileChannel you must close it. Here is how that is done: +当使用完FileChannel后,必须要关闭它: + ```Java channel.close(); @@ -57,11 +58,9 @@ channel.close(); ##FileChannel Position -When reading or writing to a FileChannel you do so at a specific position. You can obtain the current position of the FileChannel object by calling the position() method. - -You can also set the position of the FileChannel by calling the position(long pos) method. +当从*FileChannel*读取数据往其中写人数据时,我们需要要指定特定的位置。你可以通过调用`position()`方法来获得*FileChannel*当前的位置。 -Here are two examples: +你也可以通过`position(long pos)`方法来设置*FileChannel*的位置。 ```Java long pos channel.position(); @@ -69,34 +68,33 @@ long pos channel.position(); channel.position(pos +123); ``` -If you set the position after the end of the file, and try to read from the channel, you will get -1 - the end-of-file marker. +如果你将*position*设置到文件的末尾之后,当你再对*FileChannel*进行读取时,将会返回-1,表明读取到了文件末尾。 + +如果你将*position*设置到文件的末尾之后,让你往*FileChannel*写入数据时,文件就会自动拓展到`position`所指定的位置并写入数据。这会导致**文件空洞(File Hole)**。 -If you set the position after the end of the file, and write to the channel, the file will be expanded to fit the position and written data. This may result in a "file hole", where the physical file on the disk has gaps in the written data. ##FileChannel Size -The size() method of the FileChannel object returns the file size of the file the channel is connected to. Here is a simple example: +`FileChannel.size()`方法会返回通道所连接的文件的大小。 ```Java long fileSize = channel.size(); -FileChannel Truncate ``` -You can truncate a file by calling the FileChannel.truncate() method. When you truncate a file, you cut it off at a given length. Here is an example: +##FileChannel Truncate + +你可以通过`FileChannel.truncate()`方法对通道所关联的文件进行截取: ```Java channel.truncate(1024); ``` -This example truncates the file at 1024 bytes in length. ##FileChannel Force -The FileChannel.force() method flushes all unwritten data from the channel to the disk. An operating system may cache data in memory for performance reasons, so you are not guaranteed that data written to the channel is actually written to disk, until you call the force() method. - -The force() method takes a boolean as parameter, telling whether the file meta data (permission etc.) should be flushed too. +`FileChannel.force()`方法会将所有通道中的数据刷新到磁盘中。操作系统会处于性能考虑将数据缓存到内存中,所以你不能保证写入到通道中的数据会立刻同步到磁盘,因此你可以通过`force()`方法将通道中的数据刷新到物理磁盘。 -Here is an example which flushes both data and meta data: +`FileChannel.forece()`方法带有一个布尔类型的参数,这个参数用于指定文件的**元数据(meta data)**是否也需要刷新到物理磁盘。 ```Java channel.force(true); From 34fa95c833bc4485f669321701feca0d6a1b8178 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:54:30 +0800 Subject: [PATCH 386/524] Published with https://stackedit.io/ --- Java-NIO/09.Java NIO SocketChannel.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Java-NIO/09.Java NIO SocketChannel.md diff --git a/Java-NIO/09.Java NIO SocketChannel.md b/Java-NIO/09.Java NIO SocketChannel.md new file mode 100644 index 0000000..8197c33 --- /dev/null +++ b/Java-NIO/09.Java NIO SocketChannel.md @@ -0,0 +1,3 @@ +#09.Java NIO SocketChannel + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From 29b1236ee74252ff514dd4c474dc99eb0b833bce Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:55:51 +0800 Subject: [PATCH 387/524] Published with https://stackedit.io/ --- Java-NIO/09.Java NIO SocketChannel.md | 86 ++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/Java-NIO/09.Java NIO SocketChannel.md b/Java-NIO/09.Java NIO SocketChannel.md index 8197c33..9b6c223 100644 --- a/Java-NIO/09.Java NIO SocketChannel.md +++ b/Java-NIO/09.Java NIO SocketChannel.md @@ -1,3 +1,87 @@ #09.Java NIO SocketChannel -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file +A Java NIO SocketChannel is a channel that is connected to a TCP network socket. It is Java NIO's equivalent of Java Networking's Sockets. There are two ways a SocketChannel can be created: + +You open a SocketChannel and connect to a server somewhere on the internet. +A SocketChannel can be created when an incoming connection arrives at a ServerSocketChannel. + + +##Opening a SocketChannel + +Here is how you open a SocketChannel: + +```Java +SocketChannel socketChannel = SocketChannel.open(); +socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80)); +``` + +##Closing a SocketChannel + +You close a SocketChannel after use by calling the SocketChannel.close() method. Here is how that is done: + +```Java +socketChannel.close(); +``` + +##Reading from a SocketChannel + +To read data from a SocketChannel you call one of the read() methods. Here is an example: + +```Java +ByteBuffer buf = ByteBuffer.allocate(48); + +int bytesRead = socketChannel.read(buf); +``` + +First a Buffer is allocated. The data read from the SocketChannel is read into the Buffer. + +Second the SocketChannel.read() method is called. This method reads data from the SocketChannel into the Buffer. The int returned by the read() method tells how many bytes were witten into the Buffer. If -1 is returned, the end-of-stream is reached (the connection is closed). + +##Writing to a SocketChannel + +Writing data to a SocketChannel is done using the SocketChannel.write() method, which takes a Buffer as parameter. Here is an example: + +```Java +String newData = "New String to write to file..." + System.currentTimeMillis(); + +ByteBuffer buf = ByteBuffer.allocate(48); +buf.clear(); +buf.put(newData.getBytes()); + +buf.flip(); + +while(buf.hasRemaining()) { + channel.write(buf); +} +``` + +Notice how the SocketChannel.write() method is called inside a while-loop. There is no guarantee of how many bytes the write() method writes to the SocketChannel. Therefore we repeat the write() call until the Buffer has no further bytes to write. + +##Non-blocking Mode + +You can set a SocketChannel into non-blocking mode. When you do so, you can call connect(), read() and write() in asynchronous mode. + +##connect() + +If the SocketChannel is in non-blocking mode, and you call connect(), the method may return before a connection is established. To determine whether the connection is established, you can call the finishConnect() method, like this: + +```Java +socketChannel.configureBlocking(false); +socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80)); + +while(! socketChannel.finishConnect() ){ + //wait, or do something else... +} +``` + +##write() + +In non-blocking mode the write() method may return without having written anything. Therefore you need to call the write() method in a loop. But, since this is already being done in the previous write examples, no need to do anything differently here. + +##read() + +In non-blocking mode the read() method may return without having read any data at all. Therefore you need to pay attention to the returned int, which tells how many bytes were read. + +##Non-blocking Mode with Selectors + +The non-blocking mode of SocketChannel's works much better with Selector's. By registering one or more SocketChannel's with a Selector, you can ask the Selector for channels that are ready for reading, writing etc. How to use Selector's with SocketChannel's is explained in more detail in a later text in this tutorial. \ No newline at end of file From a271c4a11ef61b7337dc39d019c55558bc751402 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 11:59:26 +0800 Subject: [PATCH 388/524] Published with https://stackedit.io/ --- Java-NIO/10.Java NIO ServerSocketChannel.md | 73 +++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Java-NIO/10.Java NIO ServerSocketChannel.md diff --git a/Java-NIO/10.Java NIO ServerSocketChannel.md b/Java-NIO/10.Java NIO ServerSocketChannel.md new file mode 100644 index 0000000..9f1cff7 --- /dev/null +++ b/Java-NIO/10.Java NIO ServerSocketChannel.md @@ -0,0 +1,73 @@ + +#10.Java NIO ServerSocketChannel + +A Java NIO ServerSocketChannel is a channel that can listen for incoming TCP connections, just like a ServerSocket in standard Java Networking. The ServerSocketChannel class is located in the java.nio.channels package. + +Here is an example: + +```Java +ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + +serverSocketChannel.socket().bind(new InetSocketAddress(9999)); + +while(true){ + SocketChannel socketChannel = + serverSocketChannel.accept(); + + //do something with socketChannel... +} +``` + +##Opening a ServerSocketChannel + +You open a ServerSocketChannel by calling the ServerSocketChannel.open() method. Here is how that looks: + +```Java +ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); +``` + + +##Closing a ServerSocketChannel + +Closing a ServerSocketChannel is done by calling the ServerSocketChannel.close() method. Here is how that looks: + +```Java +serverSocketChannel.close(); +``` + +##Listening for Incoming Connections + +Listening for incoming connections is done by calling the ServerSocketChannel.accept() method. When the accept() method returns, it returns a SocketChannel with an incoming connection. Thus, the accept() method blocks until an incoming connection arrives. + +Since you are typically not interested in listening just for a single connection, you call the accept() inside a while-loop. Here is how that looks: + +```Java +while(true){ + SocketChannel socketChannel = + serverSocketChannel.accept(); + + //do something with socketChannel... +} +``` + +Of course you would use some other stop-criteria than true inside the while-loop. + +##Non-blocking Mode + +A ServerSocketChannel can be set into non-blocking mode. In non-blocking mode the accept() method returns immediately, and may thus return null, if no incoming connection had arrived. Therefore you will have to check if the returned SocketChannel is null. Here is an example: + +```Java +ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + +serverSocketChannel.socket().bind(new InetSocketAddress(9999)); +serverSocketChannel.configureBlocking(false); + +while(true){ + SocketChannel socketChannel = + serverSocketChannel.accept(); + + if(socketChannel != null){ + //do something with socketChannel... + } +} +``` From d86a2dd1783309910338e298b937d79ff5eee338 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 12:15:06 +0800 Subject: [PATCH 389/524] Published with https://stackedit.io/ --- Java-NIO/11.Java NIO DatagramChannel.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Java-NIO/11.Java NIO DatagramChannel.md diff --git a/Java-NIO/11.Java NIO DatagramChannel.md b/Java-NIO/11.Java NIO DatagramChannel.md new file mode 100644 index 0000000..a06101c --- /dev/null +++ b/Java-NIO/11.Java NIO DatagramChannel.md @@ -0,0 +1 @@ +#11.Java NIO DatagramChannel \ No newline at end of file From ae6fd2b18506a4acbcbdc0c618d0356697b80c02 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 12:15:20 +0800 Subject: [PATCH 390/524] Published with https://stackedit.io/ --- Java-NIO/11.Java NIO DatagramChannel.md | 49 ++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/Java-NIO/11.Java NIO DatagramChannel.md b/Java-NIO/11.Java NIO DatagramChannel.md index a06101c..ef9ecdd 100644 --- a/Java-NIO/11.Java NIO DatagramChannel.md +++ b/Java-NIO/11.Java NIO DatagramChannel.md @@ -1 +1,48 @@ -#11.Java NIO DatagramChannel \ No newline at end of file +#11.Java NIO DatagramChannel + +A Java NIO DatagramChannel is a channel that can send and receive UDP packets. Since UDP is a connection-less network protocol, you cannot just by default read and write to a DatagramChannel like you do from other channels. Instead you send and receive packets of data. + +Opening a DatagramChannel + +Here is how you open a DatagramChannel: + +DatagramChannel channel = DatagramChannel.open(); +channel.socket().bind(new InetSocketAddress(9999)); +This example opens a DatagramChannel which can receive packets on UDP port 9999. + +Receiving Data + +You receive data from a DatagramChannel by calling its receive() method, like this: + +ByteBuffer buf = ByteBuffer.allocate(48); +buf.clear(); + +channel.receive(buf); +The receive() method will copy the content of a received packet of data into the given Buffer. If the received packet contains more data than the Buffer can contain, the remaining data is discarded silently. + +Sending Data + +You can send data via a DatagramChannel by calling its send() method, like this: + +String newData = "New String to write to file..." + + System.currentTimeMillis(); + +ByteBuffer buf = ByteBuffer.allocate(48); +buf.clear(); +buf.put(newData.getBytes()); +buf.flip(); + +int bytesSent = channel.send(buf, new InetSocketAddress("jenkov.com", 80)); +This example sends the string to the "jenkov.com" server on UDP port 80. Nothing is listening on that port though, so nothing will happen. You will not be notified of whether the send packet was received or not, since UDP does not make any guarantees about delivery of data. + +Connecting to a Specific Address + +It is possible to "connect" a DatagramChannel to a specific address on the network. Since UDP is connection-less, this way of connecting to an address does not create a real connection, like with a TCP channel. Rather, it locks your DatagramChannel so you can only send and receive data packets from one specific address. + +Here is an example: + +channel.connect(new InetSocketAddress("jenkov.com", 80)); +When connected you can also use the read() and write() method, as if you were using a traditional channel. You just don't have any guarantees about delivery of the sent data. Here are a few examples: + +int bytesRead = channel.read(buf); +int bytesWritten = channel.write(buf); \ No newline at end of file From 24bd3694916e9c5b4031c06787f7c55638d1fca2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 12:16:31 +0800 Subject: [PATCH 391/524] Published with https://stackedit.io/ --- Java-NIO/12.Java NIO Pipe.md | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Java-NIO/12.Java NIO Pipe.md diff --git a/Java-NIO/12.Java NIO Pipe.md b/Java-NIO/12.Java NIO Pipe.md new file mode 100644 index 0000000..426e0b0 --- /dev/null +++ b/Java-NIO/12.Java NIO Pipe.md @@ -0,0 +1,44 @@ +#12.Java NIO Pipe + +A Java NIO Pipe is a one-way data connection between two threads. A Pipe has a source channel and a sink channel. You write data to the sink channel. This data can then be read from the source channel. + +Here is an illustration of the Pipe principle: + +Java NIO: Pipe Internals +Java NIO: Pipe Internals +Creating a Pipe + +You open a Pipe by calling the Pipe.open() method. Here is how that looks: + +Pipe pipe = Pipe.open(); +Writing to a Pipe + +To write to a Pipe you need to access the sink channel. Here is how that is done: + +Pipe.SinkChannel sinkChannel = pipe.sink(); +You write to a SinkChannel by calling it's write() method, like this: + +String newData = "New String to write to file..." + System.currentTimeMillis(); + +ByteBuffer buf = ByteBuffer.allocate(48); +buf.clear(); +buf.put(newData.getBytes()); + +buf.flip(); + +while(buf.hasRemaining()) { + sinkChannel.write(buf); +} +Reading from a Pipe + +To read from a Pipe you need to access the source channel. Here is how that is done: + +Pipe.SourceChannel sourceChannel = pipe.source(); +To read from the source channel you call its read() method like this: + +ByteBuffer buf = ByteBuffer.allocate(48); + +int bytesRead = inChannel.read(buf); +The int returned by the read() method tells how many bytes were read into the buffer. + +![enter image description here](http://tutorials.jenkov.com/images/java-nio/pipe-internals.png) \ No newline at end of file From 54128e1deeb7ab588c639cf7f70fe0ccae1e6f0b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 12:17:20 +0800 Subject: [PATCH 392/524] Published with https://stackedit.io/ --- Java-NIO/13.Java NIO vs IO.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Java-NIO/13.Java NIO vs IO.md diff --git a/Java-NIO/13.Java NIO vs IO.md b/Java-NIO/13.Java NIO vs IO.md new file mode 100644 index 0000000..1003ccf --- /dev/null +++ b/Java-NIO/13.Java NIO vs IO.md @@ -0,0 +1 @@ +#13.Java NIO vs. IO \ No newline at end of file From f262523e6e3e2b8a4f604d7042763c8b23b771db Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 12:17:51 +0800 Subject: [PATCH 393/524] Published with https://stackedit.io/ --- Java-NIO/13.Java NIO vs IO.md | 116 +++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/Java-NIO/13.Java NIO vs IO.md b/Java-NIO/13.Java NIO vs IO.md index 1003ccf..5b1b9ef 100644 --- a/Java-NIO/13.Java NIO vs IO.md +++ b/Java-NIO/13.Java NIO vs IO.md @@ -1 +1,115 @@ -#13.Java NIO vs. IO \ No newline at end of file +#13.Java NIO vs. IO + +When studying both the Java NIO and IO API's, a question quickly pops into mind: + +When should I use IO and when should I use NIO? + +In this text I will try to shed some light on the differences between Java NIO and IO, their use cases, and how they affect the design of your code. + +Main Differences Betwen Java NIO and IO + +The table below summarizes the main differences between Java NIO and IO. I will get into more detail about each difference in the sections following the table. + +IO NIO +Stream oriented Buffer oriented +Blocking IO Non blocking IO + Selectors +Stream Oriented vs. Buffer Oriented + +The first big difference between Java NIO and IO is that IO is stream oriented, where NIO is buffer oriented. So, what does that mean? + +Java IO being stream oriented means that you read one or more bytes at a time, from a stream. What you do with the read bytes is up to you. They are not cached anywhere. Furthermore, you cannot move forth and back in the data in a stream. If you need to move forth and back in the data read from a stream, you will need to cache it in a buffer first. + +Java NIO's buffer oriented approach is slightly different. Data is read into a buffer from which it is later processed. You can move forth and back in the buffer as you need to. This gives you a bit more flexibility during processing. However, you also need to check if the buffer contains all the data you need in order to fully process it. And, you need to make sure that when reading more data into the buffer, you do not overwrite data in the buffer you have not yet processed. + +Blocking vs. Non-blocking IO + +Java IO's various streams are blocking. That means, that when a thread invokes a read() or write(), that thread is blocked until there is some data to read, or the data is fully written. The thread can do nothing else in the meantime. + +Java NIO's non-blocking mode enables a thread to request reading data from a channel, and only get what is currently available, or nothing at all, if no data is currently available. Rather than remain blocked until data becomes available for reading, the thread can go on with something else. + +The same is true for non-blocking writing. A thread can request that some data be written to a channel, but not wait for it to be fully written. The thread can then go on and do something else in the mean time. + +What threads spend their idle time on when not blocked in IO calls, is usually performing IO on other channels in the meantime. That is, a single thread can now manage multiple channels of input and output. + +Selectors + +Java NIO's selectors allow a single thread to monitor multiple channels of input. You can register multiple channels with a selector, then use a single thread to "select" the channels that have input available for processing, or select the channels that are ready for writing. This selector mechanism makes it easy for a single thread to manage multiple channels. + +How NIO and IO Influences Application Design + +Whether you choose NIO or IO as your IO toolkit may impact the following aspects of your application design: + +The API calls to the NIO or IO classes. +The processing of data. +The number of thread used to process the data. +The API Calls + +Of course the API calls when using NIO look different than when using IO. This is no surprise. Rather than just read the data byte for byte from e.g. an InputStream, the data must first be read into a buffer, and then be processed from there. + +The Processing of Data + +The processing of the data is also affected when using a pure NIO design, vs. an IO design. + +In an IO design you read the data byte for byte from an InputStream or a Reader. Imagine you were processing a stream of line based textual data. For instance: + +Name: Anna +Age: 25 +Email: anna@mailserver.com +Phone: 1234567890 +This stream of text lines could be processed like this: + +InputStream input = ... ; // get the InputStream from the client socket + +BufferedReader reader = new BufferedReader(new InputStreamReader(input)); + +String nameLine = reader.readLine(); +String ageLine = reader.readLine(); +String emailLine = reader.readLine(); +String phoneLine = reader.readLine(); +Notice how the processing state is determined by how far the program has executed. In other words, once the first reader.readLine() method returns, you know for sure that a full line of text has been read. The readLine() blocks until a full line is read, that's why. You also know that this line contains the name. Similarly, when the second readLine() call returns, you know that this line contains the age etc. + +As you can see, the program progresses only when there is new data to read, and for each step you know what that data is. Once the executing thread have progressed past reading a certain piece of data in the code, the thread is not going backwards in the data (mostly not). This principle is also illustrated in this diagram: + +Java IO: Reading data from a blocking stream. +Java IO: Reading data from a blocking stream. +A NIO implementation would look different. Here is a simplified example: + +ByteBuffer buffer = ByteBuffer.allocate(48); + +int bytesRead = inChannel.read(buffer); +Notice the second line which reads bytes from the channel into the ByteBuffer. When that method call returns you don't know if all the data you need is inside the buffer. All you know is that the buffer contains some bytes. This makes processing somewhat harder. + +Imagine if, after the first read(buffer) call, that all what was read into the buffer was half a line. For instance, "Name: An". Can you process that data? Not really. You need to wait until at leas a full line of data has been into the buffer, before it makes sense to process any of the data at all. + +So how do you know if the buffer contains enough data for it to make sense to be processed? Well, you don't. The only way to find out, is to look at the data in the buffer. The result is, that you may have to inspect the data in the buffer several times before you know if all the data is inthere. This is both inefficient, and can become messy in terms of program design. For instance: + +ByteBuffer buffer = ByteBuffer.allocate(48); + +int bytesRead = inChannel.read(buffer); + +while(! bufferFull(bytesRead) ) { + bytesRead = inChannel.read(buffer); +} +The bufferFull() method has to keep track of how much data is read into the buffer, and return either true or false, depending on whether the buffer is full. In other words, if the buffer is ready for processing, it is considered full. + +The bufferFull() method scans through the buffer, but must leave the buffer in the same state as before the bufferFull() method was called. If not, the next data read into the buffer might not be read in at the correct location. This is not impossible, but it is yet another issue to watch out for. + +If the buffer is full, it can be processed. If it is not full, you might be able to partially process whatever data is there, if that makes sense in your particular case. In many cases it doesn't. + +The is-data-in-buffer-ready loop is illustrated in this diagram: + +Java NIO: Reading data from a channel until all needed data is in buffer. +Java NIO: Reading data from a channel until all needed data is in buffer. +Summary + +NIO allows you to manage multiple channels (network connections or files) using only a single (or few) threads, but the cost is that parsing the data might be somewhat more complicated than when reading data from a blocking stream. + +If you need to manage thousands of open connections simultanously, which each only send a little data, for instance a chat server, implementing the server in NIO is probably an advantage. Similarly, if you need to keep a lot of open connections to other computers, e.g. in a P2P network, using a single thread to manage all of your outbound connections might be an advantage. This one thread, multiple connections design is illustrated in this diagram: + +Java NIO: A single thread managing multiple connections. +Java NIO: A single thread managing multiple connections. +If you have fewer connections with very high bandwidth, sending a lot of data at a time, perhaps a classic IO server implementation might be the best fit. This diagram illustrates a classic IO server design: + +Java IO: A classic IO server design - one connection handled by one thread. +Java IO: A classic IO server design - one connection handled by one thread. From 3ab93a02e7ce19628906694a5c8d4cfaac05f3f3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:15:46 +0800 Subject: [PATCH 394/524] Published with https://stackedit.io/ --- ...21\345\267\245\345\205\267\347\261\273.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 "Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" diff --git "a/Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" "b/Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" new file mode 100644 index 0000000..7451b9e --- /dev/null +++ "b/Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" @@ -0,0 +1,23 @@ +#01.Java并发工具类 + +Java 5 added a new Java package to the Java platform, the java.util.concurrent package. This package contains a set of classes that makes it easier to develop concurrent (multithreaded) applications in Java. Before this package was added, you would have to program your utility classes yourself. + +In this tutorial I will take you through the new java.util.concurrent classes, one by one, so you can learn how to use them. I will use the versions in Java 6. I am not sure if there are any differences to the Java 5 versions. + +I will not explain the core issues of concurrency in Java - the theory behind it, that is. If you are interested in that, check out my Java Concurrency tutorial. + + +Work in Progress + +This tutorial is very much "work in progress", so if you spot a missing class or interface, please be patient. I will add it when I get the time to do it. + + +Table of Contents + +Here is a list of the topics covered in this java.util.concurrent trail. This list (menu) is also present at the top right of every page in the trail. + + +Feel Free to Contact Me + +If you disagree with anything I write here about the java.util.concurrent utilities, or just have comments, questions, etc, feel free to send me an email. You wouldn't be the first to do so. You can find my email address on the about page. + From 016cb60f195c480ce01f7aca40a401f43ba675fc Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:17:11 +0800 Subject: [PATCH 395/524] Published with https://stackedit.io/ --- ...\266\345\217\221\345\267\245\345\205\267\347\261\273.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" "b/Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" index 7451b9e..191a794 100644 --- "a/Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" +++ "b/Java-Concurrency-Util/01.Java\345\271\266\345\217\221\345\267\245\345\205\267\347\261\273.md" @@ -7,17 +7,17 @@ In this tutorial I will take you through the new java.util.concurrent classes, o I will not explain the core issues of concurrency in Java - the theory behind it, that is. If you are interested in that, check out my Java Concurrency tutorial. -Work in Progress +##Work in Progress This tutorial is very much "work in progress", so if you spot a missing class or interface, please be patient. I will add it when I get the time to do it. -Table of Contents +##Table of Contents Here is a list of the topics covered in this java.util.concurrent trail. This list (menu) is also present at the top right of every page in the trail. -Feel Free to Contact Me +##Feel Free to Contact Me If you disagree with anything I write here about the java.util.concurrent utilities, or just have comments, questions, etc, feel free to send me an email. You wouldn't be the first to do so. You can find my email address on the about page. From 0608f53cf36961d015adefa51180a58e4be45222 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:17:44 +0800 Subject: [PATCH 396/524] Create README.md --- Java-Concurrency-Util/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Java-Concurrency-Util/README.md diff --git a/Java-Concurrency-Util/README.md b/Java-Concurrency-Util/README.md new file mode 100644 index 0000000..d1d2694 --- /dev/null +++ b/Java-Concurrency-Util/README.md @@ -0,0 +1 @@ +翻译自:http://tutorials.jenkov.com/java-util-concurrent/index.html From 6ce50dccd3f180a1e7d8ba3001faff0293dd6661 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:24:35 +0800 Subject: [PATCH 397/524] Published with https://stackedit.io/ --- ...7\357\274\210BlockingQueue\357\274\211.md" | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 "Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" diff --git "a/Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" new file mode 100644 index 0000000..39fa489 --- /dev/null +++ "b/Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -0,0 +1,113 @@ +#02.阻塞队列(BlockingQueue) + +The Java BlockingQueue interface in the java.util.concurrent class represents a queue which is thread safe to put into, and take instances from. In this text I will show you how to use this BlockingQueue. + +This text will not discuss how to implement a BlockingQueue in Java yourself. If you are interested in that, I have a text on Blocking Queues in my more theoretical Java Concurrency Tutorial. + +##BlockingQueue Usage + +A BlockingQueue is typically used to have on thread produce objects, which another thread consumes. Here is a diagram that illustrates this principle: + +A BlockingQueue with one thread putting into it, and another thread taking from it. +A BlockingQueue with one thread putting into it, and another thread taking from it. +The producing thread will keep producing new objects and insert them into the queue, until the queue reaches some upper bound on what it can contain. It's limit, in other words. If the blocking queue reaches its upper limit, the producing thread is blocked while trying to insert the new object. It remains blocked until a consuming thread takes an object out of the queue. + +The consuming thread keeps taking objects out of the blocking queue, and processes them. If the consuming thread tries to take an object out of an empty queue, the consuming thread is blocked until a producing thread puts an object into the queue. + + +##BlockingQueue Methods + +A BlockingQueue has 4 different sets of methods for inserting, removing and examining the elements in the queue. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods: + + Throws Exception Special Value Blocks Times Out +Insert add(o) offer(o) put(o) offer(o, timeout, timeunit) +Remove remove(o) poll(o) take(o) poll(timeout, timeunit) +Examine element(o) peek(o) +The 4 different sets of behaviour means this: + +Throws Exception: +If the attempted operation is not possible immediately, an exception is thrown. +Special Value: +If the attempted operation is not possible immediately, a special value is returned (often true / false). +Blocks: +If the attempted operation is not possible immedidately, the method call blocks until it is. +Times Out: +If the attempted operation is not possible immedidately, the method call blocks until it is, but waits no longer than the given timeout. Returns a special value telling whether the operation succeeded or not (typically true / false). +It is not possible to insert null into a BlockingQueue. If you try to insert null, the BlockingQueue will throw a NullPointerException. + +It is also possible to access all the elements inside a BlockingQueue, and not just the elements at the start and end. For instance, say you have queued an object for processing, but your application decides to cancel it. You can then call e.g. remove(o) to remove a specific object in the queue. However, this is not done very efficiently, so you should not use these Collection methods unless you really have to. + +##BlockingQueue Implementations + +Since BlockingQueue is an interface, you need to use one of its implementations to use it. The java.util.concurrent package has the following implementations of the BlockingQueue interface (in Java 6): + +ArrayBlockingQueue +DelayQueue +LinkedBlockingQueue +PriorityBlockingQueue +SynchronousQueue +Click the links in the list to read more about each implementation. If a link cannot be clicked, that implementation has not yet been described. Check back again in the future, or check out the JavaDoc's for more detail. + +##Java BlockingQueue Example + +Here is a Java BlockingQueue example. The example uses the ArrayBlockingQueue implementation of the BlockingQueue interface. + +First, the BlockingQueueExample class which starts a Producer and a Consumer in separate threads. The Producer inserts strings into a shared BlockingQueue, and the Consumer takes them out. + +public class BlockingQueueExample { + + public static void main(String[] args) throws Exception { + + BlockingQueue queue = new ArrayBlockingQueue(1024); + + Producer producer = new Producer(queue); + Consumer consumer = new Consumer(queue); + + new Thread(producer).start(); + new Thread(consumer).start(); + + Thread.sleep(4000); + } +} +Here is the Producer class. Notice how it sleeps a second between each put() call. This will cause the Consumer to block, while waiting for objects in the queue. + +public class Producer implements Runnable{ + + protected BlockingQueue queue = null; + + public Producer(BlockingQueue queue) { + this.queue = queue; + } + + public void run() { + try { + queue.put("1"); + Thread.sleep(1000); + queue.put("2"); + Thread.sleep(1000); + queue.put("3"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} +Here is the Consumer class. It just takes out the objects from the queue, and prints them to System.out. + +public class Consumer implements Runnable{ + + protected BlockingQueue queue = null; + + public Consumer(BlockingQueue queue) { + this.queue = queue; + } + + public void run() { + try { + System.out.println(queue.take()); + System.out.println(queue.take()); + System.out.println(queue.take()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file From 7b994e594ca4efd439501ee6a238f618610b93ce Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:26:01 +0800 Subject: [PATCH 398/524] =?UTF-8?q?Delete=2002.=E9=98=BB=E5=A1=9E=E9=98=9F?= =?UTF-8?q?=E5=88=97=EF=BC=88BlockingQueue=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\357\274\210BlockingQueue\357\274\211.md" | 113 ------------------ 1 file changed, 113 deletions(-) delete mode 100644 "Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" diff --git "a/Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" deleted file mode 100644 index 39fa489..0000000 --- "a/Java-Concurrency-Util /02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ /dev/null @@ -1,113 +0,0 @@ -#02.阻塞队列(BlockingQueue) - -The Java BlockingQueue interface in the java.util.concurrent class represents a queue which is thread safe to put into, and take instances from. In this text I will show you how to use this BlockingQueue. - -This text will not discuss how to implement a BlockingQueue in Java yourself. If you are interested in that, I have a text on Blocking Queues in my more theoretical Java Concurrency Tutorial. - -##BlockingQueue Usage - -A BlockingQueue is typically used to have on thread produce objects, which another thread consumes. Here is a diagram that illustrates this principle: - -A BlockingQueue with one thread putting into it, and another thread taking from it. -A BlockingQueue with one thread putting into it, and another thread taking from it. -The producing thread will keep producing new objects and insert them into the queue, until the queue reaches some upper bound on what it can contain. It's limit, in other words. If the blocking queue reaches its upper limit, the producing thread is blocked while trying to insert the new object. It remains blocked until a consuming thread takes an object out of the queue. - -The consuming thread keeps taking objects out of the blocking queue, and processes them. If the consuming thread tries to take an object out of an empty queue, the consuming thread is blocked until a producing thread puts an object into the queue. - - -##BlockingQueue Methods - -A BlockingQueue has 4 different sets of methods for inserting, removing and examining the elements in the queue. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods: - - Throws Exception Special Value Blocks Times Out -Insert add(o) offer(o) put(o) offer(o, timeout, timeunit) -Remove remove(o) poll(o) take(o) poll(timeout, timeunit) -Examine element(o) peek(o) -The 4 different sets of behaviour means this: - -Throws Exception: -If the attempted operation is not possible immediately, an exception is thrown. -Special Value: -If the attempted operation is not possible immediately, a special value is returned (often true / false). -Blocks: -If the attempted operation is not possible immedidately, the method call blocks until it is. -Times Out: -If the attempted operation is not possible immedidately, the method call blocks until it is, but waits no longer than the given timeout. Returns a special value telling whether the operation succeeded or not (typically true / false). -It is not possible to insert null into a BlockingQueue. If you try to insert null, the BlockingQueue will throw a NullPointerException. - -It is also possible to access all the elements inside a BlockingQueue, and not just the elements at the start and end. For instance, say you have queued an object for processing, but your application decides to cancel it. You can then call e.g. remove(o) to remove a specific object in the queue. However, this is not done very efficiently, so you should not use these Collection methods unless you really have to. - -##BlockingQueue Implementations - -Since BlockingQueue is an interface, you need to use one of its implementations to use it. The java.util.concurrent package has the following implementations of the BlockingQueue interface (in Java 6): - -ArrayBlockingQueue -DelayQueue -LinkedBlockingQueue -PriorityBlockingQueue -SynchronousQueue -Click the links in the list to read more about each implementation. If a link cannot be clicked, that implementation has not yet been described. Check back again in the future, or check out the JavaDoc's for more detail. - -##Java BlockingQueue Example - -Here is a Java BlockingQueue example. The example uses the ArrayBlockingQueue implementation of the BlockingQueue interface. - -First, the BlockingQueueExample class which starts a Producer and a Consumer in separate threads. The Producer inserts strings into a shared BlockingQueue, and the Consumer takes them out. - -public class BlockingQueueExample { - - public static void main(String[] args) throws Exception { - - BlockingQueue queue = new ArrayBlockingQueue(1024); - - Producer producer = new Producer(queue); - Consumer consumer = new Consumer(queue); - - new Thread(producer).start(); - new Thread(consumer).start(); - - Thread.sleep(4000); - } -} -Here is the Producer class. Notice how it sleeps a second between each put() call. This will cause the Consumer to block, while waiting for objects in the queue. - -public class Producer implements Runnable{ - - protected BlockingQueue queue = null; - - public Producer(BlockingQueue queue) { - this.queue = queue; - } - - public void run() { - try { - queue.put("1"); - Thread.sleep(1000); - queue.put("2"); - Thread.sleep(1000); - queue.put("3"); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} -Here is the Consumer class. It just takes out the objects from the queue, and prints them to System.out. - -public class Consumer implements Runnable{ - - protected BlockingQueue queue = null; - - public Consumer(BlockingQueue queue) { - this.queue = queue; - } - - public void run() { - try { - System.out.println(queue.take()); - System.out.println(queue.take()); - System.out.println(queue.take()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file From 261e22a428cd65152f1e01de6a3a66a83230df4d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:30:26 +0800 Subject: [PATCH 399/524] Published with https://stackedit.io/ --- ...7\357\274\210BlockingQueue\357\274\211.md" | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 "Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" new file mode 100644 index 0000000..39fa489 --- /dev/null +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -0,0 +1,113 @@ +#02.阻塞队列(BlockingQueue) + +The Java BlockingQueue interface in the java.util.concurrent class represents a queue which is thread safe to put into, and take instances from. In this text I will show you how to use this BlockingQueue. + +This text will not discuss how to implement a BlockingQueue in Java yourself. If you are interested in that, I have a text on Blocking Queues in my more theoretical Java Concurrency Tutorial. + +##BlockingQueue Usage + +A BlockingQueue is typically used to have on thread produce objects, which another thread consumes. Here is a diagram that illustrates this principle: + +A BlockingQueue with one thread putting into it, and another thread taking from it. +A BlockingQueue with one thread putting into it, and another thread taking from it. +The producing thread will keep producing new objects and insert them into the queue, until the queue reaches some upper bound on what it can contain. It's limit, in other words. If the blocking queue reaches its upper limit, the producing thread is blocked while trying to insert the new object. It remains blocked until a consuming thread takes an object out of the queue. + +The consuming thread keeps taking objects out of the blocking queue, and processes them. If the consuming thread tries to take an object out of an empty queue, the consuming thread is blocked until a producing thread puts an object into the queue. + + +##BlockingQueue Methods + +A BlockingQueue has 4 different sets of methods for inserting, removing and examining the elements in the queue. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods: + + Throws Exception Special Value Blocks Times Out +Insert add(o) offer(o) put(o) offer(o, timeout, timeunit) +Remove remove(o) poll(o) take(o) poll(timeout, timeunit) +Examine element(o) peek(o) +The 4 different sets of behaviour means this: + +Throws Exception: +If the attempted operation is not possible immediately, an exception is thrown. +Special Value: +If the attempted operation is not possible immediately, a special value is returned (often true / false). +Blocks: +If the attempted operation is not possible immedidately, the method call blocks until it is. +Times Out: +If the attempted operation is not possible immedidately, the method call blocks until it is, but waits no longer than the given timeout. Returns a special value telling whether the operation succeeded or not (typically true / false). +It is not possible to insert null into a BlockingQueue. If you try to insert null, the BlockingQueue will throw a NullPointerException. + +It is also possible to access all the elements inside a BlockingQueue, and not just the elements at the start and end. For instance, say you have queued an object for processing, but your application decides to cancel it. You can then call e.g. remove(o) to remove a specific object in the queue. However, this is not done very efficiently, so you should not use these Collection methods unless you really have to. + +##BlockingQueue Implementations + +Since BlockingQueue is an interface, you need to use one of its implementations to use it. The java.util.concurrent package has the following implementations of the BlockingQueue interface (in Java 6): + +ArrayBlockingQueue +DelayQueue +LinkedBlockingQueue +PriorityBlockingQueue +SynchronousQueue +Click the links in the list to read more about each implementation. If a link cannot be clicked, that implementation has not yet been described. Check back again in the future, or check out the JavaDoc's for more detail. + +##Java BlockingQueue Example + +Here is a Java BlockingQueue example. The example uses the ArrayBlockingQueue implementation of the BlockingQueue interface. + +First, the BlockingQueueExample class which starts a Producer and a Consumer in separate threads. The Producer inserts strings into a shared BlockingQueue, and the Consumer takes them out. + +public class BlockingQueueExample { + + public static void main(String[] args) throws Exception { + + BlockingQueue queue = new ArrayBlockingQueue(1024); + + Producer producer = new Producer(queue); + Consumer consumer = new Consumer(queue); + + new Thread(producer).start(); + new Thread(consumer).start(); + + Thread.sleep(4000); + } +} +Here is the Producer class. Notice how it sleeps a second between each put() call. This will cause the Consumer to block, while waiting for objects in the queue. + +public class Producer implements Runnable{ + + protected BlockingQueue queue = null; + + public Producer(BlockingQueue queue) { + this.queue = queue; + } + + public void run() { + try { + queue.put("1"); + Thread.sleep(1000); + queue.put("2"); + Thread.sleep(1000); + queue.put("3"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} +Here is the Consumer class. It just takes out the objects from the queue, and prints them to System.out. + +public class Consumer implements Runnable{ + + protected BlockingQueue queue = null; + + public Consumer(BlockingQueue queue) { + this.queue = queue; + } + + public void run() { + try { + System.out.println(queue.take()); + System.out.println(queue.take()); + System.out.println(queue.take()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file From b5c3ed78e956cb6f14f9ed7a6c1a70eb748caa67 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:31:24 +0800 Subject: [PATCH 400/524] Published with https://stackedit.io/ --- ...0\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index 39fa489..85bfbca 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -8,8 +8,8 @@ This text will not discuss how to implement a BlockingQueue in Java yourself. If A BlockingQueue is typically used to have on thread produce objects, which another thread consumes. Here is a diagram that illustrates this principle: -A BlockingQueue with one thread putting into it, and another thread taking from it. -A BlockingQueue with one thread putting into it, and another thread taking from it. +![A BlockingQueue with one thread putting into it, and another thread taking from it.](http://tutorials.jenkov.com/images/java-concurrency-utils/blocking-queue.png) + The producing thread will keep producing new objects and insert them into the queue, until the queue reaches some upper bound on what it can contain. It's limit, in other words. If the blocking queue reaches its upper limit, the producing thread is blocked while trying to insert the new object. It remains blocked until a consuming thread takes an object out of the queue. The consuming thread keeps taking objects out of the blocking queue, and processes them. If the consuming thread tries to take an object out of an empty queue, the consuming thread is blocked until a producing thread puts an object into the queue. From 346c8dbcd2363d1d191a471ba7b07c961fee76b6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 16:44:20 +0800 Subject: [PATCH 401/524] Published with https://stackedit.io/ --- ...\210\227\357\274\210BlockingQueue\357\274\211.md" | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index 85bfbca..5f568e3 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -1,10 +1,8 @@ #02.阻塞队列(BlockingQueue) -The Java BlockingQueue interface in the java.util.concurrent class represents a queue which is thread safe to put into, and take instances from. In this text I will show you how to use this BlockingQueue. +在Java `java.util.concurrent`包中的*BlockingQueue*类是一个线程安全的阻塞队列类,在这个类中,入列和出类的操作都是线程安全的。 -This text will not discuss how to implement a BlockingQueue in Java yourself. If you are interested in that, I have a text on Blocking Queues in my more theoretical Java Concurrency Tutorial. - -##BlockingQueue Usage +##BlockingQueue用法(BlockingQueue Usage) A BlockingQueue is typically used to have on thread produce objects, which another thread consumes. Here is a diagram that illustrates this principle: @@ -15,7 +13,7 @@ The producing thread will keep producing new objects and insert them into the qu The consuming thread keeps taking objects out of the blocking queue, and processes them. If the consuming thread tries to take an object out of an empty queue, the consuming thread is blocked until a producing thread puts an object into the queue. -##BlockingQueue Methods +##BlockingQueue的方法(BlockingQueue Methods) A BlockingQueue has 4 different sets of methods for inserting, removing and examining the elements in the queue. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods: @@ -37,7 +35,7 @@ It is not possible to insert null into a BlockingQueue. If you try to insert nul It is also possible to access all the elements inside a BlockingQueue, and not just the elements at the start and end. For instance, say you have queued an object for processing, but your application decides to cancel it. You can then call e.g. remove(o) to remove a specific object in the queue. However, this is not done very efficiently, so you should not use these Collection methods unless you really have to. -##BlockingQueue Implementations +##BlockingQueue的实现类(BlockingQueue Implementations) Since BlockingQueue is an interface, you need to use one of its implementations to use it. The java.util.concurrent package has the following implementations of the BlockingQueue interface (in Java 6): @@ -48,7 +46,7 @@ PriorityBlockingQueue SynchronousQueue Click the links in the list to read more about each implementation. If a link cannot be clicked, that implementation has not yet been described. Check back again in the future, or check out the JavaDoc's for more detail. -##Java BlockingQueue Example +##BlockingQueue示例(Java BlockingQueue Example) Here is a Java BlockingQueue example. The example uses the ArrayBlockingQueue implementation of the BlockingQueue interface. From 932aa7fc202adb758619479114c4525323a4f839 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 17:12:31 +0800 Subject: [PATCH 402/524] Published with https://stackedit.io/ --- ...0\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index 5f568e3..c5abb01 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -4,10 +4,12 @@ ##BlockingQueue用法(BlockingQueue Usage) -A BlockingQueue is typically used to have on thread produce objects, which another thread consumes. Here is a diagram that illustrates this principle: +阻塞队列(BlockingQueue)通常被用于**生产消费者模式**。看下面这张图: ![A BlockingQueue with one thread putting into it, and another thread taking from it.](http://tutorials.jenkov.com/images/java-concurrency-utils/blocking-queue.png) + + The producing thread will keep producing new objects and insert them into the queue, until the queue reaches some upper bound on what it can contain. It's limit, in other words. If the blocking queue reaches its upper limit, the producing thread is blocked while trying to insert the new object. It remains blocked until a consuming thread takes an object out of the queue. The consuming thread keeps taking objects out of the blocking queue, and processes them. If the consuming thread tries to take an object out of an empty queue, the consuming thread is blocked until a producing thread puts an object into the queue. From dad7ba1c8057837f834c41a51748c5734af7159f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 17:50:32 +0800 Subject: [PATCH 403/524] Published with https://stackedit.io/ --- ...7\357\274\210BlockingQueue\357\274\211.md" | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index c5abb01..997dc0c 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -1,6 +1,6 @@ #02.阻塞队列(BlockingQueue) -在Java `java.util.concurrent`包中的*BlockingQueue*类是一个线程安全的阻塞队列类,在这个类中,入列和出类的操作都是线程安全的。 +在Java `java.util.concurrent`包中的*BlockingQueue*是一个线程安全的阻塞队列接口,在这个接口中,入列和出类的操作都是线程安全的。 ##BlockingQueue用法(BlockingQueue Usage) @@ -8,21 +8,25 @@ ![A BlockingQueue with one thread putting into it, and another thread taking from it.](http://tutorials.jenkov.com/images/java-concurrency-utils/blocking-queue.png) +**生产者线程**生产新的对象,并把对象插入到队列中,直到队列中元素达到上限。如果阻塞队列达到了上限,则尝试插入对象的生产者线程会进入阻塞状态,它们会一直阻塞直到有**消费者线程**从队列中取出对象。 +**消费者线程**会持续从阻塞队列中取出对象并进行相应处理。如果消费者线程试图从空的阻塞队列中取出对象,则会进入阻塞状态,直到有生产者线程向队列中插入对象。 -The producing thread will keep producing new objects and insert them into the queue, until the queue reaches some upper bound on what it can contain. It's limit, in other words. If the blocking queue reaches its upper limit, the producing thread is blocked while trying to insert the new object. It remains blocked until a consuming thread takes an object out of the queue. - -The consuming thread keeps taking objects out of the blocking queue, and processes them. If the consuming thread tries to take an object out of an empty queue, the consuming thread is blocked until a producing thread puts an object into the queue. +##BlockingQueue的方法(BlockingQueue Methods) +*BlockingQueue*分别有四种用于**入列**和**出列**的方法。每种方法都有不同的处理行为用以处理不同的应用场景: -##BlockingQueue的方法(BlockingQueue Methods) +每一套方法表现不同的情况下所请求的操作不能被立即进行。下面是该方法的一个表: A BlockingQueue has 4 different sets of methods for inserting, removing and examining the elements in the queue. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods: - Throws Exception Special Value Blocks Times Out -Insert add(o) offer(o) put(o) offer(o, timeout, timeunit) -Remove remove(o) poll(o) take(o) poll(timeout, timeunit) -Examine element(o) peek(o) +|Throws Exception| Special Value| Blocks| Times Out + ------|--------------|------------|--------------|---------------- +Insert | add(o) | offer(o) | put(o) |offer(o, timeout, timeunit) +Remove | remove(o) | poll(o)| take(o) |poll(timeout, timeunit) +Examine | element(o) | peek(o) | | + + The 4 different sets of behaviour means this: Throws Exception: From 456c3f5334a14c60a22d4a0f7d695df7fe16def3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 17:51:47 +0800 Subject: [PATCH 404/524] Published with https://stackedit.io/ --- ...230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index 997dc0c..e8aad5c 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -20,7 +20,7 @@ A BlockingQueue has 4 different sets of methods for inserting, removing and examining the elements in the queue. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods: -|Throws Exception| Special Value| Blocks| Times Out +||Throws Exception| Special Value| Blocks| Times Out ------|--------------|------------|--------------|---------------- Insert | add(o) | offer(o) | put(o) |offer(o, timeout, timeunit) Remove | remove(o) | poll(o)| take(o) |poll(timeout, timeunit) From 7f351d8ab93b46e7c3d6a5d560dad9e869e20963 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 17:54:08 +0800 Subject: [PATCH 405/524] Published with https://stackedit.io/ --- ...\227\357\274\210BlockingQueue\357\274\211.md" | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index e8aad5c..a9aeb95 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -16,10 +16,6 @@ *BlockingQueue*分别有四种用于**入列**和**出列**的方法。每种方法都有不同的处理行为用以处理不同的应用场景: -每一套方法表现不同的情况下所请求的操作不能被立即进行。下面是该方法的一个表: - -A BlockingQueue has 4 different sets of methods for inserting, removing and examining the elements in the queue. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods: - ||Throws Exception| Special Value| Blocks| Times Out ------|--------------|------------|--------------|---------------- Insert | add(o) | offer(o) | put(o) |offer(o, timeout, timeunit) @@ -27,16 +23,18 @@ Remove | remove(o) | poll(o)| take(o) |poll(timeout, timeunit) Examine | element(o) | peek(o) | | -The 4 different sets of behaviour means this: +四种不同的行为含义: -Throws Exception: +* 抛出异常(Throws Exception): If the attempted operation is not possible immediately, an exception is thrown. -Special Value: +* 特殊值(Special Value): If the attempted operation is not possible immediately, a special value is returned (often true / false). -Blocks: +* 阻塞(Blocks): If the attempted operation is not possible immedidately, the method call blocks until it is. -Times Out: +* 超时(Times Out): If the attempted operation is not possible immedidately, the method call blocks until it is, but waits no longer than the given timeout. Returns a special value telling whether the operation succeeded or not (typically true / false). + + It is not possible to insert null into a BlockingQueue. If you try to insert null, the BlockingQueue will throw a NullPointerException. It is also possible to access all the elements inside a BlockingQueue, and not just the elements at the start and end. For instance, say you have queued an object for processing, but your application decides to cancel it. You can then call e.g. remove(o) to remove a specific object in the queue. However, this is not done very efficiently, so you should not use these Collection methods unless you really have to. From b7be633355edff44ad47fa58702c1e2c4bcdec94 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 18:08:11 +0800 Subject: [PATCH 406/524] Published with https://stackedit.io/ --- ...\345\210\227\357\274\210BlockingQueue\357\274\211.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index a9aeb95..4566e19 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -26,14 +26,13 @@ Examine | element(o) | peek(o) | | 四种不同的行为含义: * 抛出异常(Throws Exception): -If the attempted operation is not possible immediately, an exception is thrown. +如果尝试的操作不能立即执行则抛出异常。 * 特殊值(Special Value): -If the attempted operation is not possible immediately, a special value is returned (often true / false). +如果尝试的操作不能立即执行,则返回特殊值(通常为true/false)。 * 阻塞(Blocks): -If the attempted operation is not possible immedidately, the method call blocks until it is. +如果尝试的操作不能立即执行,则方法进入阻塞直到能够执行。 * 超时(Times Out): -If the attempted operation is not possible immedidately, the method call blocks until it is, but waits no longer than the given timeout. Returns a special value telling whether the operation succeeded or not (typically true / false). - +如果尝试的方法不能立即执行,则方法进入阻塞直到能够执行,但如果阻塞超过设置的超时时间,则返回一个特殊值指明操作是否成功执行(通常为true/false) It is not possible to insert null into a BlockingQueue. If you try to insert null, the BlockingQueue will throw a NullPointerException. From b0d234259b8a5a9ed7dc50ad4f9a24590db44417 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 18:20:02 +0800 Subject: [PATCH 407/524] Published with https://stackedit.io/ --- ...237\345\210\227\357\274\210BlockingQueue\357\274\211.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index 4566e19..ae327bc 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -34,12 +34,14 @@ Examine | element(o) | peek(o) | | * 超时(Times Out): 如果尝试的方法不能立即执行,则方法进入阻塞直到能够执行,但如果阻塞超过设置的超时时间,则返回一个特殊值指明操作是否成功执行(通常为true/false) -It is not possible to insert null into a BlockingQueue. If you try to insert null, the BlockingQueue will throw a NullPointerException. +往*BlockingQueue*中插入null是不可能的,如果你往*BlockingQueue*中插入null,则会抛出*NullPointerException*异常。 -It is also possible to access all the elements inside a BlockingQueue, and not just the elements at the start and end. For instance, say you have queued an object for processing, but your application decides to cancel it. You can then call e.g. remove(o) to remove a specific object in the queue. However, this is not done very efficiently, so you should not use these Collection methods unless you really have to. +获取*BlockingQueue*中任意的元素都是可以的,不仅限于队列的头部或尾部。举个例子,如果你已经将一个任务插入队列,但你现在想取消这个任务,你可以通过类似`remove(task)`的方法来删除特定的在*BlockingQueue*中的元素。然而,这些操作都并非高性能的,除非迫不得已,不要调用这些方法。 ##BlockingQueue的实现类(BlockingQueue Implementations) + + Since BlockingQueue is an interface, you need to use one of its implementations to use it. The java.util.concurrent package has the following implementations of the BlockingQueue interface (in Java 6): ArrayBlockingQueue From c44ed4dace7b07dcc644d7d6db8ce6e6c98a56ac Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 18:26:47 +0800 Subject: [PATCH 408/524] Published with https://stackedit.io/ --- ...7\357\274\210BlockingQueue\357\274\211.md" | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index ae327bc..26927a9 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -40,27 +40,24 @@ Examine | element(o) | peek(o) | | ##BlockingQueue的实现类(BlockingQueue Implementations) +由于*BlockingQueue*只是一个接口,所以我们要用时,应该选择具体的实现类。在Java 6的*java.util.concurrent*包中包含以下*BlockingQueue*的实现类: - -Since BlockingQueue is an interface, you need to use one of its implementations to use it. The java.util.concurrent package has the following implementations of the BlockingQueue interface (in Java 6): - -ArrayBlockingQueue -DelayQueue -LinkedBlockingQueue -PriorityBlockingQueue -SynchronousQueue -Click the links in the list to read more about each implementation. If a link cannot be clicked, that implementation has not yet been described. Check back again in the future, or check out the JavaDoc's for more detail. +* ArrayBlockingQueue +* DelayQueue +* LinkedBlockingQueue +* PriorityBlockingQueue +* SynchronousQueue ##BlockingQueue示例(Java BlockingQueue Example) -Here is a Java BlockingQueue example. The example uses the ArrayBlockingQueue implementation of the BlockingQueue interface. +下面是一个*BlockingQueue*的例子,这个例子中使用了实现*BlockingQueue*接口的*ArrayBlockingQueue*类。 -First, the BlockingQueueExample class which starts a Producer and a Consumer in separate threads. The Producer inserts strings into a shared BlockingQueue, and the Consumer takes them out. +首先,这个*BlockingQueueExample*类中,分别启动了一个*Producer*和一个*Consumer*线程。*Producer*线程往共享的阻塞队列中插入数据,而*Consumer*线程从阻塞队列中取出数据并进行相应处理: +```Java public class BlockingQueueExample { public static void main(String[] args) throws Exception { - BlockingQueue queue = new ArrayBlockingQueue(1024); Producer producer = new Producer(queue); @@ -72,10 +69,12 @@ public class BlockingQueueExample { Thread.sleep(4000); } } +``` + Here is the Producer class. Notice how it sleeps a second between each put() call. This will cause the Consumer to block, while waiting for objects in the queue. +```Java public class Producer implements Runnable{ - protected BlockingQueue queue = null; public Producer(BlockingQueue queue) { @@ -94,10 +93,12 @@ public class Producer implements Runnable{ } } } +``` + Here is the Consumer class. It just takes out the objects from the queue, and prints them to System.out. +```Java public class Consumer implements Runnable{ - protected BlockingQueue queue = null; public Consumer(BlockingQueue queue) { @@ -113,4 +114,5 @@ public class Consumer implements Runnable{ e.printStackTrace(); } } -} \ No newline at end of file +} +``` \ No newline at end of file From 674e5133ed1569c068c6946d542ad03f2cc6ef41 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 23 Sep 2014 18:32:03 +0800 Subject: [PATCH 409/524] Published with https://stackedit.io/ --- ...0\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" index 26927a9..0454d9d 100644 --- "a/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" +++ "b/Java-Concurrency-Util/02.\351\230\273\345\241\236\351\230\237\345\210\227\357\274\210BlockingQueue\357\274\211.md" @@ -71,7 +71,7 @@ public class BlockingQueueExample { } ``` -Here is the Producer class. Notice how it sleeps a second between each put() call. This will cause the Consumer to block, while waiting for objects in the queue. +下面是*Producer*类的实现。注意这里的每个`put()`方法间线程都休眠了1s。这会导致等待队列元素的*Consumer*线程阻塞。 ```Java public class Producer implements Runnable{ @@ -95,7 +95,7 @@ public class Producer implements Runnable{ } ``` -Here is the Consumer class. It just takes out the objects from the queue, and prints them to System.out. +下面是*Consumer*类的实现,它仅仅只是连续从队列中取出三个元素并进行打印: ```Java public class Consumer implements Runnable{ From 78f7d841a42ea7c69af813417b39f70a4a4a9e0c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 01:22:31 +0800 Subject: [PATCH 410/524] Published with https://stackedit.io/ --- Java-Concurrency-Util/03.ArrayBlockingQueue.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Java-Concurrency-Util/03.ArrayBlockingQueue.md diff --git a/Java-Concurrency-Util/03.ArrayBlockingQueue.md b/Java-Concurrency-Util/03.ArrayBlockingQueue.md new file mode 100644 index 0000000..4498536 --- /dev/null +++ b/Java-Concurrency-Util/03.ArrayBlockingQueue.md @@ -0,0 +1,4 @@ +#03.ArrayBlockingQueue + + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From 8a2883af65091851144f74d0638f59228278f846 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 01:23:06 +0800 Subject: [PATCH 411/524] Published with https://stackedit.io/ --- .../03.ArrayBlockingQueue.md | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Java-Concurrency-Util/03.ArrayBlockingQueue.md b/Java-Concurrency-Util/03.ArrayBlockingQueue.md index 4498536..f640869 100644 --- a/Java-Concurrency-Util/03.ArrayBlockingQueue.md +++ b/Java-Concurrency-Util/03.ArrayBlockingQueue.md @@ -1,4 +1,22 @@ #03.ArrayBlockingQueue +The ArrayBlockingQueue class implements the BlockingQueue interface. Read the BlockingQueue text for more information about the interface. -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file +ArrayBlockingQueue is a bounded, blocking queue that stores the elements internally in an array. That it is bounded means that it cannot store unlimited amounts of elements. There is an upper bound on the number of elements it can store at the same time. You set the upper bound at instantiation time, and after that it cannot be changed. + +The ArrayBlockingQueue stores the elements internally in FIFO (First In, First Out) order. The head of the queue is the element which has been in queue the longest time, and the tail of the queue is the element which has been in the queue the shortest time. + +Here is how to instantiate and use an ArrayBlockingQueue: + +BlockingQueue queue = new ArrayBlockingQueue(1024); + +queue.put("1"); + +Object object = queue.take(); +Here is a BlockingQueue example that uses Java Generics. Notice how you can put and take String's instead of : + +BlockingQueue queue = new ArrayBlockingQueue(1024); + +queue.put("1"); + +String string = queue.take(); From ccec7c1bcf648982deecaf3320969d257a57c885 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 01:23:22 +0800 Subject: [PATCH 412/524] Published with https://stackedit.io/ From e97f5ff9c356b9b6b4509eb7559e94c840a7b06c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 01:57:37 +0800 Subject: [PATCH 413/524] Published with https://stackedit.io/ --- Java-Concurrency-Util/03.ArrayBlockingQueue.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Java-Concurrency-Util/03.ArrayBlockingQueue.md b/Java-Concurrency-Util/03.ArrayBlockingQueue.md index f640869..abe6d4f 100644 --- a/Java-Concurrency-Util/03.ArrayBlockingQueue.md +++ b/Java-Concurrency-Util/03.ArrayBlockingQueue.md @@ -1,22 +1,27 @@ #03.ArrayBlockingQueue -The ArrayBlockingQueue class implements the BlockingQueue interface. Read the BlockingQueue text for more information about the interface. +*ArrayBlockingQueue*类实现了*BlockingQueue*接口。*ArrayBlockingQueue*是一个有界的阻塞队列,其内部维护了一个数组用于存储元素。有界意味着*ArrayBlockingQueue*不能存储无限量的元素。在同一时间内*ArrayBlockingQueue*存储的元素有一个上限,我们可以在初始化*ArrayBlockingQueue*时设置这个上限,而在此之后无法进行修改这个上限。 + -ArrayBlockingQueue is a bounded, blocking queue that stores the elements internally in an array. That it is bounded means that it cannot store unlimited amounts of elements. There is an upper bound on the number of elements it can store at the same time. You set the upper bound at instantiation time, and after that it cannot be changed. The ArrayBlockingQueue stores the elements internally in FIFO (First In, First Out) order. The head of the queue is the element which has been in queue the longest time, and the tail of the queue is the element which has been in the queue the shortest time. Here is how to instantiate and use an ArrayBlockingQueue: +```Java BlockingQueue queue = new ArrayBlockingQueue(1024); queue.put("1"); Object object = queue.take(); +``` + Here is a BlockingQueue example that uses Java Generics. Notice how you can put and take String's instead of : +```Java BlockingQueue queue = new ArrayBlockingQueue(1024); queue.put("1"); String string = queue.take(); +``` \ No newline at end of file From 77948417428938c85bcd31a710504a85e6b70acd Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 02:03:15 +0800 Subject: [PATCH 414/524] Published with https://stackedit.io/ --- Java-Concurrency-Util/03.ArrayBlockingQueue.md | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/Java-Concurrency-Util/03.ArrayBlockingQueue.md b/Java-Concurrency-Util/03.ArrayBlockingQueue.md index abe6d4f..d85e550 100644 --- a/Java-Concurrency-Util/03.ArrayBlockingQueue.md +++ b/Java-Concurrency-Util/03.ArrayBlockingQueue.md @@ -2,21 +2,9 @@ *ArrayBlockingQueue*类实现了*BlockingQueue*接口。*ArrayBlockingQueue*是一个有界的阻塞队列,其内部维护了一个数组用于存储元素。有界意味着*ArrayBlockingQueue*不能存储无限量的元素。在同一时间内*ArrayBlockingQueue*存储的元素有一个上限,我们可以在初始化*ArrayBlockingQueue*时设置这个上限,而在此之后无法进行修改这个上限。 +*ArrayBlockingQueue*存储元素时遵循FIFO(先进先出)原则。在队列头部的元素的最先入列的元素,而在队列尾部的元素则是最新入列的元素。 - -The ArrayBlockingQueue stores the elements internally in FIFO (First In, First Out) order. The head of the queue is the element which has been in queue the longest time, and the tail of the queue is the element which has been in the queue the shortest time. - -Here is how to instantiate and use an ArrayBlockingQueue: - -```Java -BlockingQueue queue = new ArrayBlockingQueue(1024); - -queue.put("1"); - -Object object = queue.take(); -``` - -Here is a BlockingQueue example that uses Java Generics. Notice how you can put and take String's instead of : +下面的例子演示了如何初始化*ArrayBlockingQueue*类: ```Java BlockingQueue queue = new ArrayBlockingQueue(1024); From 50f16dc2bf2ce2fa19f27593c389f8f012b74317 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 02:07:09 +0800 Subject: [PATCH 415/524] Published with https://stackedit.io/ --- ...273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 "Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" diff --git "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" new file mode 100644 index 0000000..631c7ef --- /dev/null +++ "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" @@ -0,0 +1,3 @@ +04.DelayQueue(延时队列) + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From 5e339198b4ad0ac7e2f56bc2e8ef7206313475fa Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 02:07:50 +0800 Subject: [PATCH 416/524] Published with https://stackedit.io/ --- ...66\351\230\237\345\210\227\357\274\211.md" | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" index 631c7ef..8aad36d 100644 --- "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" +++ "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" @@ -1,3 +1,44 @@ 04.DelayQueue(延时队列) -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file +DelayQueue class implements the BlockingQueue interface. Read the BlockingQueue text for more information about the interface. +The DelayQueue keeps the elements internally until a certain delay has expired. The elements must implement the interface java.util.concurrent.Delayed. Here is how the interface looks: + +public interface Delayed extends Comparable Date: Wed, 24 Sep 2014 02:18:19 +0800 Subject: [PATCH 417/524] Published with https://stackedit.io/ --- ...6\346\227\266\351\230\237\345\210\227\357\274\211.md" | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" index 8aad36d..e384ab2 100644 --- "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" +++ "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" @@ -1,13 +1,16 @@ 04.DelayQueue(延时队列) +*DelayQueue*类是*BlockingQueue*接口的实现类。 + DelayQueue class implements the BlockingQueue interface. Read the BlockingQueue text for more information about the interface. The DelayQueue keeps the elements internally until a certain delay has expired. The elements must implement the interface java.util.concurrent.Delayed. Here is how the interface looks: +```Java public interface Delayed extends Comparable Date: Wed, 24 Sep 2014 02:25:41 +0800 Subject: [PATCH 418/524] Published with https://stackedit.io/ --- ...66\346\227\266\351\230\237\345\210\227\357\274\211.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" index e384ab2..67a7790 100644 --- "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" +++ "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" @@ -1,9 +1,7 @@ 04.DelayQueue(延时队列) -*DelayQueue*类是*BlockingQueue*接口的实现类。 - -DelayQueue class implements the BlockingQueue interface. Read the BlockingQueue text for more information about the interface. -The DelayQueue keeps the elements internally until a certain delay has expired. The elements must implement the interface java.util.concurrent.Delayed. Here is how the interface looks: +*DelayQueue*类是*BlockingQueue*接口的实现类。*DelayQueue*类维护内部的元素直到特定的延时过期(The DelayQueue keeps the elements internally until a certain delay has expired.)。*DelayQueue* +类里面的元素需要实现*java.util.concurrent.Delay*接口。下面是Delay接口的示例代码: ```Java public interface Delayed extends Comparable Date: Wed, 24 Sep 2014 02:28:47 +0800 Subject: [PATCH 419/524] Published with https://stackedit.io/ --- ...\266\346\227\266\351\230\237\345\210\227\357\274\211.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" index 67a7790..d80e353 100644 --- "a/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" +++ "b/Java-Concurrency-Util/04.DelayQueue\357\274\210\345\273\266\346\227\266\351\230\237\345\210\227\357\274\211.md" @@ -1,7 +1,8 @@ 04.DelayQueue(延时队列) -*DelayQueue*类是*BlockingQueue*接口的实现类。*DelayQueue*类维护内部的元素直到特定的延时过期(The DelayQueue keeps the elements internally until a certain delay has expired.)。*DelayQueue* -类里面的元素需要实现*java.util.concurrent.Delay*接口。下面是Delay接口的示例代码: +DelayQueue class implements the BlockingQueue interface. Read the BlockingQueue text for more information about the interface. + +The DelayQueue keeps the elements internally until a certain delay has expired. The elements must implement the interface java.util.concurrent.Delayed. Here is how the interface looks: ```Java public interface Delayed extends Comparable Date: Wed, 24 Sep 2014 02:35:43 +0800 Subject: [PATCH 420/524] Published with https://stackedit.io/ --- Java-Concurrency-Util/#5.LinkedBlockingQueue.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Java-Concurrency-Util/#5.LinkedBlockingQueue.md diff --git a/Java-Concurrency-Util/#5.LinkedBlockingQueue.md b/Java-Concurrency-Util/#5.LinkedBlockingQueue.md new file mode 100644 index 0000000..c498d4a --- /dev/null +++ b/Java-Concurrency-Util/#5.LinkedBlockingQueue.md @@ -0,0 +1,6 @@ +#05.LinkedBlockingQueue + + + + +> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file From 9c1dcc531d5e7705ffbb55404a0d07067ac13e55 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 02:37:10 +0800 Subject: [PATCH 421/524] Published with https://stackedit.io/ --- Java-Concurrency-Util/#5.LinkedBlockingQueue.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Java-Concurrency-Util/#5.LinkedBlockingQueue.md b/Java-Concurrency-Util/#5.LinkedBlockingQueue.md index c498d4a..9170806 100644 --- a/Java-Concurrency-Util/#5.LinkedBlockingQueue.md +++ b/Java-Concurrency-Util/#5.LinkedBlockingQueue.md @@ -1,6 +1,18 @@ #05.LinkedBlockingQueue +The *LinkedBlockingQueue* class implements the *BlockingQueue* interface. Read the *BlockingQueue* text for more information about the interface. +The *LinkedBlockingQueue* keeps the elements internally in a linked structure (linked nodes). This linked structure can optionally have an upper bound if desired. If no upper bound is specified, Integer.MAX_VALUE is used as the upper bound. +The *LinkedBlockingQueue* stores the elements internally in FIFO (First In, First Out) order. The head of the queue is the element which has been in queue the longest time, and the tail of the queue is the element which has been in the queue the shortest time. -> Written with [StackEdit](https://stackedit.io/). \ No newline at end of file +Here is how to instantiate and use a LinkedBlockingQueue: + +```Java +BlockingQueue unbounded = new LinkedBlockingQueue(); +BlockingQueue bounded = new LinkedBlockingQueue(1024); + +bounded.put("Value"); + +String value = bounded.take(); +``` \ No newline at end of file From 4720052e1471572dfa631074856d6cc3d08e06a0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 02:39:36 +0800 Subject: [PATCH 422/524] Published with https://stackedit.io/ --- .../06.PriorityBlockingQueue.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Java-Concurrency-Util/06.PriorityBlockingQueue.md diff --git a/Java-Concurrency-Util/06.PriorityBlockingQueue.md b/Java-Concurrency-Util/06.PriorityBlockingQueue.md new file mode 100644 index 0000000..9f3d012 --- /dev/null +++ b/Java-Concurrency-Util/06.PriorityBlockingQueue.md @@ -0,0 +1,22 @@ +#06.PriorityBlockingQueue + +The PriorityBlockingQueue class implements the BlockingQueue interface. Read the BlockingQueue text for more information about the interface. + +The PriorityBlockingQueue is an unbounded concurrent queue. It uses the same ordering rules as the java.util.PriorityQueue class. You cannot insert null into this queue. + +All elements inserted into the PriorityBlockingQueue must implement the java.lang.Comparable interface. The elements thus order themselves according to whatever priority you decide in your Comparable implementation. + +Notice that the PriorityBlockingQueue does not enforce any specific behaviour for elements that have equal priority (compare() == 0). + +Also notice, that in case you obtain an Iterator from a PriorityBlockingQueue, the Iterator does not guarantee to iterate the elements in priority order. + +Here is an example of how to use the PriorityBlockingQueue: + +```Java +BlockingQueue queue = new PriorityBlockingQueue(); + +//String implements java.lang.Comparable +queue.put("Value"); + +String value = queue.take(); +``` From 039276220c0d132607651f91d6dbac2f7774c311 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 02:40:52 +0800 Subject: [PATCH 423/524] Published with https://stackedit.io/ --- .../05.LinkedBlockingQueue.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Java-Concurrency-Util/05.LinkedBlockingQueue.md diff --git a/Java-Concurrency-Util/05.LinkedBlockingQueue.md b/Java-Concurrency-Util/05.LinkedBlockingQueue.md new file mode 100644 index 0000000..9170806 --- /dev/null +++ b/Java-Concurrency-Util/05.LinkedBlockingQueue.md @@ -0,0 +1,18 @@ +#05.LinkedBlockingQueue + +The *LinkedBlockingQueue* class implements the *BlockingQueue* interface. Read the *BlockingQueue* text for more information about the interface. + +The *LinkedBlockingQueue* keeps the elements internally in a linked structure (linked nodes). This linked structure can optionally have an upper bound if desired. If no upper bound is specified, Integer.MAX_VALUE is used as the upper bound. + +The *LinkedBlockingQueue* stores the elements internally in FIFO (First In, First Out) order. The head of the queue is the element which has been in queue the longest time, and the tail of the queue is the element which has been in the queue the shortest time. + +Here is how to instantiate and use a LinkedBlockingQueue: + +```Java +BlockingQueue unbounded = new LinkedBlockingQueue(); +BlockingQueue bounded = new LinkedBlockingQueue(1024); + +bounded.put("Value"); + +String value = bounded.take(); +``` \ No newline at end of file From 80f2d96b95b87f72f94469b30625f7bb7fb0de5d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 24 Sep 2014 02:41:07 +0800 Subject: [PATCH 424/524] Delete #5.LinkedBlockingQueue.md --- .../#5.LinkedBlockingQueue.md | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 Java-Concurrency-Util/#5.LinkedBlockingQueue.md diff --git a/Java-Concurrency-Util/#5.LinkedBlockingQueue.md b/Java-Concurrency-Util/#5.LinkedBlockingQueue.md deleted file mode 100644 index 9170806..0000000 --- a/Java-Concurrency-Util/#5.LinkedBlockingQueue.md +++ /dev/null @@ -1,18 +0,0 @@ -#05.LinkedBlockingQueue - -The *LinkedBlockingQueue* class implements the *BlockingQueue* interface. Read the *BlockingQueue* text for more information about the interface. - -The *LinkedBlockingQueue* keeps the elements internally in a linked structure (linked nodes). This linked structure can optionally have an upper bound if desired. If no upper bound is specified, Integer.MAX_VALUE is used as the upper bound. - -The *LinkedBlockingQueue* stores the elements internally in FIFO (First In, First Out) order. The head of the queue is the element which has been in queue the longest time, and the tail of the queue is the element which has been in the queue the shortest time. - -Here is how to instantiate and use a LinkedBlockingQueue: - -```Java -BlockingQueue unbounded = new LinkedBlockingQueue(); -BlockingQueue bounded = new LinkedBlockingQueue(1024); - -bounded.put("Value"); - -String value = bounded.take(); -``` \ No newline at end of file From 1ba9cb9755fda057defa7417627bcf9b087c3340 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 20:04:14 +0800 Subject: [PATCH 425/524] =?UTF-8?q?Update=2002.=E7=BC=96=E5=86=99=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89Annotation.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\206\231\350\207\252\345\256\232\344\271\211Annotation.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md" "b/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md" index fbe3f55..06afcd1 100644 --- "a/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md" +++ "b/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md" @@ -18,7 +18,7 @@ public @interface TestCase { // 使用@Interface修饰这个是一个Annotation 以上就完成了一个Annotation接口的编写。接着我们写一个Test类来使用@TestCase这个注释。 ```java public class Test { - @TestCase + public void m_1(){ System.out.println("This is Method with @TestCase!"); } From ff967b24c6c3eee7c384cf7bf24f4ce31b86a15b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 20:06:24 +0800 Subject: [PATCH 426/524] =?UTF-8?q?Update=2003.=E8=9B=8B=E7=96=BC=E7=9A=84?= =?UTF-8?q?AOP=E6=A6=82=E5=BF=B5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md" "b/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md" index 94c614f..6e24207 100644 --- "a/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md" +++ "b/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ #AOP介绍 -AOP全称Aspect Oriented Programming,面向切面编程。在事务管理,代码跟踪方面应用很广泛。教科书上的对于AOP概念的解释比较让人晕眩,下面是偶本人对AOP一些概念的理解: +AOP全称Aspect Oriented Programming,面向切面编程。在事务管理,代码跟踪方面应用很广泛。教科书上的对于AOP概念的解释比较让人晕眩。 >**连接点(Joinpoint)**:程序流中可以用于代码植入的点,通常是某些边界,例如:类初始化前、类初始化后、方法执行前、方法执行后、方法抛异常后。 From 8ddb3204e4d0df119e30c6301d3fb3f8a6d65da7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 20:08:57 +0800 Subject: [PATCH 427/524] =?UTF-8?q?Update=2005.=E8=A3=85=E9=A5=B0=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...243\205\351\245\260\345\231\250\346\250\241\345\274\217.md" | 3 --- 1 file changed, 3 deletions(-) diff --git "a/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md" "b/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md" index 4876258..78fc517 100644 --- "a/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md" +++ "b/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md" @@ -2,9 +2,6 @@ ## 遇到的问题 - 学习的最好方法就是实践,想当年大学学《设计模式》这门课的时候,重修两次,补考还挂了两次,最后还是甩小聪明才拿到的毕业证。 -往事不多提,甚是可悲。 - 最近遇到一个问题,这里有一个controller的方法,方法里面需要获取request header的 __x-forwarded-for__ 属性的值: ```java From 970815551b18a6cb8c8ff9b0e89426954c58466a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 20:52:01 +0800 Subject: [PATCH 428/524] =?UTF-8?q?Update=2022.=E7=BC=96=E7=A0=81=E8=A7=A3?= =?UTF-8?q?=E7=A0=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "22.\347\274\226\347\240\201\350\247\243\347\240\201.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/22.\347\274\226\347\240\201\350\247\243\347\240\201.md" "b/22.\347\274\226\347\240\201\350\247\243\347\240\201.md" index 689d289..5281478 100644 --- "a/22.\347\274\226\347\240\201\350\247\243\347\240\201.md" +++ "b/22.\347\274\226\347\240\201\350\247\243\347\240\201.md" @@ -9,7 +9,7 @@ ```Java System.out.println("中国"); ``` -1. 无论文件以任何编码格式载入到JVM中,"中国"二字都会以unicode码的形式存在JVM中(\u4e2d\u56fd); +1. 无论文本以任何编码格式载入到JVM中,"中国"二字都会以unicode码的形式存在JVM中(\u4e2d\u56fd); 2. 假如IDE控制台的编码为UTF-8,当对"中国"二字进行控制台输出时,系统会将unicode码转为具体的UTF-8编码格式。(\u4e2d\u56fd -> e4b8ade59bbd) ``` @@ -77,4 +77,4 @@ public void gbk_unicode_utf8() throws DecoderException, 实际上,这里的unicode编码对应的是unicode的`UTF-16`编码。以16位定长的二进制表示一个unicode码。 -## 参考资料 \ No newline at end of file +## 参考资料 From b1fdfa1ef95f5b02c94d2060f0ad5aa0c0d8fbdf Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 21:10:53 +0800 Subject: [PATCH 429/524] Update 31.Understanding Java Garbage Collection.md --- 31.Understanding Java Garbage Collection.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 6aecb19..08b21cb 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -1,4 +1,5 @@ -#31.Understanding Java Garbage Collection.md +#31.Understanding Java Garbage Collection + 理解GC(Garbage Collection)的工作原理对Java编程有什么益处呢?满足软件工程师的求知欲或许是一个不错的原因,但与此同时,也可以帮助你编写更加优秀的Java应用程序。 这是我的个人的主观意见,但是我相信那些深谙GC的人往往更容易成为一个优秀的Java工程师。如果你对GC感兴趣,那么意味着你有不错的开发经验。如果你有过仔细选择合适的GC算法经验,这意味着你完全了解你开发应用程序的功能特点。当然,这也许只是优秀开发者的普遍衡量标准,然而我要说的是,要想成为一名优秀的开发者,理解GC是一门必修的课程。 @@ -117,4 +118,4 @@ Parallel Old GC从JDK 5 update版本开始得到支持。相比Parallel GC,唯 待续... ## 参考文档 -* 翻译自:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ \ No newline at end of file +* 翻译自:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ From 9d296c8a6be568a40674357432f1c1f6a5ea9e2b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 21:17:54 +0800 Subject: [PATCH 430/524] Update 31.Understanding Java Garbage Collection.md --- 31.Understanding Java Garbage Collection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 08b21cb..cebc114 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -25,7 +25,7 @@ Java代码并不能显式地对内存进行分配和移除。有些人会将对 GC Area & Data Flow -以上图中**永久代(Permanent Generation)**被成为**方法区**,它用于存储class文件和运行时常量池。所以,这里的存储空间并不用于“收留”从老年代存活下来的对象。当GC可能会在这个区域发生,我们也把在这个区域发生的GC算作full GC。 +以上图中**永久代(Permanent Generation)**被称为**方法区**,它用于存储class文件和运行时常量池。所以,这里的存储空间并不用于“收留”从老年代存活下来的对象。当GC可能会在这个区域发生,我们也把在这个区域发生的GC算作full GC。 有些人会有疑问:当老年代的对象需要引用新生代的对象,这时候会发生什么情况? From 583c41b50ede2afb42e927c9d4ea63105f4067db Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 21:25:23 +0800 Subject: [PATCH 431/524] Update 31.Understanding Java Garbage Collection.md --- 31.Understanding Java Garbage Collection.md | 1 - 1 file changed, 1 deletion(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index cebc114..0add5c5 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -71,7 +71,6 @@ Bump-the-pointer technique tracks the last object allocated to the Eden space. T * Concurrent Mark & Sweep GC (or CMS) * Garbage First GC (G1) -其中,Serial GC不能应用于服务器上。这种GC通常在只有一个CPU内核的台式机器上才被创建 其中,串行GC不能使用的操作的服务器上。这种类型的GC创建时有在台式计算机上只有一个CPU核心。使用该系列GC将显著删除应用程序的性能。 使用这种将很明显地降低应用程序的性能。 现在让我们来了解没种GC的类型: From 1934896e6c7ff1e872170664a46833017c3d87d1 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 21:26:16 +0800 Subject: [PATCH 432/524] Update 31.Understanding Java Garbage Collection.md --- 31.Understanding Java Garbage Collection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 0add5c5..f1b0725 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -73,7 +73,7 @@ Bump-the-pointer technique tracks the last object allocated to the Eden space. T 其中,串行GC不能使用的操作的服务器上。这种类型的GC创建时有在台式计算机上只有一个CPU核心。使用该系列GC将显著删除应用程序的性能。 使用这种将很明显地降低应用程序的性能。 -现在让我们来了解没种GC的类型: +现在让我们来了解每种GC的类型: ###串行GC( Serial GC (-XX:+UseSerialGC)) From ab2dbfab1547c428384e16022e4bb1a458447d56 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 21:28:53 +0800 Subject: [PATCH 433/524] Update 31.Understanding Java Garbage Collection.md --- 31.Understanding Java Garbage Collection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index f1b0725..5314e34 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -78,7 +78,7 @@ Bump-the-pointer technique tracks the last object allocated to the Eden space. T ###串行GC( Serial GC (-XX:+UseSerialGC)) (The GC in the young generation uses the type we explained in the previous paragraph. ?) -在老年代中我们使用一种称为**标记-清除-紧凑(mark-sweep-compact)**的算法。 +在新生代中我们使用一种称为**标记-清除-紧凑(mark-sweep-compact)**的算法。 这种算法的第一步就是对老年代的幸存对象进行标记。然后,它从堆的从前往后逐个清理不需要的对象。最后对幸存的对象进行紧凑,使它们在位于连续的内存空间。这个过程会将堆分为两部分:一部分有数据,一部分没数据。Serial GC适用于小的内存空间和少量的CPU核心的机器。 From 4dd8e9d6ce5df5a77a2a10682b258cf61dbea992 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 25 Sep 2014 21:31:06 +0800 Subject: [PATCH 434/524] Update 31.Understanding Java Garbage Collection.md --- 31.Understanding Java Garbage Collection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/31.Understanding Java Garbage Collection.md b/31.Understanding Java Garbage Collection.md index 5314e34..51beb95 100644 --- a/31.Understanding Java Garbage Collection.md +++ b/31.Understanding Java Garbage Collection.md @@ -80,7 +80,7 @@ Bump-the-pointer technique tracks the last object allocated to the Eden space. T (The GC in the young generation uses the type we explained in the previous paragraph. ?) 在新生代中我们使用一种称为**标记-清除-紧凑(mark-sweep-compact)**的算法。 -这种算法的第一步就是对老年代的幸存对象进行标记。然后,它从堆的从前往后逐个清理不需要的对象。最后对幸存的对象进行紧凑,使它们在位于连续的内存空间。这个过程会将堆分为两部分:一部分有数据,一部分没数据。Serial GC适用于小的内存空间和少量的CPU核心的机器。 +这种算法的第一步就是对新生代的幸存对象进行标记。然后,它从堆的从前往后逐个清理不需要的对象。最后对幸存的对象进行紧凑,使它们在位于连续的内存空间。这个过程会将堆分为两部分:一部分有数据,一部分没数据。Serial GC适用于小的内存空间和少量的CPU核心的机器。 ###并行GC (Parallel GC (-XX:+UseParallelGC)) From b8cec2c85d46010a7f99926e6466af525b03a9ac Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 17 Feb 2016 16:48:28 +0800 Subject: [PATCH 435/524] =?UTF-8?q?Update=2006.Eclipse=E5=BF=AB=E6=8D=B7?= =?UTF-8?q?=E9=94=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../06.Eclipse\345\277\253\346\215\267\351\224\256.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/web\345\274\200\345\217\221\350\247\204\350\214\203/06.Eclipse\345\277\253\346\215\267\351\224\256.md" "b/web\345\274\200\345\217\221\350\247\204\350\214\203/06.Eclipse\345\277\253\346\215\267\351\224\256.md" index c818432..050af4a 100644 --- "a/web\345\274\200\345\217\221\350\247\204\350\214\203/06.Eclipse\345\277\253\346\215\267\351\224\256.md" +++ "b/web\345\274\200\345\217\221\350\247\204\350\214\203/06.Eclipse\345\277\253\346\215\267\351\224\256.md" @@ -98,6 +98,10 @@ ALT + UP 可以将选择的文本向下移,ALT + DOWN 则是向上移。 ALT + LEFT 为左切换,ALT + RIGHT 为右切换 +## 2.16 删除当前行 + +CTRL + D + From 6f58c4abb56b80c1c4d92dd3f54c168ce53d40b5 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 17 Feb 2016 20:16:08 +0800 Subject: [PATCH 436/524] =?UTF-8?q?Create=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" new file mode 100644 index 0000000..e0e5283 --- /dev/null +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -0,0 +1 @@ +# 32.迭代器模式 From 40eabc04a7e18a36c87c68cb6d43da42e7719c55 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 17 Feb 2016 20:17:09 +0800 Subject: [PATCH 437/524] =?UTF-8?q?Create=2033.=E8=A3=85=E9=A5=B0=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "33.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md" diff --git "a/33.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md" "b/33.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md" new file mode 100644 index 0000000..fd930a4 --- /dev/null +++ "b/33.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md" @@ -0,0 +1 @@ +# 33.装饰器模式2 From b28ee8c75de5f79867f605400a5455a286434d98 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 13:36:11 +0800 Subject: [PATCH 438/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index e0e5283..da4a6ae 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -1 +1,7 @@ # 32.迭代器模式 + + 在Java中的集合类接口有Set、List、Map、Queue,而这些接口的子类不计其数。以List接口为例,常用的实现类有:ArrayList、LinkedList、Stack、Vector。每个List子类实现的方式各不一样,ArrayList使用数组,LinkedList使用链表,Stack和Vector可以数组,甚至有些其他的集合类使用混合的数据结构。 + + 为了对外隐藏集合类的实现方式,保持良好的封装性,必须要统一这些集合类的迭代接口。同时调用者也无效关心集合类的底层实现方式,使用统一的接口即可对集合进行迭代。 + + 这不禁让人想到Java的`Iterable`接口,这也是迭代器模式在JDK中的经典实例。 From 237a6fe9471b1af77b19daa6d405e9418b178100 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 13:38:23 +0800 Subject: [PATCH 439/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index da4a6ae..c60aabf 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -1,7 +1,13 @@ # 32.迭代器模式 +## 32.1 从Iterable接口说起 + 在Java中的集合类接口有Set、List、Map、Queue,而这些接口的子类不计其数。以List接口为例,常用的实现类有:ArrayList、LinkedList、Stack、Vector。每个List子类实现的方式各不一样,ArrayList使用数组,LinkedList使用链表,Stack和Vector可以数组,甚至有些其他的集合类使用混合的数据结构。 为了对外隐藏集合类的实现方式,保持良好的封装性,必须要统一这些集合类的迭代接口。同时调用者也无效关心集合类的底层实现方式,使用统一的接口即可对集合进行迭代。 这不禁让人想到Java的`Iterable`接口,这也是迭代器模式在JDK中的经典实例。 + +## 32.2 ArrayList实现Iterable接口 + + From 21f26563f014eede4c8fd9406f000381f1e4e008 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 13:47:56 +0800 Subject: [PATCH 440/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\345\231\250\346\250\241\345\274\217.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index c60aabf..b29c818 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -10,4 +10,30 @@ ## 32.2 ArrayList实现Iterable接口 - +Iterable.java 实现: +```Java +public interface Iterable { + Iterator iterator(); +} +``` +Iterator.java 实现 +```Java +public interface Iterator { + boolean hasNext(); + E next(); +} +``` +ArrayList.java 实现 Iterable接口 +```Java + @Override + public Iterator iterator() { + return new ArrayListIterator(); + } +``` + +ArrayListIterator.java 实现 +``` + +``` + +为了减少类文件和易于维护,我们通常把ArrayListIterator.java作为ArrayList的内部类,或者在ArrayList的iterator方法中世界采用匿名内部类,这里我们使用的内部类。 From 52cac436380830e91ef32f20d1b2ce56c495ed42 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 13:52:46 +0800 Subject: [PATCH 441/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\345\231\250\346\250\241\345\274\217.md" | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index b29c818..a35fc77 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -19,21 +19,37 @@ public interface Iterable { Iterator.java 实现 ```Java public interface Iterator { - boolean hasNext(); - E next(); + boolean hasNext(); + E next(); } ``` ArrayList.java 实现 Iterable接口 ```Java - @Override - public Iterator iterator() { - return new ArrayListIterator(); + @Override + public Iterator iterator() { + return new ArrayListIterator(); } ``` ArrayListIterator.java 实现 ``` +public class ArrayListIterator { + int cursor; + int lastRet = -1; + public boolean hasNext() { + return cursor != size; + } + + public E next() { + int i = cursor; + if (i >= size) + throw new NoSuchElementException(); + Object[] elementData = ArrayList.this.elementData; + cursor = i + 1; + return (E) elementData[lastRet = i]; + } +} ``` -为了减少类文件和易于维护,我们通常把ArrayListIterator.java作为ArrayList的内部类,或者在ArrayList的iterator方法中世界采用匿名内部类,这里我们使用的内部类。 +为了减少类文件和易于维护,我们通常把ArrayListIterator.java作为ArrayList的内部类,或者在ArrayList的iterator方法中世界采用匿名内部类,这里我们使用的外部类。 From 7116a0fead27395f66b2a181d5754e998f8de153 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 13:53:21 +0800 Subject: [PATCH 442/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index a35fc77..787d19a 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -32,7 +32,7 @@ ArrayList.java 实现 Iterable接口 ``` ArrayListIterator.java 实现 -``` +```Java public class ArrayListIterator { int cursor; int lastRet = -1; From 9716459443d40f5c9875174e87810986956f4411 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 13:55:41 +0800 Subject: [PATCH 443/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index 787d19a..13a679f 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -53,3 +53,7 @@ public class ArrayListIterator { ``` 为了减少类文件和易于维护,我们通常把ArrayListIterator.java作为ArrayList的内部类,或者在ArrayList的iterator方法中世界采用匿名内部类,这里我们使用的外部类。 + +## 32.3 迭代器模式 + +**意图**:使用同一的方式遍历集合的哥哥元素,而无需暴露集合的内部结构。 From ad46c27a64966b615ea816afeb9328f0159f1701 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 13:56:36 +0800 Subject: [PATCH 444/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index 13a679f..485957d 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -56,4 +56,4 @@ public class ArrayListIterator { ## 32.3 迭代器模式 -**意图**:使用同一的方式遍历集合的哥哥元素,而无需暴露集合的内部结构。 +**意图**:使用统一的方式遍历集合的各个元素,而无需暴露集合的内部结构。 From 39d094575bf33e4a3198a6f6bdd9d4e1e8c49443 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 14:00:03 +0800 Subject: [PATCH 445/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index 485957d..d90f3c9 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -57,3 +57,8 @@ public class ArrayListIterator { ## 32.3 迭代器模式 **意图**:使用统一的方式遍历集合的各个元素,而无需暴露集合的内部结构。 +**使用场景**: + 1、为聚合类统一遍历接口; + 2、需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; + 3、访问聚合对象的内容而无需暴露其内部结构; +**类图**: From e59ea13e57439c053b9c36a7fecae9113c64ee30 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 14:00:21 +0800 Subject: [PATCH 446/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index d90f3c9..0a14828 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -57,8 +57,10 @@ public class ArrayListIterator { ## 32.3 迭代器模式 **意图**:使用统一的方式遍历集合的各个元素,而无需暴露集合的内部结构。 + **使用场景**: 1、为聚合类统一遍历接口; 2、需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; 3、访问聚合对象的内容而无需暴露其内部结构; + **类图**: From d8a12b649004c7b7b2911744d5d6e7d13984776b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 14:01:00 +0800 Subject: [PATCH 447/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index 0a14828..d4599fe 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -59,8 +59,8 @@ public class ArrayListIterator { **意图**:使用统一的方式遍历集合的各个元素,而无需暴露集合的内部结构。 **使用场景**: - 1、为聚合类统一遍历接口; - 2、需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; - 3、访问聚合对象的内容而无需暴露其内部结构; + 1 为聚合类统一遍历接口; + 2 需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; + 3 访问聚合对象的内容而无需暴露其内部结构; **类图**: From 70552b1668548f9b6f9ea05b48123f01fe24dbd9 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 14:01:41 +0800 Subject: [PATCH 448/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index d4599fe..a47f8e0 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -59,8 +59,8 @@ public class ArrayListIterator { **意图**:使用统一的方式遍历集合的各个元素,而无需暴露集合的内部结构。 **使用场景**: - 1 为聚合类统一遍历接口; - 2 需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; - 3 访问聚合对象的内容而无需暴露其内部结构; + * 为聚合类统一遍历接口; + * 需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; + * 访问聚合对象的内容而无需暴露其内部结构; **类图**: From 1767bf9528fbd4f3e2177dbe41f7d6b9716e931e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 14:01:54 +0800 Subject: [PATCH 449/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index a47f8e0..ac34534 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -59,6 +59,7 @@ public class ArrayListIterator { **意图**:使用统一的方式遍历集合的各个元素,而无需暴露集合的内部结构。 **使用场景**: + * 为聚合类统一遍历接口; * 需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; * 访问聚合对象的内容而无需暴露其内部结构; From 072ba4a5f929ae8cb154a0385f122ba1f936e8de Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 14:02:16 +0800 Subject: [PATCH 450/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index ac34534..aeceb2b 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -60,8 +60,8 @@ public class ArrayListIterator { **使用场景**: - * 为聚合类统一遍历接口; - * 需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; - * 访问聚合对象的内容而无需暴露其内部结构; +* 为聚合类统一遍历接口; +* 需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历; +* 访问聚合对象的内容而无需暴露其内部结构; **类图**: From 339b8582e4d507538dc746b45bb89a846372b7c0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 18 Feb 2016 14:03:52 +0800 Subject: [PATCH 451/524] =?UTF-8?q?Update=2032.=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" index aeceb2b..2238327 100644 --- "a/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" +++ "b/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" @@ -65,3 +65,5 @@ public class ArrayListIterator { * 访问聚合对象的内容而无需暴露其内部结构; **类图**: + + From dba433a3b4b7f2a698168679c1367b431cdff88b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 21 Apr 2016 17:16:02 +0800 Subject: [PATCH 452/524] =?UTF-8?q?Create=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" new file mode 100644 index 0000000..16c9b91 --- /dev/null +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -0,0 +1 @@ +#34.Java中的强软弱虚引用及其应用 From b8b3cdc1af91135b2f603ae5250c6f2882daa1b3 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 17 May 2016 15:33:09 +0800 Subject: [PATCH 453/524] =?UTF-8?q?Create=2035.Java=E7=9A=84Enum.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "35.Java\347\232\204Enum.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "35.Java\347\232\204Enum.md" diff --git "a/35.Java\347\232\204Enum.md" "b/35.Java\347\232\204Enum.md" new file mode 100644 index 0000000..08fac42 --- /dev/null +++ "b/35.Java\347\232\204Enum.md" @@ -0,0 +1 @@ +#35.Java的Enum From 61a7d8f233b673087055cdba99733da61faeb46d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 17 May 2016 16:38:49 +0800 Subject: [PATCH 454/524] =?UTF-8?q?Update=2035.Java=E7=9A=84Enum.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "35.Java\347\232\204Enum.md" | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/35.Java\347\232\204Enum.md" "b/35.Java\347\232\204Enum.md" index 08fac42..e64195b 100644 --- "a/35.Java\347\232\204Enum.md" +++ "b/35.Java\347\232\204Enum.md" @@ -1 +1,60 @@ #35.Java的Enum + +* 使用类常量实现枚举会有类型不安全,一致性差等问题; https://www.ibm.com/developerworks/cn/java/j-lo-enum/ +* Java的枚举类型是在编译器实现的,枚举类型会被编译成一个`public final`并继承`Enum`的类,所以枚举类型并不能被继承; +* 当声明一个`enum`,它会隐式地继承`java.lang.Enum`,同时在编译器会被转化为一个类。再者枚举类型的常量会被转化为一个该类的一个实例常量; +* 如果你在类的内部声明一个`enum`类型,则该`enum`默认是`static`的; +* Enumeration constants cannot be cloned. An attempt to do so will result in a `CloneNotSupportedException`; +* 由于`enum`内部是以类的是形式实现的,所以可以在`enum`的内部想普通的类一样添加成员变量和方法; +* 利用`enum`的特性可以很容易得实现单例模式; +* 利用`enum`的特性可以很容易地实现简单的状态机; + +源代码 +```Java +public enum RequestMethod { + GET, POST, PUT, DEDLETE +} +``` + +编译后反编译的代码: +```Java +public final class RequestMethod extends Enum +{ + + public static final RequestMethod GET; + public static final RequestMethod POST; + public static final RequestMethod PUT; + public static final RequestMethod DEDLETE; + private static final RequestMethod ENUM$VALUES[]; + + private RequestMethod(String s, int i) + { + super(s, i); + } + + public static RequestMethod[] values() + { + RequestMethod arequestmethod[]; + int i; + RequestMethod arequestmethod1[]; + System.arraycopy(arequestmethod = ENUM$VALUES, 0, arequestmethod1 = new RequestMethod[i = arequestmethod.length], 0, i); + return arequestmethod1; + } + + public static RequestMethod valueOf(String s) + { + return (RequestMethod)Enum.valueOf(RequestMethod, s); + } + + static + { + GET = new RequestMethod("GET", 0); + POST = new RequestMethod("POST", 1); + PUT = new RequestMethod("PUT", 2); + DEDLETE = new RequestMethod("DEDLETE", 3); + ENUM$VALUES = (new RequestMethod[] { + GET, POST, PUT, DEDLETE + }); + } +} +``` From 10e7149a27daaf575648d4789599f78e13e80f2c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 17 May 2016 16:47:05 +0800 Subject: [PATCH 455/524] =?UTF-8?q?Update=2035.Java=E7=9A=84Enum.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "35.Java\347\232\204Enum.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/35.Java\347\232\204Enum.md" "b/35.Java\347\232\204Enum.md" index e64195b..9526b8b 100644 --- "a/35.Java\347\232\204Enum.md" +++ "b/35.Java\347\232\204Enum.md" @@ -1,5 +1,7 @@ #35.Java的Enum +##35.1 Java的枚举实现与特性 + * 使用类常量实现枚举会有类型不安全,一致性差等问题; https://www.ibm.com/developerworks/cn/java/j-lo-enum/ * Java的枚举类型是在编译器实现的,枚举类型会被编译成一个`public final`并继承`Enum`的类,所以枚举类型并不能被继承; * 当声明一个`enum`,它会隐式地继承`java.lang.Enum`,同时在编译器会被转化为一个类。再者枚举类型的常量会被转化为一个该类的一个实例常量; @@ -58,3 +60,4 @@ public final class RequestMethod extends Enum } } ``` +##35.2 Java的枚举与C#枚举的异同 From 8353ef69abdf08f3853652eb63735362b82ed0cb Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 17 May 2016 16:48:34 +0800 Subject: [PATCH 456/524] =?UTF-8?q?Update=2035.Java=E7=9A=84Enum.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "35.Java\347\232\204Enum.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/35.Java\347\232\204Enum.md" "b/35.Java\347\232\204Enum.md" index 9526b8b..12cd303 100644 --- "a/35.Java\347\232\204Enum.md" +++ "b/35.Java\347\232\204Enum.md" @@ -61,3 +61,6 @@ public final class RequestMethod extends Enum } ``` ##35.2 Java的枚举与C#枚举的异同 + +http://stackoverflow.com/questions/469287/c-sharp-vs-java-enum-for-those-new-to-c + From b1d3d54cac968b72cea54c417b01f7a8025eb079 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 20 May 2016 18:07:19 +0800 Subject: [PATCH 457/524] =?UTF-8?q?Update=2035.Java=E7=9A=84Enum.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "35.Java\347\232\204Enum.md" | 52 ++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/35.Java\347\232\204Enum.md" "b/35.Java\347\232\204Enum.md" index 12cd303..4a16d78 100644 --- "a/35.Java\347\232\204Enum.md" +++ "b/35.Java\347\232\204Enum.md" @@ -60,6 +60,58 @@ public final class RequestMethod extends Enum } } ``` + +##35.2 枚举实现单例 + +##35.3 枚举实现简单状态机 + +```Java +public enum State { + Born { + @Override + void process(Object prams) {} + }, + + Walk { + @Override + void process(Object prams) {} + }, + + Run { + @Override + void process(Object prams) {} + }, + + Attack { + @Override + void process(Object prams) {} + }; + + abstract void process(Object prams); + + public static void main(String[] args) { + Player player = new Player(); + player.walk(); + player.attack(); + + } +} + +class Player { + public State state = State.Born; + + public void walk() { + state = State.Walk; + state.process(new Object()); + } + + public void attack() { + state = State.Attack; + state.process(new Object()); + } +} +``` + ##35.2 Java的枚举与C#枚举的异同 http://stackoverflow.com/questions/469287/c-sharp-vs-java-enum-for-those-new-to-c From 068071732f3c85920fff1e0b76fd4850ca3d0414 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 20 May 2016 18:52:58 +0800 Subject: [PATCH 458/524] =?UTF-8?q?Update=2035.Java=E7=9A=84Enum.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "35.Java\347\232\204Enum.md" | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git "a/35.Java\347\232\204Enum.md" "b/35.Java\347\232\204Enum.md" index 4a16d78..9688a67 100644 --- "a/35.Java\347\232\204Enum.md" +++ "b/35.Java\347\232\204Enum.md" @@ -63,6 +63,15 @@ public final class RequestMethod extends Enum ##35.2 枚举实现单例 +```Java +public enum MySingleton { + INSTANCE; + private MySingleton() { + System.out.println("Here"); + } +} +``` + ##35.3 枚举实现简单状态机 ```Java From 54f62174d55bc71dc5cfb3fbeeaf111fe1506e97 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 01:36:20 +0800 Subject: [PATCH 459/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\217\212\345\205\266\345\272\224\347\224\250.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 16c9b91..4c1fd5f 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -1 +1,9 @@ #34.Java中的强软弱虚引用及其应用 + +##34.1 强引用 + +##34.2 软引用 + +##35.3 弱引用 + +##35.4 虚引用 From eba413a8e3b7147de8ce1bef242de5cb0e10f7ad Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 01:48:24 +0800 Subject: [PATCH 460/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\217\212\345\205\266\345\272\224\347\224\250.md" | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 4c1fd5f..993ca2f 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -1,9 +1,17 @@ #34.Java中的强软弱虚引用及其应用 -##34.1 强引用 +##34.1 强引用(Strong References) + +强引用是使用最频繁的引用。例如: +```Java +Object obj = new Object(); +``` +如果一个对象有强引用,则垃圾回收器不会回收它。即使JVM内存不足,也是抛出`OutOfMemeoryError`来停止程序,也不会通过回收强引用来释放内存。 ##34.2 软引用 ##35.3 弱引用 ##35.4 虚引用 + +##35.5 幽灵引用 From 49c7eabcefbee7af128bd004e9b771262af3232e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 01:50:06 +0800 Subject: [PATCH 461/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\217\212\345\205\266\345\272\224\347\224\250.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 993ca2f..a8577be 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -8,10 +8,10 @@ Object obj = new Object(); ``` 如果一个对象有强引用,则垃圾回收器不会回收它。即使JVM内存不足,也是抛出`OutOfMemeoryError`来停止程序,也不会通过回收强引用来释放内存。 -##34.2 软引用 +##34.2 软引用(Soft Reference) -##35.3 弱引用 +##35.3 弱引用(Weak Reference) -##35.4 虚引用 +##35.5 幽灵引用(PhantomReference) -##35.5 幽灵引用 +**幽灵引用**又叫**虚引用**。 From 39123dfcc525b6ec65166ed4d97eb320c198fb66 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 02:05:18 +0800 Subject: [PATCH 462/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...12\345\205\266\345\272\224\347\224\250.md" | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index a8577be..455cd4d 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -10,8 +10,28 @@ Object obj = new Object(); ##34.2 软引用(Soft Reference) +如果一个对象只有软引用,则在JVM足够时该对象不会被回收,而当JVM不足时就会回收该对象释放内存。 + +```Java +SoftReference obj = new SoftReference(new Object()); +``` + +软引用最常用的应用场景就是用来做缓存。 + ##35.3 弱引用(Weak Reference) +只具有弱引用的对象,在下一轮GC时,不管JVM内存足够不足够,都会对它进行回收。 + +```Java +WeakReference obj = new WeakReference(new Object()); +``` + ##35.5 幽灵引用(PhantomReference) -**幽灵引用**又叫**虚引用**。 +**幽灵引用**又叫**虚引用**。 幽灵引用十分诡异,因为它的get()方法永远只返回null。 + +``` +PhantomReference obj = new PhantomReference(new Object(), new ReferenceQueue()); + +System.out.println(obj.get()); //null +``` From 9c21994214d0c5f61afc8db82a5ad2720ff2d6eb Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 02:06:06 +0800 Subject: [PATCH 463/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 455cd4d..96b3808 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -30,7 +30,7 @@ WeakReference obj = new WeakReference(new Object()); **幽灵引用**又叫**虚引用**。 幽灵引用十分诡异,因为它的get()方法永远只返回null。 -``` +```Java PhantomReference obj = new PhantomReference(new Object(), new ReferenceQueue()); System.out.println(obj.get()); //null From f147e5b48ac982b38322d6d87c6371fc47d5bc5f Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 02:07:31 +0800 Subject: [PATCH 464/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 96b3808..f6898cf 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -26,7 +26,7 @@ SoftReference obj = new SoftReference(new Object()); WeakReference obj = new WeakReference(new Object()); ``` -##35.5 幽灵引用(PhantomReference) +##35.5 幽灵引用(Phantom Reference) **幽灵引用**又叫**虚引用**。 幽灵引用十分诡异,因为它的get()方法永远只返回null。 @@ -35,3 +35,4 @@ PhantomReference obj = new PhantomReference(new Object(), new Re System.out.println(obj.get()); //null ``` +幽灵引用有什么用? From b40893cc548335c6f8f295ca75f978ee0f32de35 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 11:42:08 +0800 Subject: [PATCH 465/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...24\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index f6898cf..e6098f2 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -36,3 +36,7 @@ PhantomReference obj = new PhantomReference(new Object(), new Re System.out.println(obj.get()); //null ``` 幽灵引用有什么用? + +##35.6 强可达、软可达,弱可达,虚可达 + + From 252a0d588a455f385ca9b737fff4b8a814f24e5b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 11:46:52 +0800 Subject: [PATCH 466/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index e6098f2..3ee51ed 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -39,4 +39,9 @@ System.out.println(obj.get()); //null ##35.6 强可达、软可达,弱可达,虚可达 + * Strongly Reachable – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. + * Softly Reachable – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. + * Weakly Reachable – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. + * Phantomly Reachable – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. + *Unreachable – If we do not have any of the above references to an instance, then it is unreachable from the program. From 9f7eb1e46d0ce8da17cc2c685d49f275d4e7c43b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 11:50:53 +0800 Subject: [PATCH 467/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\217\212\345\205\266\345\272\224\347\224\250.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 3ee51ed..438724c 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -39,9 +39,9 @@ System.out.println(obj.get()); //null ##35.6 强可达、软可达,弱可达,虚可达 - * Strongly Reachable – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. - * Softly Reachable – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. - * Weakly Reachable – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. - * Phantomly Reachable – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. - *Unreachable – If we do not have any of the above references to an instance, then it is unreachable from the program. +* Strongly Reachable – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. +* Softly Reachable – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. +* Weakly Reachable – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. +* Phantomly Reachable – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. +*Unreachable – If we do not have any of the above references to an instance, then it is unreachable from the program. From e11368a9b490d84b0439ecf81511508483143a63 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 11:51:22 +0800 Subject: [PATCH 468/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...24\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 438724c..d32f67f 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -40,8 +40,8 @@ System.out.println(obj.get()); //null ##35.6 强可达、软可达,弱可达,虚可达 * Strongly Reachable – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. -* Softly Reachable – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. +* Softly Reachable – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. * Weakly Reachable – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. * Phantomly Reachable – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. -*Unreachable – If we do not have any of the above references to an instance, then it is unreachable from the program. +* Unreachable – If we do not have any of the above references to an instance, then it is unreachable from the program. From 4d3143501f5f53dc32ebbe05f1384d4a1872cd39 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 11:59:33 +0800 Subject: [PATCH 469/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index d32f67f..04bf05d 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -39,7 +39,7 @@ System.out.println(obj.get()); //null ##35.6 强可达、软可达,弱可达,虚可达 -* Strongly Reachable – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. +* **强可达(Strongly Reachable)** – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. * Softly Reachable – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. * Weakly Reachable – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. * Phantomly Reachable – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. From 53ee881962a2521d65c79c5d5a5fedefea0fc83a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 12:00:54 +0800 Subject: [PATCH 470/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\217\212\345\205\266\345\272\224\347\224\250.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 04bf05d..6651786 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -40,8 +40,8 @@ System.out.println(obj.get()); //null ##35.6 强可达、软可达,弱可达,虚可达 * **强可达(Strongly Reachable)** – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. -* Softly Reachable – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. -* Weakly Reachable – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. -* Phantomly Reachable – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. -* Unreachable – If we do not have any of the above references to an instance, then it is unreachable from the program. +* **软可达(Softly Reachable)** – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. +* **弱可达(Weakly Reachable)** – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. +* **幽灵可达(Phantomly Reachable)** – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. +* **不可达(Unreachable)** – If we do not have any of the above references to an instance, then it is unreachable from the program. From e1146b7c15416f2524f66e124ac29b01640b9860 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 13:50:19 +0800 Subject: [PATCH 471/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 6651786..d6e98dc 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -45,3 +45,5 @@ System.out.println(obj.get()); //null * **幽灵可达(Phantomly Reachable)** – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. * **不可达(Unreachable)** – If we do not have any of the above references to an instance, then it is unreachable from the program. + +http://blog.yohanliyanage.com/2010/10/ktjs-3-soft-weak-phantom-references/ From de643dc10a4be91f9deb3c95712b9e048dce9016 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 17:27:36 +0800 Subject: [PATCH 472/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index d6e98dc..89f6f5c 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -39,9 +39,9 @@ System.out.println(obj.get()); //null ##35.6 强可达、软可达,弱可达,虚可达 -* **强可达(Strongly Reachable)** – If we have a strong reference to a particular instance, then it is said to be strongly reachable. Hence, it is not eligible for garbage collection. -* **软可达(Softly Reachable)** – If we do not have a strong reference to an instance, but we can access the object through a SoftReference (more on that later) to it, then the instance is said to be softly reachable. -* **弱可达(Weakly Reachable)** – If we have neither a strong reference nor a soft reference, but the object can be accessed through a WeakReference, then the instance is said to be weakly reachable. +* **强可达(Strongly Reachable)** 如果有强引用指向实例,这称该实例具有为**强可达性**,垃圾回收器不能回收强可达的实例。 +* **软可达(Softly Reachable)** 如果没有强引用指向实例,但同时我们可以通过SoftReference访问该实例,则称该实例具有**软可达性**。 +* **弱可达(Weakly Reachable)** 如果没有强引用和软引用指向实例,但同时我可以通过WeakReference访问该实例,则称该实例具有**弱可达性**。 * **幽灵可达(Phantomly Reachable)** – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. * **不可达(Unreachable)** – If we do not have any of the above references to an instance, then it is unreachable from the program. From 40f9897e9af61e8b567cedca6322703b43cd2943 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 17:30:35 +0800 Subject: [PATCH 473/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index 89f6f5c..a85c74f 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -39,9 +39,9 @@ System.out.println(obj.get()); //null ##35.6 强可达、软可达,弱可达,虚可达 -* **强可达(Strongly Reachable)** 如果有强引用指向实例,这称该实例具有为**强可达性**,垃圾回收器不能回收强可达的实例。 -* **软可达(Softly Reachable)** 如果没有强引用指向实例,但同时我们可以通过SoftReference访问该实例,则称该实例具有**软可达性**。 -* **弱可达(Weakly Reachable)** 如果没有强引用和软引用指向实例,但同时我可以通过WeakReference访问该实例,则称该实例具有**弱可达性**。 +* **强可达(Strongly Reachable)** - 如果有强引用指向实例,这称该实例具有为强可达性,垃圾回收器不能回收强可达的实例。 +* **软可达(Softly Reachable)** - 如果没有强引用指向实例,但同时我们可以通过SoftReference访问该实例,则称该实例具有软可达性。 +* **弱可达(Weakly Reachable)** - 如果没有强引用和软引用指向实例,但同时我可以通过WeakReference访问该实例,则称该实例具有弱可达性。 * **幽灵可达(Phantomly Reachable)** – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. * **不可达(Unreachable)** – If we do not have any of the above references to an instance, then it is unreachable from the program. From 88abc095bd98d4f2c03c2fda2ea24a5a18abbfb8 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 17:35:12 +0800 Subject: [PATCH 474/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index a85c74f..a930d57 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -41,9 +41,9 @@ System.out.println(obj.get()); //null * **强可达(Strongly Reachable)** - 如果有强引用指向实例,这称该实例具有为强可达性,垃圾回收器不能回收强可达的实例。 * **软可达(Softly Reachable)** - 如果没有强引用指向实例,但同时我们可以通过SoftReference访问该实例,则称该实例具有软可达性。 -* **弱可达(Weakly Reachable)** - 如果没有强引用和软引用指向实例,但同时我可以通过WeakReference访问该实例,则称该实例具有弱可达性。 -* **幽灵可达(Phantomly Reachable)** – If we don’t have any of the strong, soft or weak references to a particular instance (which has not been finalized), but, if we do have a PhantomReference (explained in a while) to the instance, then the instance is said to be phantomly reachable. -* **不可达(Unreachable)** – If we do not have any of the above references to an instance, then it is unreachable from the program. +* **弱可达(Weakly Reachable)** - 如果没有强引用和软引用指向实例,但同时可以通过WeakReference访问该实例,则称该实例具有弱可达性。 +* **幽灵可达(Phantomly Reachable)** 如果没有强引用、软引用和弱引用指向实例,但同时可以通过PhantomReference访问实例,则称该引用具有幽灵可达性。 +* **不可达(Unreachable)** – 如果通过以上方式都不能访问实例,则称该引用不可达。 http://blog.yohanliyanage.com/2010/10/ktjs-3-soft-weak-phantom-references/ From 10c0e242986e394b813d3ccdb9fc28548d86dfce Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 23 May 2016 17:36:34 +0800 Subject: [PATCH 475/524] =?UTF-8?q?Update=2034.Java=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E8=BD=AF=E5=BC=B1=E8=99=9A=E5=BC=95=E7=94=A8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=BA=94=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" index a930d57..ddd1b8d 100644 --- "a/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" +++ "b/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" @@ -45,5 +45,6 @@ System.out.println(obj.get()); //null * **幽灵可达(Phantomly Reachable)** 如果没有强引用、软引用和弱引用指向实例,但同时可以通过PhantomReference访问实例,则称该引用具有幽灵可达性。 * **不可达(Unreachable)** – 如果通过以上方式都不能访问实例,则称该引用不可达。 +## 参考文档 -http://blog.yohanliyanage.com/2010/10/ktjs-3-soft-weak-phantom-references/ + * http://blog.yohanliyanage.com/2010/10/ktjs-3-soft-weak-phantom-references/ From 43a43b867dc1b245ff985a7d5493a10c2fe3d648 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 25 May 2016 21:20:25 +0800 Subject: [PATCH 476/524] =?UTF-8?q?JVM=E6=80=9D=E7=BB=B4=E5=AF=BC=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JVM思维导图 --- Java-Virtual-Machine/Java Virtual Machine.mmap | Bin 0 -> 86768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Java-Virtual-Machine/Java Virtual Machine.mmap diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap new file mode 100644 index 0000000000000000000000000000000000000000..bbd345bfd75ccc26cacaa4344ba37bcbb89946a3 GIT binary patch literal 86768 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 V0Kl5D0r&t26bueSAdkY}{{an5mX-hj literal 0 HcmV?d00001 From 27c2c45607cbf459d67f606c2496fe9337daf0ef Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 26 May 2016 02:09:10 +0800 Subject: [PATCH 477/524] =?UTF-8?q?GC=E6=94=B6=E9=9B=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java-Virtual-Machine/GC.mmap | Bin 0 -> 89254 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Java-Virtual-Machine/GC.mmap diff --git a/Java-Virtual-Machine/GC.mmap b/Java-Virtual-Machine/GC.mmap new file mode 100644 index 0000000000000000000000000000000000000000..ea75e5a9549463fb12e91873ccb67aa1278ec71e GIT binary patch literal 89254 zcmdpcV~{36*Jaz*wC#S{Hl}UcwmEIvnzn7*wr$(?&VCykvEPr4*!}xvWMpPk-HOb6 z;@+yPlSf_(6buar2nY%YB)(0Y$3^iM3N8>(^g0j_91s9Z*v`ns#>Cc{&fUgZMp9e? z?4Knxu(`9dJr_N_laaZJje!%LjfJhTrHM10k(~{_%)haWfvtg=i6gzRiM6uQ?Y^_Trt>vSZ7l z`ymr-0!Ky|#xg@opDQ&Q0Bmo;_uHxM2%PC!#~FYr9KO$lHsGZ1;eYVU=i$BQd%{Zj zPBDxcd$W;HCG}U_Hvee=5y~ilK4^*@fXXPT5Ib{7YYHG+!<|S?P5lMO*NaC3P5_TH z5T07Pe=nq)5RocP&X@%WAfu~eNnL}OS4=mPA#%sd=b(lJORP{gK4l^6Th3qrV{EAq zf9M}{+3f`S1M>^~&wjsxzo|ty-P5u>a;zm~>V%ZZ0}B0N5}?$Axlyz?PL05=Cv_ts2`lbUkG!u?J>0LKoSfK4C_-0r|>TrE$G zD~H2O8lr`zb>Q}y5pzgr6by7!-i;K93*jM?t{X29X!C9;@@JSBGhpbdR!@h5-1mx? zt>9m*U{y(RZ>tkatn47{qzg@kR=0G_0(+i6okgi&lkw_BkicpJ`PdD-JSVSq6QlKl@ z#wupNJ(Ji2Wll+k|{edK#4!ifdg5SYzbg7ho(I z@aL2trS=gxxu3reSg1Q})Rf0Dby>GjedQMsvpiSD zRW97KiC{vTqS7GL4sj7MA;wj@>McxqxzAj*3`(e>LR+hZ5?ze2>$lacBWqZSSjR(X zz!JPfAoI5JFhCYbWeBTSvlV1$7_z>3tTO?T4h;4br&xmHm|;*>0K@uyQf^Zj(p2}6 zmQ`K?IyoaH9G`lQ*uCEKEpGIfIjRUt2itiLZZ72Fw$Ip%Mu#fMq&U3%1uY$Qk8xEc zxonicJ4~E{&pMbcAm4f;y%dO$a{ENNrK<2c4?TjK1Py@Miw4a(b^z8avZAgwLbD8r+2;M zt4ALtzY)$T)Ot&<@A`?4LSabG7WX(_X%>TtjH1Uf_|O}-3r=3Z%7@orkd01&qtn=y z*nQbPg6RUQP70ad^vO|?N5seR8&uYEvq#C-$LQwnBXow3*WKRj=b^=Ag@18w*w!?1 zg6yrW`8+F)w4Ro3|%;-afa48;j6e*eb5f-glr*=^11P z0q*y$#lb;^nOsO((~^33CM$8U{-D}X0%kZ`)-TQpd-BIqhu)2EA*T-E zz>o?JV)>dhuTE*#NzQf8+u@}}J>!6%G=veGxRwoM;T2H}y@1utV(appIi^&e75L^b zSwf2AEXrgwGiG}{GMW|$6d7S-)lJiT^vlIg*Q`w6OvB+dzi)ZhA^w}+vJ)IU8gaTI z9G|vTUtOkp4X*3Q}#o9$2RvZED2^%80T znctKnaLpb*SPL;3va%3O^KKb(ux*fj26|3?oOH@TihXX}==+xIxPL?PCGH*PrgwwS zgC)D?d9gk7248%IX+qS11xdv`!r5&rhy+1Fm)wE+1N23J+BUgKkh%TJIleBA>yS>@Kl38j>aSU%-^vXQ}_?`?u-e7%(^Rwp=u z>Iags_SeUP)vHed)S@5;$_qk{)$k`CaACHj0d^kz0JykiA$@LzaPyvN1DDyhOnotOfs@M&`D^18i0?#n{V9b~Qk#>1}pvfDP_{Fl(na^!!l zR(T5$?Q}oyKizKmw@6V%Om)xJZl$KLniP=?#-!~V#!cD09$1_sGcrW^uWIQ!i*W7`kXoFMM3vw`F+t;tCH*FV@p#Us@x#-8 zHw3UJ?(}yq+53-5VVU_;7bONg<3BwYHyBPPQgsT%4LzpBmi}cA=Db&P1AEnfiGEMa zK|`5m2dSKPGsQ;Z_E&EJ_OLt1*y z{Av3r@_FZDHbmegTU6cGPOc+{`z4vgq_BL5C zcVJNQP_U1;H?J{fhA>>)$V_HvTqV4pzcaa43?m`hxWg%kENF~6HhfSx)k>>rQ;k`# z@V6xO;gZ_~`|DKnE3$^r#!W7FFR29UPJUVKF`^G2d3o~K-3itu46_IOes%IJA8TT? zf+m>r-`De^#8a+@y=!pzfF?9&Yl(4k6?}CvA1{^qZZKs=Pf&mg%{hpskv_rOWIt*Y z>VxBKktA%TvvmYj(5ozgKVdWwXkr>U_xL&j9d)kNyXt!zuhexMqSec z#dk*HN5%Kv>1#Mt2Rigd*UIbu)Ez-3a3*)zw56+h)sGw(yoK1Q`+Q$oC zS}38*-n!)54PyGQEx%?(+Z%kZpJA5s?RL!)G&iSUGp?E@5Af{ZQ(DaZ&wHT{)^!C9 zys665_!cHR8kGJAa@)X1r7+rVQzu46nf=d)D4p^TWi%agm}benpN@~=?Z^w6^cA_$ zSbB_Xf*CYKWC)XvMHOufuwID}Br-HOVJyG=^y;_!sH4Gd%Qn^0L92{8?Y#D^!N9sg z!l8uqo6kLuiq^AyMMq$IaQ6y_64gfTV{?Cmp3i2VhXDkN>z`Zswej_?&w_*Z7ofCk zB({k^ZH8!lrfFch0rm^~n%(tWGc8WaPdlDoc)GZoZvyN=wP|V|z3Z+^@lX_}0d<}6 z2&yudG1?g?Y!MYV&d+J5kTa7LA<&S)FfpIQT!yG?&a65vo|eU&FtgtTIsIq)|MDSM zsa#9g&DGsdcFu6xv_6CM%AR|fIzHmEX-esjEf3G<^VRUqwpwL8{$M${c%!*NFhF%Q zPG5#aYt@<#PVym&nWtOT_eAq6uta`^i@PKDVl|w68nxl!AnKKps0deZzX)7`=`$4Z zOOCgN6ya}XX2t;3;}fXt_b`N+S#xs~U1ALoZW@>!Vs%kw9Vc~e{m^O0`-IjX;J_)| z>XK6H%r)xQPH;eTQ+j@j1GdZ5T-D>=6OJ7l-?G>5-8tveRwHL0KwS5qrSJv%?1W^| z#$NMeYK2-XTzCNxJzY$kT&`sLHll7a=7G{PIf*B}tfQ zQPLXN2sUD`wjnx4r+QMOhr8&6%SqLMvHHdv+H|UiS)t^ew}uKqTd}8PZA5=3ix5%<97J~ z4?9(qIDeElebo5O_BR#P1GvLI--|%lzZd(|J`hsqb{fpE>qBw*Ri^%q6>$eg@x}TK ztTX(2R^I0G)V;Isbr>Mr z83Jx{n`_S5&*hGRs(Vuf!qHOWOv`P#z=0J6( zv#hZY38TG{p=rhe@G}aLD6*=}u6HaN)t+ICFHi{p7NHXKu5Z)YgD{a#<=tRc^;3rM zBRNGQoymm4s|GHLH90@)!a-XyqW=XU9*grQ>}vf_$I9YPHIoCdU;I4UZhHUXjM4(s zQdoV#;fs2m1P-_QO3d^V9$%vmCCj*T?T8)Lo*i||I^t;??35ccLl)HloDUVyEPc`Y zm*QfK{My;)d`c6}L2^u9Ek1>l;S0)`p({uB-9csiA47i|1Mg;ovxLktZlE z6tw{&=I9mr02y@MS_*-zFG^jZW2rj3+q2In0=7>`M+yZf=RuP8h6~h*pawkvH+~oEV_=yua}vZiOXJaHt;e)G)QW^orwd9KET3sCp-sx)DY0DF z;>{YZ&6rY$amcQ2@!dZv^x`M;F8mk}AL$o608wnvl6*AGJ0MP_wELyQRO*d*ExuKbdDaWrFf7y5P^LNP>EiFiE z?bEO3Z{cR$tFvJ5p4yw52=AO;I=H2e75q?JSGluC6w?K9tG8=1FcSq4lL*TB zwG9G()y0pNZbX*m<-{O+Q`gGSp@C_E92O`kcs-Tn^R9usiRtzO=Q|XGhd>c0?{Ish zSVTgNEsakW-3RV7?06R-UpZV-VG5F;gAW7xfRL&IBGC_ms|~JT1mNT*kla2`=|!)AO3n_Ui$!EMRzvPqi7)lU{?+`Oh=DKQ4ofi*&GGMtr%v1jH zFVZ@XcqT|(hpf%Jc*$MR*9piKz&9rl;ycH@!XlXefO75^bB;}j(0X`Ed{)U(0A|%h zZecX@i^YFK2X~h&MMw@04~gBy;$l8qeR6Hv@-tQQ^m(#K1tbZWMj_6-XxdeL3~)o~ zka5zEfiO5%lQRdCWXnYej4d1YKA$ja4x%V(3#&A3pcP!p-6>)r9g~4D+~yIYO4tni zL|)a`3N;!%>h=o(*xm>e`KfG2=H?+rzrOc{wD@39SD&R!mrDcV~HUh{M3g^!s z(r+#(RWWB4q>Cx=*pM{IBdnIGT{D&WS#+)vzoE@lJ3f_721}iZC@2StF*7w>bA&kj zSFvxqzXYr5br>7+p4jmmpyWgLOPe{KvN8$sBYyK)>#Lu1`1C@I0#@FtQe^IVHb{jB z=8hOctPvq9uE zPF~@b#qR16AawlCbJd~v}h}?X%dt??ZM{v!% zz2*5?^2N`$^>Zn5@SQcBO7CkU->vj@Df%^jFnpc*G2>It@1^^*Pw+HixAfEbVfEV# zrR!yXeS6_zE5~5<=kuy-#O>wV!7k{UO$!ZOKte&nWEiL}7w%l8bA1NzU-VnG8-zAS z-rWr~q6)_pY^u0Fo3ijbO3A2(Rl-btQrxs2Q<~41hj8QizY`K6zBYr zRfxHOWQeLuW^+QOQNsMZFPE)>7{o$eAZ1o`K?A(qF713F%u1`d5(O*)3(F! zA!57>D8X4SPJgGQK2s?6DFpX-`@RAp*&lIhaur~e(lctO(%tbB{8nU z*lnyu`#|)m-1(BwgVdj*eq$h>E)X9KT@5gwSF_L8j5^*vcp)c{VSN>jQLmX-%SWwi z)rjF7z$YQcWG6+6PT{0I_5DZiDH$@nH^S&B*qeNOol(c z-zc3nMF=@H9V*M)Be^HJzDr9W;?=fF&Z(#6Z>F~fuzz!r!BokSXEl3FZ0v*6iNtF` zkufsHKa&E`YcRraH`{jHFCw~+tArAayLV+kgky$1JSqUI`GPVb4@Zcea<;O3`CwAa zx#uMjL+4ZyuErz7#3C8sA}HUQ(fy7WK_u1D$scufo_3m){Q@CMU&tL6F5m-tTeY*c zd4zG5Tfb-uL2+cai^7>-j`hxacCs+w0@9~@a>VCiOYkCX&7m#olVGfc2V{%=hVD&= zah?CsOESeVz8~cdE-)&QCnjuU+3DBs6WbdP5Rh zXG~&twYJMOPzf6DRz9Lz?4)CYOA<^eQ@Bhx?!QrRT(~;@K?JM0vyPl+$-r6mjw;+P z5czU&V^la3L46`jDAfNhLq>pPR2l;V8*q@zkE*Zr@e{N|!+mgu^4!il3>a{t(UR?$5d=)L3 zx)@zHE`7RN-3;A$R^$x|p+Q;nN+=^pE3EWQ(4Wio5U5PdavKfvG}SdxWn9(C%>P{{ z?Z21hz`wWL<7Bn{Df`FnlAM&a*o187Oc*_*r-eA%F6*L}8P=oJRH5K6U!jzvTd^IB zG}U_kUAnbPbir(xZW_VKFkelcGE@+DJw)Nba$1k9#Avq>A-}3~={5p5Y_zeAfWr1e zM1t(cs(TnqMKU(a@eDt|#njOxO@bR83lA!hvDf#K!wRg=8XC5}TxxuEaW9lIM@(|9 z4qQ8HaQGjCYnICz@V{jHYW6s~{G4@NFTbcVlX}A);+y#_{Q^yi3Ka;LcA-9QRCh`T zV_TZO;9DeD-0Nt@VRNFjhis>scv4w#8QwW$$IKv+=D} zeA8oM`}M2AJxM=v4O@aj`|o5iSbuvScoqKB4wv^2MPXL=H=^vXjSk9>X8NXP)$VWK ze`kb0KcGPJ|4nDWGBK%}0|Ep@0S5$x`Om`L$@u@24*ZvLfbQSLD^(r24F)vtoW>u0 zj~Nyd@dagMBv3|`0Dtwh=ksCqzR|ise)G4Nj_^b_sxei}fYdVjv8S$+Y|j`xw;%g7 zDM!R%m@30|ZfqqG>N)LFK=De$Le@-@`UsktB28G?{NwHJSI1Y;5o*S!z;u`qIp|CD zkv?pS{&cj{5NSkzJ>HSfotAxp@W~t}Uk>vS6T=*|_(*>2!5#i{Qe2>8$@(Eh9232c z^bJoUF?uhR!88`*3j!CkZj<6Nvln*sT}y`%W#3*>7U2qd*^nWl=4Eu_*!XnET+Ktn z4f+guTI%S`UqWSyb!#2(O8B7tKuOv7U+WzC*?>dru%JceEC#jkJL4cqdjm-eHG@Uq zN=j0I86vncoRKDc?DAw4GeB@I^G-m58ZD8L)z2V43CbDB(c~P)K7xDCmoNLmvUBvbR^4pUo;!OGAi zUkw8XIET6gniuFvNjxS6jyOfLtP&EiKI=0YMKVo)+!EKip1dB6C_PT}W)){tg`3@p z6iCLGIubUiApwp!KuQ?m5{bWil2@!iu%6ye#{7z+t}O^tEN%VK)`s?!m*o6czI3=~ z4jl7kHuA~6?w3umT0f6z{d^1eQh`k_2cV?p* zX*fGu@xcn?YsFmm>y2$sM>2;^5YlT#2dGKS`8CdmrW*oEC2R*uTqbP>d(H9sL2z$N zCy#6|xu|k#|MSb&!{C+dGKMR!F3oy@{bGPcam6Gl)O}K!jAprTf6{MX>mO#O;5a65Hw+;Yh27NWme&hLL0hlx+!T`{1-; zc=mUXl79_xKBtxQz*Cijp!_DJ8VAymCB#yemb7YhCOi1Glkyy1vIg`QAA;MP}{I2?F3 zJUAI#lfHJ;(Kv`BUmySk7#IQq3W*Syb5`&v-fkjpFwFT!&Lg4L4};DqwsP+oD)~q0 zyk`WN2)NQ9%)?lmSoqJ+f~6vZAI0(_tAzWQUjEMzP#CYu zT{6hQ&v!~1C@z6j;8tRuqGND^;*Npkr?vp)8HDp*LX|Y{7T-UDRbSdtT{~XX2UU{X zF-)u}i+FCWR=|TF3iBIX@eC3HF`u6bOuz&vrQI=fcf&2<(NB@+wThoukysq_YbIt+ z;%vJ?_D+P|Cuaf4(7v_nYu6j&9nVrl*?Yu)QmxxA4+cd}SQ`gxN^f(p*RyV+GbCaz zN@ffzznk-@2I(8 zo1lM}+<|N2FLVAk`wl@ou#AuSI+Zq$fULz3rAHK^go?={LCI0@A)6=8)z?P>v4+#N z)wkzKcOdv`L3{XM!iREgb@~+^ZC$OPAuiP+3qJna#~b=A*l;LNd))8%0|Dpl0yRSr z&5g=Q3((pcAv0D1EFwR(=Fca|a`=#ySImheEv|~>7>_Y9RHZ}-E7lwwayGdSI`vpI z9+d}%W}bW)FlbaHxOFSaS0PKq| zR>g#xkgT|VKR3T|VVO+#T$Lcrq((4!wI_h!lwEHcY57GcPI4TvF**XO#yKoCg9QlV zIsi6b1!iFP6Zds8?k#RmSlrMG-<*kO;Z(dIM%ozaNgxk*YWz5%2={=Ic2PO430>OU z<_ZErC_6}ixNM1wKze@j!1JjsVb>_9n}igy#ors&Uh&2%z9V}9E$bAlWq>_0V*V~#O?P@R*yrHFE;5p8x|B-t z`a3eCzP@5X3YdA);XNcdAKufWAUY;fqgHL(j1>0~!F)r_5c#1JcIXkgI=!qv~D|e z_ay)g6p?(%-qyRFh=mNpP3!r1vOC?e2!G(g`!GTGb!%Cl(@e|zfWbo9<~8RgC=X}P z!~2+9@gV`hw6Z~7`(d>bnS1gKzwHFdvY4rBIKN`OuT+spx%W8_>vH zJaXT7?IbVBEfl~&1f-dx5B%NH55#qC{p1BdF=N>B$fslkUAPS$%uNP1ePeEVqTgH}Bsv7$t(t2u$?`JggF zOxxLHUe$~A!l@5S@8ajSA6H5et4pH&dcW6kdDYlaU6Lki%JSyJ2@=n)NlB{J$c4#c zV^smrAUt*BVG({c@$aXNYuzZ~+(makmf)$eu8#5Ohh$7|=Kw$EdHiAfW$TQc-Rtaf zjeGMKXOq*T=Dt_rjbK`~#C{lYk;m7}X8QU@?8zp( zd8*X@{lkpJ%J)v>R=P^WptE*z{i^etNPx{}4S`}ccj_Z8(hmeWOq@tqU6OoSAqLQ3 zQ4|i<+N^H_Vw^*SFx`FjF`an`L(2axp)lLtl3=YZ~i0}wpo6i46;3aba%vB z_PyBiOy|VXW>>{jtc%IxX7*Pe2EG8VRM-Kv#bc%P~fS<}AG@T^u~k3OTb4n;N1 z>et}&_C-Aq;s~WFzpqBfk3^RxS#ZeavF)xm5VVNwS!LhwDQG+nJu=lMLKz*lNK1bV z5j}s<58AE^44~uNpHm@Etz9FoY)2l?i4rgEan&}mWYwbP@40Q!{+wmZjp%k2Hl2f< zF*X1+}p7qw$*3{2IeXYJd~bTiaL;=d0la+-M&p{ zIJzDR$5lIcm#(WL-CVz+C2@ui@FoI2PjaX=0BmviZxYit=VI2*#MlFqkq9qa&lz)N z-BB;CNACx_oP2A-5gH%euBl#6Yo6io(NrTo=1s9GA1+uN(RqcKWeb0YN2*jmUL%Sx zkZoSj=ss(BucE|vJ=ci;WITS7&xkd&2YSrk9)>U7PY&I9nfj*vbPv);hZZS!+mSrXmGAf_v`0_&6v%U|*L?5tuE%sq?bkcG<6|zFfLNg@L?4n9ew#C;F3JZAx>Q-uit4JtK!F zZ@{=Z(ZnPj8$&^nfz{G56`LZ3D=$mm*QP3{1Slg8h7%cC;ov!aQB7zPL2e~qEA zwE48sV1ip?I#T<$TK|kWscd-N&z{}Qude%*&}p7eo>02iuY*!rgvD2$JP2rW-vYfW z1AWeDKDYKB4+7qs@;9qW&xzT<5?_Q^`XuV~lFM2TpQlUL)<$KEGKTuZsdZC!U6T&3 z3Or-zwXp`gKR5&!R<%pIcCP3-OY&DubcqoPZx-%$h?NpsPsO^Iwv&|l zJ85$!?a7**dSXr_+c5(Q{}gpxii%6ARxWY})u}yA5AD8hO%z+6+3ZEopSGUV!;bFX zFiGagjlR2_2|;O9J%!1o6`Az5Udn*0`?aZG0L7-?+$JUZ1iv}Y zNw+vOZ1yicT(WuB)ktIH_)4G49F`Mj76~CR(qyXwrj4wiu7sLvu-%$$yY?wIW6O)VUJ6~M5^YR9W=TQuaz>tnJa|3NFG$y4oldev^L2O*bG zKF%8Hwd}rTRECc2REY34tPf%)T&Mh(g@t8><=B-iePV(&aiDq8!d|Bt-mI2%G-p~V za(K+(l@505K@p29#K=93A8M1VC?NWX5tq~!B$;0`IYxF^|IZD^xKC4Tjxr}sm#&?c z2w#g<{*)#zg}wtjb_QIE2x7tRw36dO-Wcec7{#(AZ{)0DWbD_Kt(xA5XHDJ8%-II7 zbMdYtP6hzu?1%h}+$KlnCMR7r7klQeaz0yjSjFkU<4Ghn=PaxAv!%4ZtXzt~uOGs% zQ>~(%e;6S7#*wc4p=6W-XrR}a+&9so;E#A&Rg~k*Y^IgSSX&Ha)G~_ug9cNGBFU;WV z%DK7Wcq7j;X^Y90r>;45+IO`Y?SxN`TuJ@mZOIvpt3AI;H8^bIjg`liwP9Q5kDhn8 z#TpM^pIT_dAgT)mkp$#}6gDyCgA}Ne>bBc0Oo%JUlH395UfBKKWjGSD#$p!y+n{gV z=3yM~)yXz!0OrVsCm3arKmuRC#3|MB{&)S$7hKwL5v(IPbal?$1&-XI*WNEH8D{*C zhXYgJiE>?ASNCFDgLk*6;wH9IG0$I2aIn&Fi@^sP&Y^v-%WgSy0=W{KX^6UA2mQaB zY`2O2oI6zc&EW@d;hTa|Fr=JgWd4LbIoHH6VV@swJXt?~$Uy?*?8bv6V8}7wh5C)+ z{*(#g^~su_Z-M&@LmE&L=IQ6EqbJ?k%14u$t#THn+05GhjiZ3;9j`?hI|Bljh5bR@ zr5lpIXRUk;Q_bb^vsR1D$W=4;v8w}H2{9;N2yrKg7ug|Bj58aWg+!MOc8!{2Lj9;C z{vGiZn0zwRVo9Tq;~27~UUq+E6LfFH zR_e*oFoU?gK85l{hcpQ4q*c)+SA#7l7O1EUh#YHyyZA|v=V9&1bMnf_M*5@glN z=<$xiAW}Tc4@fWo!}wKl;k*+{4(6@a8O|?!P60lfE25t&a#jC=^eqVOE;kDE^pYAZ zxua*uFC0VMsp~Dr??)~EsYe>r3J^pgtnW>G_R21N=d05O1>A4Mj5!^~QSX8#(9S!bFU}=_L%GikQCnF7O;R6AoY%RfU=B{RV@0#{k`a z$IM+lb6YLIDg<;OhYYW3al>UIqx}?V3n3$=>{3P=@rf5A$e-9s(#1u8D}#d9haszv z*9>G1B{8AsCwQ{vlP=sE1aLbCN-~m(r{`^GF%9i=>LY8tDFI|GJMj^XbrIZ(+U8ec zXujn%EszkFbyXRmz345|>3*NlARxu@pNIjQf(Xw)@%PvVhkbtL2*-giL!nG74kPL* z&gE=LWAgxmALAu|$|UP6NRtj^iL*dstE9Ao^6ChIF{9bIOf~5fkOCG|^zlexNKl@H zfzE~FfBd0AjKc``2m^780ru2G3Nt{0k{V;rd239)08ZkH83=KyBvavfbJokg0Mh_% z6phGMeV5r8>NJXHY7MIFMP3++(hPIr$RvIugt$yFiZk*haU0GPeES6e*_+>*(DQVo z>t8aYYUKr(S?5eYM>eU`1lt$Iu;T#yY%bV(@%?bt2aYt)SHl{OXYtVG!r?(NYAac- z0k%`}SctCE8m-QbOnGvO4Wp7AvY%+ZQa)&sAOLx8mPH znu6^4R|JpGrunv*wq{-%RX2kPafjQ{e;0xyj}xPN1L?YFgtlfnyZ&eELRWSR#%BA_{T6av-8b zwhMVQC8AUk21N93mo;@iIzo=JYH>)ICr>RzkEyWosD%(xVTelbeLhAFc*LwLog&`CC-W$nwg+y zph)b7Tm62sUhi3LQWU>vDyjkUDk1vao?bYi`pR;^zDEh|~-n zYEL;n5os^%d&fEA(`0jsjTmg~3orL zooB0y-i}sCGZVSF=GeOz|n`BYKD$DBmqu-Q!y%Y!i7x<(i@TPi~q=)hQBKaxQ%L8>if0 zA?@Rsu{2R_ozT#w5WfITkv6A2X(=Mf;lBVM-nh9<@?1*%ks#%^6+4S5Fb-7Ij?r5{ zAF;F+BEM}o<6EEY_fBi^>XppPf5@koWm25Y-WT|oNTSh>rHwn$^x$w-xoS)=VCF`Y z;i;RPNNvFPUib_Dh5ic)F8Q0J5d&)FG%OOl@*0lG<WJWMDr-JE$9Ek{cxM=Bo2*CpOA`?r;SG}5>zqi;Om_SCAr!sJ zwwpk_v4sA5fXVq4A8C@tb2?uyqtIA&0J}-plp#wXA1+7 z5QXu;@I*S=@F2l?gh!!c%_6%-yqMt+x_}?qM-@Q`(4CzeP5&&X3u8*NHblBA`uOmz z@r-OZPY&SNpR$wa*f0awhJ-iicP7^iGW(;NQYLZW++(Ei&q`-`lTuRG=r7P(5OTdcR6Z@Kg4RJ7m|{ z$Ptb%m%^iw(f^8#7Xnm=xAVH#;am7nIT@eDa(@KoozcFHj+N@|-ALu=NI8}DM@V3M z=O5~z5Ua?6I?+iv^JtL>HHTeFJ(d9jZe>|QlM{J7Q@CzpLQ&bEED+H0W)Ld#UAMHD zcV5Oxe8JX3;B`?YX_&xS>6pGgI@BGC_DV|q04HWQQ^`q)uOSN#MP1UFXgNm$ew-Kj zdqrMq@D~qlYW^EjI$LO10AJXre12TjExWMln4gzYBcaW%#PQoABpB01wEGwzHHlic z>e@G)YMN%0JV4?S_6%f}Ze2?e5@ErqB2_{X+hg zZ5S?whw+!u!!(SUFS!}L0Y4*cXmpE7$Z5qyVk(YYNH3Hpnd9eVDbi;07AOt_e_rw# z3*TY18yu`r6%-{=Yu*m~hJ1VnTL~Uf#WD71K@s^p;Y(jMX3_A%#i0PvM|fx^Oe14) z1di?Zrv$$~K{>#b8G0gp?-6h60EU}0KRvP~)u?&e)C;@FCS-`yX!-l@Sv)syO55W5(A1}!O1O7O3PES| z6`Uz`J6+=^;Fp9CVaI&U`5~UMRi&uo0~V~4z{OL^KLVyQICMN$Y2;}T1;}vClq`F% z3aHv1nfuSXF`r%CDnUUI>tw_LE&1n|vkNIi7j)gm90y+H`tD(-twU3tN3xe3s}Otl z7U42#tLBuBS)p@DW!h5pv!WGG^8+v&4j_%9S0pY@&JXXiH39Mn$4vy zv3K=Dc<|ipC>hZ*mgk!z61Cl)H-p^+bbTon5e`BHbYj}XM|sWq6`}4qbKe{l$8^qE z3+dgk;YRVaJD>7O7Wg&i_GN{VdW%V6C8+pAGU1hp@$zUJET6}63XT_cV7T!HKnc&# z%DLYgKQ^ptvG!Nxn{~&x451d`&~QstOBzlvXv;G}h+~8$*Br9^jf_;{E~9V}Z|y=R zObIZ((4btKb%+!Q5lxLfVf$8=dsRsZz61^NTt8aa{vi(3$|T!c&z?FW_1O4h!QrrH5MV_Ov1wM6cJIsLe8%CkR-~m5vg% zH$wXbiyCfn`1(32hhX}#2~634x!EJpt7y_pKFWf;Fb>#0ga-}F=ei<;n7kye12IHD zrx_z?6Z?ZvDct5}C?)^Ai~Ygo6?~xAwm_+_ocFNswC0ZD5Xxw6Z6XTa=Qh7DWjKN{-JsDN{s}dY@%845*Rf z0a-emAX(=718opM2yzh1pdl46ks*&4Kl_e{Vhj@J%nrv`H-B`ZzKM}Wv%`4Gx*P_M zcs3{gb;rLb^dd8)FNGdEn$wbOHwU569{LRa9lpM~>ZIQp^)OW0Hx57fQlwy& z7wH7LmfrrF4y7S=PidKc={L35QYQI!WuH%|xFX{Fy1_Y6n3>p63`bKIjT@pCNWmPQ z|H%fgC8@CNJT=Yc-ua3~{vLhOaziuiQ8`YINX&t^BoQF^MxoP%!|Dq?oblAT1C(p^ zbiD}cR6IvzU$y54NJ503i#_9%N#wloiHow3w|HruIBg{0D?c@8wb?oSs(?i5C80GAr&0hhz3JB>VX_pK~hG#o98tl$VIR)3)zF5bFDW z+LjQDC#i}K3Jj|j9;s4*qDu7^ci>`i0>{Wr;&vR*;=IAT;h<@M`cP-K>3Z3AA6+ua5PbY&XUPIM<}F6RJ1EW1u{%ZQ@$q=!B8<)jjb?8 z%bD%80IfKqpb$bVBlM)O(V0*TtzRO*EYb@lr|x*aUh^w}EffNE3wtevUhlgo`cq9{?ur$W%lflT%htS`w(UKSg~5+h zU*1hz8q?Tw17H%PQ%-5Bs2n9b^J%nuoqVmJ=kYFUsyZ$4%3t3d|GW%6+4K21-nR1k z*KA~!yiZQGC>sC1e}w19^}PhGP^VAo-RdIW?v!x#eZODYoAsV)WiCRPH7! zQeTU6Mx*<3`Kenv@c~dzJX~@@1?NeNYDnZ1+NT3~G?UxW?l!(n!Nli(ANH44y|yQw z+o~V(USd_3P@+87)j5y+H~d(Bau~RDpCemfMjj(Doz{w3-1owz-0RddE-s~+V-MPl z#(J5#<|k9xX!P1;TWI7#0}vrA5yui7tl^o~WAlj2jA4a^gfJD$cJ4H>;HT(cTea4^ z*{x$B%F%mhKv_5CN!#lWEe1EAu-RxPpT#;YH0nEj$8)G-IUY8GOJr82k%BUFVpDEh zPTK7B4ws+y-99XS{ErV);(6OuriVE;_L`WM2&jNnOryr;4UhryS)4Ak(p6dwPi2FD z(3sI^xNeiw=Wtw}n&a`uA8{Ql^zPbtl1Vj6<Ohd9Lted zDYjc!vL`g3cK(Ffl~tx$!&SpzZlc1{Gs5C+tGq}q22)E0btu0=_)q_3 z@CWERHqs`1Y&ZnPrts`hQOJ)~&8){PENOR{I5x$mo3Lr%&B{Ts(e*;*bM)%p6gA%d zqef`ury(&UGC0$J!@;6Knl3&;>(0_YOO*O0(hs^8$p0a)KMGm~!W|AA%x9C}YJiLa z%hPZSnO~U_%zt7pbCF@~abG4Z{{-)36C+Z*xxJ2%CbnyVydlHRSTb1&7 zz&jAxGD!=km6aMVyvjX)Xp23ew$H!>np_XM^1IpVu%l?~FbCG@Nj-w%Pn32=_Qv@19qn#^guU@t@79atx0}q-y}&qh5zXMO z4b}kI%;sKfg~Q=~-{YUxIi}=P430H+8jQ!z>BE=Xwj8{1QPB?jZ^Kv)}<<+|IW< z1zV>=1)+D(i1#UCy1d)?4(Ykw*9(|GaTw2z)AfBX?!8Z@J>^|JR5nfrV}N#z;^2ad zUvD;_D;bC6Fuz`R#bLbmTPEUpAL{7&K9_5XOe^R%m#QhTY*WPq7ISB^(S6@us^s_F z=NQFt_I~dU@qGUVo|5;SP16R%Pp$HBT6K5`2mnd(v`YqcC4;MH4Lga$Q)?^dXMP>T z+@{ZcySXWs-7Kr{d51A_y)yol`8NJy@M?u9L^kEnia7(%cVqfl=c$)cW@?2l!jyp= z$I6YU?Ju;L5H?>~7mbbR;PL@0-ftT*CjiO_bE%B8F~7;S=UFXLf9>=8zON=E&d+43 zFpnQ{@&#{vsuXZKM7NB}L##8K$g89}j}s^VzAaJThO_r~FWKUGJ)o5OT`G9{)up@;5;)VSOv zU&qh>Q!y@X#0VhHQoyXHYHN7K7>F zX2GIe5((v4f(s;8#&>wW(c zf9%`2wKzz1E*}#Bx2u1+QY@~FKc&CgjCc9IjB-80_2;^cp0e-i8(wkocAThRntgX% z`A|}yU8?K;*siLZU+Nr2B?b}`J(UYC3yg<6b8t*j@UuW>WP_%O+guYD)@;Cda6q(+ zJX;neKz0eE+AR^E`@F^XKNnShy>(tr6o27ASwD2Yp&a6qd5U2i`rO#&1bq zlwS_#Z4)K8TS~2N-%erYq;yO4Xk0ee_fQpijPCo`#b|66>+GEMPWRo2d47(^m~EHz zi%}nPSTU8{$zHD761!`Rg_p|G0Y@BIh9S?#aiMN3gQEH<0d z7M`iK*U-jb^O^jnL4fer79h6 zbgZfVY(BH`06p@J2ht~%qY;6A+7>JI;BZ4I^`23`f7Una#kOL89PO4y3K2pGKr4yu zR+qD{+8*?tG^(wvGR8=VAXRzJqRhp6d;0 z6QA~cw`rA|t(L7;ixR&=>-ijP`6V`c^hrTzSLkjbX|CNEEJ=FV|$|(N{bNv+XeNg42H8~oZ87e z4{w)SSkuPcY5uo74{Mtwb+w7n6y|*xup#z3lkB^z9-a-ukOYx*+R4nP!FeOSzW3!! zH;#H-ozZ2ds(3yFMV+N}9B20H7*FZY`81W)1`PatuER0uT1*cJG_AvFWpds$hu;;b z?j~El$CwDu3t|<$2Fs7>#sk?*M{T(K<@U{(ecvp-&1SjfquM(sH(PDq_wiR*ey{ON zlq$H}we4oLYL{@=yi{!af8QOs1POZFLHcJ5tn`)|*n*cBH)xegX?&PE5XtVV)=zCWd2e$!Fg}^}?Zj;gk83S#0 zpkN%VN1ULSfT4>~`|j4Mc4oYaIW!I@R-0{V79(TPul|_&#Bp99_X8x#{ZcA`qzG(T ztt9z+zow-%z+y)Y?YG+>4DX-D_8f*~Z#|uzxC$uZb=Bs6+(?CY2^uOIs;yYh@ot|b zw9UQrMYK# z6pi(_P`Y4+XjOhqhuGoDslec|xZG@aU{tG6-Z;^o&VJ%qF3v}ory`eR1H?%tq zKhyI4HUBgWnXdE5+ClPKH>f0AfS!PfEOcYgn_1%7hz+VWAjgqUzus=bOt+<_*io2e z9O@8UMa4OvcK-qN!Eir!<*(*)*+>kLg=YWgyxwdngX1l+OV=TALsYF0UQQJ1{uLmN zoBeBLN=loNljAIvTR~mlPp5ZyX@^$D!JZ?wJmv)~tuynw`PBl-+Jh?gT+fl% zRTN--k5{X=<%4smW`C>V1Puao4BM-EFZ) z27dcGhVZh#3#iTOV-XZM0{A8M%a0>ZQA1TnUhCGM26^@4@uKK3I`tSu7asXZTZax) zjafxELj+dT!luaUW z;p_$8F*F{FCORIUG-jGuL~Y(VT(AT{sNiW6eb388l4-J@S4+R_HH!V{Fy$0a%VK15 zYdubeM8EQx$+Z6Aguqv!i^l~4oG51?6P?i3BCD$F%N+}gbMFP&!iIdfN~ou*7Z{$m z5h3p*TIo>&MDIewB*%|BAZoU!Z9pTdMP&^gMnVAQeU+Fpw)y(`pahn)VHC~0y6r)n zPqx2~4L@Pz)In*n;b%EyDN|{-2*5l0jrPNh+&zl`_*Rq&x7DCl|m;A);$lyF;r zki`yFIJbhq#}xRHsO|&==}^HrRmro#pZ^BJGp%0oRK}I%DAE&V;|*7EvOEbj@^Ii^ zhZGG?w`N^dIZR%S*BlKG!3ai5g5r1>cbKSBb&TiEPD|=}h)|&0SUyFY!Jbd7L{O_D zNPN0tVSV(+)b~ zVgXw*WFa#K(k}Oh;I&B745wlM-EFd9gMs&Z<)a~cjnfG?bo9Jb@2Q~$|Rs}6aX8hYq_aPIZVMs4+v28}wQ9#^ocXhkB)VpoD z1%~hqC;Er7NS_|gw?#QDw@xDf+qQj(Gx}RnE;Uy_+3CCAD!)-Dp_BEy-b=Oj{ZvL; zTu<|q!(o39U-t^5<4mtD9 z&#c}nTYBR7J|l?1=kh-}^8f|uz0;iU#AbWH!C(2K`VyJNtFc8Dji|Pzyyb^aBj!*N!pSPaT%es)$FmRb7u;z2;rx_1bTbr0aOUAqIQBa(|B-&#pJa ze}X>FA7}BKzrecle@}GJ{l3|$Ijg@9dgiA|&0gMQoAmfM6?@F-S4D&4Gh4i_?tD`9 z9Luehet%-4p}JY`U93#}X8(+&OZ&Zlq>JkNKg@RZ)oLm4Pg?ENtgUC0>2cq5>-T0i z`Cg~FPOTYad~Qe6^E{4r?fpKy=kN9P7|+Bf>-pN|S1l0N$&F!is{64!ZyabY?dEp) zjDUH)GRHP3l&r&Xx=;+KNu9KrHb4(9Wzmgbq^3K9i>x zVk9;YoKar)2QvJe!_d@{BqD9A1jNu9hJX%Li)Y|H5$ARt@81iD8}q`zgL&&i*T?tz z*l_00Q~ay;bGtE7RM!c`{jsgOh1d1!Mq@IY@jFrt8qNRtMEvq28?QZUxARA}>MN`_ z3fSLnd%nXwpL6faW4gcaQwm-t|7XMYH(RAt3O$aet=Qufm0cgmmFC;^xga^N=OK#G zN;On#f1}m3>wqG&&12%XhXwSI++6i|_Sw3zi*={d`c<2mKmTc+xTNx_Es>c0=1I?e zr-fw~Ngawf;l((MVtufBomN^yYS~_Am6irPig(A?bctv!ECM+cd^_#%vAET!uHIALgBpCbt;}Wa<@;?*#^d~y5Oi| zG7R?o_4=TW%J<=lQ~Cp!{i#cTjm2i;D0;&=?#kV$Dlhl+o1v~;QLlC``*6I==!s*x z!017FwCE1SQuTgTjCPB~Y08riK5nQ+qqRhPD~&qMPkp`mJRBO`o#Ut4j5qG>XY0KN z+ekEG^Fe8U#szPi3SWEGIrU zo0q9MZ&`F>kr2LjF|q``*AU(>yvE%y6kpo(EO#H!&0~`3I{n_LyRaQ~CfH~Jo9+8{ zZrp?`OC7n{dbL>FcG=bjp8Em+bdxC&|-ugHx}ENjp{Q<%+&) zK1!?E_3X2OAe{Gl-LT#7+l%Kn+YF23G>&(7QK~|AO6_>0ON~xHa>g#YS9^QD=IzXt zmF3MS+-C`J!;6yGN;*rwn%|lp*tKlh5Nfd6UG$ZBBZZ;IY-vU#7#F0vo|hg`4h#tJ z+mfN#npUJ|pNU1)q9TI^-us&P9j}!85$)L26PK9@XYK=S?Byg=z(^ukmPNJ8&4%A| zUNe906U$z&T;*Z%se9|jds}tA{d??do6S?>3I zO4Q@GRNU_F)bDokfHvCy8<2YzI;+)kqj+LFevjYzEK*bHd?DP`CYM~-@je4g(^F1X zzr*R+v#4$}c#Nl>eb=fJTAa8Of7fW9mFy2aa3Yz?PU>!Ze=OXm2&>?DIM6%oA=5@ZoH@MI=iKI`et zGkvFe_l4rtQkVJW_I3ML1C4CSXY=W`EQjwR3j61gfXy+FtNithx=yfTG!`%P)jr5$ zp7Q(bJ3D`d=l7^LYRK27uSn1D@f!Q*U7m-jvL16*nV(Axgv)mLJ%%RCxg&%^T< zFupPk4c*>mrMO~f|7yOsM7i#2sby*CRfpZ;&U1b0%m0=CXA8e73$=yPChd1WWsUx0 ztK|3Rm6xM^zD4~MUEhOn>^fNmrgAC*1WV-(7nk9n=4r@Wa@(}e^v9dg-%SA=m0Z(c5!N}Y!8EsT=)-NLNRH5xO%RG%u z((}rx{ow$+hac|ONQ<#}a8;>waClDRNAuDh&dSafoJ3T3glkW^sPPsyr{m4!;h(ht zCF5aR6<8JKD=TzlL;w=e+J81v0u>_=gMlP*)FA$qHX7GT7!C^16}$tG5L&XB4#HO3 zx&ZATNH{EPb6C7LcOJ}?76U(c0BCI&FxmH)YH$%$>?5;D<*SSzNp1kR%cq&~7t?F%q~DqSz!+RvhqiR+i0T zf>N6uXekN1zNFDE3EXIRaCWS73V4;4nt1pzgeT0KHm!xvd^RWh#s@H(aUJyc;xgI$ z_3Wa*s`#&;2Adlk+E&5U@EnRD!7-2QIudRMAWb|vr8bF6w8FU zbL)-0N?-jT+H`F5ZK7&p3l{J((^f!N>d!J7V|AS{Oiz5vqm0bJh*OqCG9F+QoRwve zrsl8IU$wlWc%?U7rlW^KoC_>)(^@^9^EX$r@y(-Kxq(2I;m8i5TAR;hM&*mmSdY9R zgwA+^3`!(7`%s;RaW)<-;~bEWVXA4B2~;eE#}ZY1C#H(oi07}dptN;V6;E`?AHtdN zALM!M@o^A%bNLEe5}fkL3gj`SqxGuP0Su-1VA&Ge9?vlT>^?TG9ZEY8O9hqEX?Cv@ z6n9CRw9reqdIHAOvN;gg1!GaZ6uJMfve~K%pLKdLseB`eXPm`U{e29v-nC zkM9EERbIFf$uT-~zMqVgTv|?KK^9bA*rwUH0zO3OwY=VnGPFXf2W_59kpx(j-C0YaZQbljQ6?Jlh|U4h7OeO=cqGUdzGg)L=_k{HMn2rxk;O zJ3(05Gjpga`K8I9Z3eethn;gUP$sN+O2__i5sU5V3GXybaZCb&4XEh(bZwOlq#7 z1VdAi28}`nu|vKvsd3cIAh@v%#AeA+9LS^NDGVL%Roh|gp7MUTa1qE=Rgxi72Gjk{ z9|#-w>hgstp{`@+!z&w)QF=!|maCEQ!V=~7|hC_ow#YhvqlT=>_6 z08)u=#2=Kzp-SUR^@M$95#iOu& zHyI<)@scFf2y?14X1iCG1G&G|%DRs~91n71ZsG2X`>aiR=~IU)7NarL5pcCm*r7@* zUKmqM^*Zyp7bWQkWJmF_QLcBqu(58Mw8co6wpis@gldAxXl$7KGrcG**%_F!MjD3O zZQFUge1#0ISrN=pP`;Tnh^%1n)Fz&##>xzp2mpm#@j{GO1|2jou?&wakozZdgL6xz zMJD$wjfVOIJTozh<`%|iVrR(Y2dD9!fyaa@D9W~CqLKh5o%bxuY{a_Nf0}^)4hbY<>n{_!ks`#q zMMXP+{wI~lXzAh;twNp-bF`&I&k6l`W2cBHzrOI`VZ+*%fv64-K&gU8LB~vfQ@Zg zR>C^BXOuO()pH#%7N50yYCAf@8;y>GMA3Mr97Txnyj0A2IfdW?qiCGZ(( z1rwVh3I%gqLJis9ApiiT4}HGFJYk zli%*lv!R1*I8Om)(X^=p#^2t?0#SAB!YrSm(-nB2ccQe$(flT<8BrkPV>?z z0;Nq$0_5BMZ+3VEaVlua7nT>#TN`>nme`(xkv8b~GL56lO9-s!>-rVnkYRV^MBMis zA|U)p(oTL_w`c_Gd881KnP#du@V^Fj`;+}${Qm?x@w-uCX&c;GPvu9rK!V=6f)f=$xM8yRE%tkG z$D*>8zG6bZ__%K0Gef{A6IlU`=QzJai??0;Ar7n7RQrKfQHDUCUmst^N)o4$E@ldg zd=+m{ARzn6R_o@k9DTZ9W9JL*uWHaofJ0~3|5}3oD+ptF>*UbYG?inpo*xrR(^DU$ z#lA7bh!`pgR>?!P!*CWzNEWI=`zJ~+Y&I|L`@vu2uYDu4(wLzAT(o)2T!5ST$b*1I z5d@LM&s@J+1Rd9;`8v@SEgo`K7cZYzMiIJ*aF!u2a9<0XcwC|92!^t-{1CQkKg8@L z#^M%(;D}Pk0<63(X%WEsr~qmLNiF_xeze?#!nN=;^?7O&OYgw}e&l+-ISCZg-(o#B zUSl&@l6&>4h>-Mfu9Fm6TXN?77sJ$n+U>iEC9+itvzCW2dhUGf{!fKUS$_tI`J3rV zowW_+Z&Cjl|K@&r06Rrh^ZcLnVD!dK-7BKI)y#s$LwPW4(barX5r%?O^sf1Pg~sb| zwbXcWQ;tn6uPg_e8je-^GCfo_Oeq^~wl34xWHeg|0!vbu{b^!`W5L<5cRLKHm`;a= z26dYUQG@Jei|I)vZWb;ZNn>nkVzxrTj!UaMPo$>AVlcS|v~sS_^$YE{#z($@*x+hR z<|ag^&`gNyZIOal{;bQ{)f)}rn0)zIWrt>8 zHnaS7r~uG9&xz~E1D1F~ourdM>xCtS?@{a|3;*ao#Kv5={rltVK$AV_TqLN}`ey-}i$dwH^NtZpWaGlbP^lzGLSlq+H?)&+mvJiQo9fzlicc0rlhXz* zre#^cI|B!w)P4XcZp?@d#G3pL+siiYD^l6jJl8(et;V3$T`iZUH8w=x9?DTR=Hr8l zfF#c5_9SwKTB0P27zdQT7hVxpaXJ54^C}CM2bFRh{ssqZMB$mIvU*cA?kztylu&HAD*})OhmlS@#=XgyuPU zC7-<+%w7J!Ke5=T?JoH^wNaoGnKYP{hr%2QAHEzPm_eTXKA7GFp{cM-D6%vR8$nw|nDR%GFpt~& zr{hNZpt)kYe|XxzrHu5*P8ufRH)uSon{^DV?8I{GF5S$b5U#OZA=4XbB9DgopFk`x z(u7l$X;JqC>?g_?J@qOaM%MBCB>e5x=g?d)p3g-A8*HuvTX*Y* zVl64A2U_Cf$VvOT2w?&%V?A{05d-YsGem{TQ8=qYA>uF-W>>>waiE2av4{u~f8V$^ z7x9@vh8i@#2^ftbI~Lx^Htxfem<=}*u7mKYd3Bp>#*R*9Qywy;QZeTXs<26fusj5t zxYXoqbZ~Yg`EAy!nn-x*e!@QlW^)F^>u&*C0A1SP_%fm^$HGecHn0m1iLlW7=xouM z7E*92ps9h3F{Cma3de+f!(!4Z7An+R+8AeMvUONqSj^sXSofaw5i$i#l6-mxitmbJ{=qxr&cgstBKR&bdf#PjeN`Di& zze1(W?yaQ3v^yXGvuq(L=soSAk#i3FUGmi(B`ul(=g=F5WoQZl$X&{&Tz;bS^u*-C zG&Fs2xbb8}vtJe3!AC zHEu?O3e0CblVjzZEDE3_UO`FW|>mMNdjM&*bQBZnU?DkunWR6 zlb?ZEOLISo49@!zCgq0=IUCjj?kz<;t%Z0yH|&KzGGYJn(@jdDF0s>ih(l>JM~)<0 z?2(tYcWh{N`qDWdrbdCvn;hIquJAimV92<>6=EM%2xoD}VqENVeNQ8NIE05!iG$B; z66TY@A9QoovCcV$Hk!iQ(nb0gfANN9mIojVhn?Fz8Z6N!ewtyhaUn@}& zs72P^jJ9hI!)JCVSwHdVJ870AT~{m9@An%%&;RCJH|}C;IP8dJHo~Gy)~xk*GbLY) z*)9?cznf^IQI;pe^>HZ~60n!d#G>-$$rPRCMQ2)tqHW(Y0gZve->1psA)21|`GVR8 z7G3yfb2z^-CY`^eP{kqKq;ef_z1TAToX)4~@IB0rjLe?`e|I_)Ehd|1`VcWRKT74K z_WJ27D4Q~RHY+`BteFZEj$+%Ux%b`V=`QX@olB|mg$1@3- zwl824z#2m;@bCp3uk*JTJbteX7LN;|hz* zBm@RV1Z0*_Gc%<{e69(^p9z+RJEUd`ua(FcPQ=*K(b zv8L&$nnQu}K2N;1<7G50mz(!~JehsxLw+%Fc(?R;&A$6#nT?m;+d#A0P5havVuvSB zn9$%jwZCaQuA^wh@c6*z@Zr;+jM$yO z?G3cb5{ir;dr~{c2A9o6{|*XARIABt3){Y1QK|8Bl6v&zdG&O7$e~V2rNZvOXUtB|r;{{}8Lh z0N%bD5j+ngFF$W~1Ud!8&roAIstmHm-_S{}gaTq33u0n8RQ&n+E?tZ}L zjFsL{i4(`=In!>G+3}!fO~+aGG|rax`p!3o;zkgiiE%u5*o@zLiD8V4^g1jumWfMM zDMMs#uo7}%f@m9b865u_qER#=t~iSz7SKz8`J+*>!xI+I>j`tarnf*s85|2*na%}m z<1wUaiuZWg6n#7{4|Oh&qt97> z>lAo^T)$08@*Ic3o>zViOJ}xiY*3Y1fh}|gYEOP3X2T-PBu0VwK$eLq?(>|%6?{4$ z(bT60>sx)-=azR*&bl5h&*kw#3PXU7YjB0X*iJzX5}nk;o znZrk&UHW!ovGw^K4|d$Q9mSUhc|^3-cUnoG;2iHyaF)wqBd;1U6|bfu;tMh$7TmyE zP{mfeRr2TbSX?ibf4<{B zEBCFL565&PTQV`EphiOL+FTWrvQ84|T53y=WxPI~R6Q39A?6a=70xBc> zI?*X7NT*TU?idYsrh9=?o7tG{bk=5ZF9I7w24w1m$T>!XX+T&8t(5a2GB=yY(RPq&p@X9{NDCYvXQj}s1U19la1nmZjyO)y{$6ZXkSd(4PC8w`sHkOhU|yy} zEQ10WiZef<0Biy=^g?d|DWE$=@GPPQl6YltH7c`)ZZfO{+KpbshhjYRvx)scHaoDr z?s~rtM<+(|DuXpEP*+T#oZYch;OG~}z zc#c^3E$2^~rqLoiDpUv=C()WVzKe$Bo1%Q%HJVBS@k4aO7hyUvW6U(OJ&$rMdCyIk zL1k-}T)zYO%R*BWY1Rh6*z%aHp3z{d1&CS=#540-FoBuoh{z)ka{~J}-pB6SKt1UG z!$vR0=JBz*@a^mA0akOj#rCKwNDgq&KT4n&w3 z2!JBWJwvt|%{n!U3%mm(A+$VZ4hrJ)jPq|8u=;-GEoF*6Lm=E^Ee>IKRrrScH?|$e zY>~-#o6P6(3d{0Df^okbv#m(VZApwqyXB4|O_b+nMm*DZym{>9ecdP6qv?8{jCj=G z<{i#q7uMAU%-iJ>t94~X!}&jUHdARbx)%81;@JF|*@fi+`z=b9%T`}L%q{qf8P2#I zWV3jN-3K8+fGhUD%|{za^@7DZiJLbNl0YePi0-zkqy~@c${-g?8=H#5@q3}UOU-c0YW4 zo~a~w6=llrnpZ29QYK@VMrz>v4e;i;_?^7O*KvJj_4M?t>-qR9Pb}NF?CqXy5YG~& zjdBoC+?O1brI@gfi@^8lzoKVII}V}nvpdQ1*O^%}`=k0u0zs}3LS!H`8%95^y}n66 zG$V?&lxX22VEn^^G3l|#z6+|`mi`aV2=*j+1p77voK)^ppL*fD0xpbc zzlYP@=Mq02^9dCMx95Wi58o`;#T<`>2zu&f=#ajcQ#`>-oA2C z=I#};+_i7!XFm*xoqqOfy2!B zuI{}FqbjjjF_T$ixxOeQ_e`Q?8;%*lO>{L3v&Q$z6 z`>@=<%Z-*p2@Mz+L>gh6K!YJZh9Y{hlNP8YMu0T|y9IZ$qzvG%FZ1C~Anc4=rbj5e zQZAxp8S*}tpg>x;-FJU!uJ^6iNotwiXT9f;8Jzq(tudXNn11zHrEnF7`!Q=-KJUl0 zKhN;hoi8!86Na8_ETuE%11NvE7JIxKuw()ZwDp7s8nnp zJy+$w*rcRgb=^iZ{1@@sXtEw=fNjR2tUT0++SU*PeWP;BpUMCkH!|@^Jd^Oxye(w9 zU`%X^u`L!^r4w*P?+O}jwwsFY1K~}#pSMjLA9~e;2I2r(G-Q)16UR$OI=1wFUZy*T z{W3tTyBPFHG-8Y8CP$X_z%6>KNT-m&a_&zk_14*-&g~etk8`Z$M+v z{~~;7AhaTpR*OdmL#!hbpiarT*Xi}F)$0CRX7OPwG;MrpZJT*~IvQsbI8=#;SyGF@ zBMD`c)YRJb27o{b869KAZw!+Jsr0%|a^1HL8_;O& z#Znz!@`twr_lnl#Md=&P;V#b7+?pma8n4%%1|Q^Q`Han`(L&7{BX^7oJt|RyrP3JA zU2rLCbb8$$E0wCia$GleeBllIuoo;+C?yJhPt%Pf$I{ax`@M(D#vEuwvta;tG<7O_ zxoo!U6~WP3Y*lhittq3ulME{YXX9|nH2bBgsL}YIJP}CaMrwrBu4<;1J886dnpRpW z%?39-;G31Ts;a5^pRdt#I7}HS<%X}!c#>rU0{5Ox7~+Z!P-z&@rT+D#bpt;%>8QxY z27mhly9cnJ7*BACUz-UIjiI@-CXlg%RrHI3f*!?VzkFWMwcBo&8Mr4~qe$qZJO6@Y z8d7EeKFsF#-L znIYK8OyRX>E``BFF3k)Bg4o;fTyi9>ST9U&{T{c`cfWb5wOViUkK(zz=!2K~SX#*K5}CnV zt4=vFtM&V_-#7>{4d+UqkOJ7*WXNVG7Fe@oW%_L<4Aewr)jyli0K9cIzc_GE6ij9` zPsFObZVw(S^c@-mzlBI4z|=F-&A2PY&!&!Oui9;E+&HLnHJVNTIt}v1Z#$d{ziZmH zT?ATbwOL2U0w6v_cW}~$jxtgJ?omJ% z89v2$l*G&fAK+#wFr#244=X{atq=p$G~~fo5^u-6?zr=FTsJR`&m_$C>j#iV6>MKP zBcim#0z55OdN%!fAKVkB$A+m-Bo*&oU}u5N%W+>x4}-$_W4ZGQz0=I>oA>gvRe?c#!Ybq))hBzu;4T00F$wk60pW zyKtt5ZA5&Td{sqFSCRZYuBJ7%yb9!y>;bPB;9ZCJx<22>8FpN5JSMkkQPB7I<;xXC zz25>F3vDTb+y?LTJBrY3C23roi%=3BQ=3H?Yv!eJSk9L6^2i3ZA+Byibh`?xrY=J3 z`7k4P5*L(h3LUO4x)o1QhFM_4y@&UKm0Qg77!Il_w0qt36&Y;k?xD)9;6 z65vOhEUCGg$bF_64VYp@Nf`OVI<9J<0AE0$zxxk#Rzs{k8I7WbbWHD{1>B>W#QKtt zB2&)PzE~_)=T#bc(|5-2cp{(!jO1S9xlXW@Bjfqlk)m<+Iz4Xp-JsPPZGDFU&{*ta zqaSo>CK;8k^cq362?;H5FPX56ig939CB?JAM~4>$u2{3u9(ikKpG6rm@xfStx}g^) z1>ah`)e$*-Hk*5R?>0O!HE@akzf36j&6>OR&Q=~80gPIIhg8?m-PT~Uhf5c}DvT9P zXIy67SY3go!oF&?_>q zZbNMaoq9`%806;@%M{8L5oizUPxxq4r0=3CLL%EYySvgv(ttu^n8TS_A*pEfv z39%#23uSlczvrj_hMhfmS_(Je#4Q-a;=VP?u;lbKV&iq;LFAbX+!@H?|H4T#X|>&J zxx1{Rl7i1+Iy-u~z7M1Jz^A7j%lN}EaK#gut;$jqa&T!t+`ocaj$X7H8Z}Bbv%U#4 zJA=Y%sI7NR1t&{r1OgOE{4el4SSL+Os&2gr&gK6jZy!=7pYM3nVV>MXn6DBoi|d&= zWXTpc@MA5x+vWb7u1~w!>pKyi$xZ0m3#yl($g;$ofR|1wRe@LU(YPEb9Bgc%-$1%n-;zfw4982JV z_Qja}&I@JV;J;3+N)}{7?XfyAoo&NfYnn_=%5$lr_-h~_L6U<0^)4C62uOCsHvfm) zooD#mMJ}7ocDek~sc9!-fF-Mgo&vCSK(d;S>IymrGR<(3x(bc{=cR2={pEJ=chh>z z80WC~u=wf<&lG=J@Jr4eq&<7Tq<>S!l(c3B#?YF1G|a43pI|4N@<`qkB&4i@_*&yz zDlMPYp-|ux&Ni$)y!&ys>omt%&9EqprAur~O^E*YE$r2BCXXf_K6_Y4cEOT&^isL^ z$L!vIDjnBRWbgiv&b=##tA`iTZdAe=A4!vrN(GLYOskhH_N^8g1Zd6di!-Yw?lRrp zLT%qHERU<*6#CMmG=C}5r;Yecr_T5Nkgh-=705I%y+@xAeeg_cbd7-oMrR#D6^!@@8z- zN0_}zX{cDP_!$h_@x5A`g;R5;(te`K=(EMYA1ONYMsn~VG;UMB|0;>P>$+KraIhj4 ze3-l-Ro9ntQ}JNs0U^}08DGBNO`>hw7Mp2?s#yN_15j{5Rl(JqQc4S4HLKYkY{4^5` z@CTtn?n>H?^&JhqFVfght$7?2kiTZ@$XR=3uQMWi?8tV5X|JLoY4B0IOti}TmT+-m znN<)IS#b7J>o-38q38!WvXZZt9yBL}U((#!Z1w{jqkhZyW9}9~ zayridfP4lmWHSzSr9wH`72sa--$eiPi3#p~q9Dl-9u|C&0WV#;tkpty`qnYW>o#J( z&jY4h|I^J*^o-X)OM<)N9f{hOQ0=kVUF%)V2sfJVyQ(H;+(-U$uP`?UKF+gwlf{7D zsD0!CjqlUq$b?J+IVPa9UdpT-rZxbT&y|PST?ghiT&4*$s#uJf5F;WZOus_ud0E5O*x*Wv0KjN<9n$2n+$zN)ZGJBtjAj03Z}$V>9p}d+X=R z_dRvl&Yk1?^t*cG#DO!nfsp_rArS~biaIK;M*;#wf=F>*_cb*8sjD>qc$V(6ch}#} zUA5Aamv?t{b#+%&cg^DS#Zt)}kybOj0PPMwdDuan@DTmGZ@hr6ul0VWpMU1OIidf1 zkq!>evr{&97Pr>UBc;p{x+9^|gw;Q}jcM^HodrftUk-|*pamzm|7m7Z%`()B=_u61 zw3VI{n}wF_k9qQ&r0jWH6AV=D+X8r0r;xO8L=O$`B#fev;m3ou)4WRFnOXm=Ol9xmKwS28P^O9)%N(PWx9pM zeA4ZD$;QKJzyEZu4*u0HM&D|7ZGG9W;=in5^9=vyfYPj?PWFuSKw;JjHc64pVmwW_ z#0IeUnW7B^k)>=}m^eO4{B3!Y?T8+45-i?yn>_*6j!qtqQUF|KAm8S+1b$9Y$-^zb zc$C>M3rPPSDlbMK`;_S z!_4>tBqzIlLGAeGSlU1 zeb$-o<5b|ZqnsyUlTxBG%P$r$7S9ussOywP;B+1)m3@z>{i61G=YOPb+3|UG--Mp# zXS?pGs?J+b7)mKS3VQa{WB~oi9Tq45*I-S1qjFSO2S>HM=v;bC(XrnNF^L&N?*zE~ zJ&CLo>j{}a3~$BBHe*Hk2#c}O3e15NE{36NPE5!5(wx4}{fJ!d=A)WFPH&a#xsK;~ zN~FKU%$L|Lej~ zi2~v?T?pVN~0$ed2k=%r|k{1Pok+$HaLDvT-Dve8~`?x$L{mahBP`Y7ZGc!s^%(=c%q~y>akD0?!m^~vDMEt}6ouiY z!6*c90z3j=bE*3MMKO?ecsb;jPBJR)(Jdv0ZLCM)V1WH!Kt6%PFm^*cUObH_sp|aO z4?pV-=(@fu#~O|hykQ>Tnihv~BQSWy+X1#Js&BRVti}U_q6S>RAJ2u|6og>h(~&%* zNM$;hpY0VKJNh3zpJtQoV%h;*9#LY^a*@Cc)(&oi^`0U-s7osTOmcF;(r|V^UF4Qo z@?9{LxEuXSgv3qc&+6m{`Q`9+zOJsv9>5UvfCd4#D}ykR#DB{a<}dB>?RtsCG?Q9&fT0DHqYcOvH#mM-c&+TT+cqbr_19 zJ5TT$j)~4CvC@$^KV-}OAz-W!mPwW!9H3-hMU6JITIy=``}~f^_t!7v*J#U@jFs-A z;B6MJT)5BJ?K@g^A+YJtFW;Hl+B;bnL$^ zX)7+51g}ga`k-(H3F;0Y$+J(vE(B*hQXfdsaM3mzW7&WryXc%Z9>1mdW2xA*1TCCy z3>+jXqi`vGPxJNX_UCTAa7f(#cd`a~ELUGOP?{xoi(x518X{^6J{*t}TGWCTAV7!D z7Rrvy)9~I&<||=SgpTeJiNKToSO9RD>D76eDiV45{JwMjic?;ni*&yiQxTM*oe{;w0l@;hx&s3E?!@Iz_Y*L$mt=5ttkZK& zOh4z5B$iAhhTjY+XW+4f#W-i&YW06vl%{vR*-mWxa3}3G6xXCCWdsfra?c+avYj}l z2f|lnl}wYA#DJbT8GID$>8kxl-(_aA88@%kG1A14$$vfSM9TygEr8L~ud)Y%PNvB8 zgFt7x4M>c0D=l|aBQS~4dy4UZV3h;pa)6`*X9amT2LCSf<6&VB2Ph+Zoezz+F%pS6ym#YmLo^35NjH}3P!lVI2 z_%g#rW1^HF%M^xGEVe2XVWKeQDxIRDbIsqSS_qudN%QaO^7}e}(-3aIVGdIEUM{~` zh-Q=-K97d6OaZ>$k;F=$hWX>}^rwDj5*w?5RSz_NbGu*bwpbnCABvO9;_Q{pRotlg zFKcF5A#ciXl}{v!%DCT<=LOyJ4p9%S6#;|41PeW;i|4oBk6tz)Va3AdXSgFiI(2C9 zbevKnfr@-DN+{Q$oWI^=Q!4cwQEM}zp`bladj@E8IQMASn`N(SfiFRDGxf1C~a=;NdYM~7xa@_VRzk$Qy>ULVO?sB`v zW4F7~3qde&@XK)PAGjj61p!Xa{)VO4j%n9nm<>XoB{fLC)$%>*ZB zN0F#O!IjR5_&Gr#-;V zD~?oV9yyh8f=g#jM3Ej2L;|*Dc6ieGrmpL5G@VLwG^X#g`cPRkzJf4;VMJ7;-W~>- zspt-Ic=bNnQ?VV5mF|F;f)r$P8DetmxJ{u{&hzowjj5^|pg~+V1nIgTsSEZuDtJvp zhbmqYPp%}+qsN{(aAtNn0D(o}QQ!S<4~}3fP@{``um8f>88u3E(+&8b`7sFrdJ{C6 zz#K<@HY`Clvl(Wzo~ZzmUo;VIap4I(R`F7G&8J7$UZ~OZWA-!U$*S~enz#0!{NR!)Njix0T>mDGkS^1HTs^Q z$%ynG?`4AMGtk);8Xw$j^f|3ptI6{+f{}SXU%7>wYe-l`@Fk$0^q>U*TPg&kU;g<% zz>G9Ov2~?RQ-9a-_c?0J>3Ru^6+4)NNQ!vT9=fS6r}|-b1RtZ#DWbKSU&*O ztZm=pxZ7=R#AyAu|L0}^;tnQ93RSZU1utv)UFYc?gUvP)K^s`7kYFd>QZpHiX~F;dueDz3IS<0MiW zMn~~1qiVrmIGxZ)SM-1U{x77d*;?JD=i=+h;jfO}>z|x}B7)kFa9d&gi z!NKt-n8*Q{&=C3I-7bUG_$SEx^5Sxi|5j(!1_#2@R7QGJ4asb`svtm0=|5(&Or8n$ zvOa)_e+%n6;n?F5Nyu?R zG}^sDe!CZYxpjjw_SDhBG^F_yxMl=|a`k$Dv#M%`1#_s?YVr8(V5BmrXh^|TCX}Q= zsf=}$B%&PuPk^g#K`pw2*>qCrVym(!5Ef0yQ(K2z)=~~a3R(BbFlTt)o7?qLqtR1& zqv2E4SG%8n#`GL!Zrbf1FyCuiuPOl~2fF zImf_VM$;W88}gSDG#=)jr{hmR#(&ZK1S;3OVv|Ow)NqZcMzf+M zu?5%(6ke7Dzas>Q+|C+2E?1+`bJjl;G1%;I%4ZzN$T*qo^O-zFi1x^l2vWbX(-sti zA&%&M_b;8G(D_|fA1vk89EOtUO^T7E3Z_;E=(jZ!C;*HLM}KiD4|+2{?s7WXApoG~ z&(CB!c$x9aCNe!Bd7zqefX>CMX2P~kNMg_WF-=%E7zupfaHGd-ewNDQi)wx}x~hW( zgAoIkCz!}^Sy<(UKE#_Y>1+p|JV_gAhX*+AT>9Z|&V1JFd0yVOHP_}~-U-AS_E|Ov zZJiQccWI#hi5E@Yg(!*ais*(6$##1&1RiL>{NCE^(5&?G0u+fc#w0`s_Yu^pH0K=q z>|~a6E(R7A2(Yj7XV=7)x^Atm^Y4WsapNj}I^TO!jjo(+I;l_G)29lc;P7Px0umcB z7;L4L-otH9d0lSfPM&CG+J9`K)aUV2s@PuxgcVx9Fx_QeY6~H)1;aVgH*LQlu4cv^n+5v?e4DD#*Zlra9E?G5;M2vDQYapsw)oPGF2AN_& z=;DApXeQ9N1mp+2maoHpx%q-B2*Q>BPM&L{*5~~*O8M7{Sx)9(C_5^7G9qym=J_Xl zk`!x}=rhA||43{RA~)bP>oAAT)=v~ZCVu`IfUDaS{Lie~uY3KkN&86Vyd)AB?SLpm_R<`OtCYoL&W606^E2u{C1doaa%Pm?MoLOu z(@aM?A(Y+qX$GNn{>n`d*&D{M41JDepGsFVX$gYeTR=MYU7JXwy>n_No%I%h$0mNo z8mURB4K2hUP$;G#DZ?!tHKA_!j9zpx_({rV@m;F+KH8P7@BRGT>-)L;R?@|#Vu)Re z8aXgO+_vesjPrNG`}tT@EMOC2I_2%}D+>jgk4=79a(KO7oQ-~l?SMdV&sz)@V#-*u zRhgl7{nQ%;C!42M+D2FBR;s#;ZoR{T>Qb5ewNB`j1&VO=Ipm(qd?Wt334St^R;`>0 z;DWxA#?ba?^vFv8{_rM*tc897;KRo zi;S0v`Yy}8=Hgp{jq4>&7MG{ZygBHXi!Mm(*qu$ZR%7*-1oZ(Vyn4z?lQ()qCTIKN z$t1PIAplXmQ!=Umy%G{ANvJ6Y*mFmZ{pj@etw^aH{t>ACMoUlk^NhesQPb&y#gMK% z{REJFqNA~j3J!@~xd=W;oEh0GH<}Pr)~RI*&`bi0qpg_0X=2@Pf8lySmb0%xm_?Ni zY&j>#KznF$p)5r^!HA*bQw4>eWJ*(5UT_oBIiDTJ1%OLnhC|0_EJ_^OAc-ugTAS%3 z_t=GzD&f`n!r8WkIvr4NFc&pTZJ%Xd0`rQ6^q`YrR5*@;sN+WuN=#;iTeK=x^s5egZ+UX>H-X2dg3-9*uti& zE&qHCw>wpbm|{g)E>4X)O@qC0tBMA71bZHCj3SMmk@n{wu9x1f{wtE3uNSD z`6fD$oDPgNE>`acepH)og_)mse|m$I$OteLs4Z*!VOdFbMG$NdzmTN+i>e&2IA9Y0sE7B8aq zfp19M+&@qfv-G;dCy_CP3WA@g`q3@Yhs>zpTQ8YKc9m4v{lX1isP?^NB6+x5ksyGo z0w3G1D}KFOr#10+Or60gD)=5+40A9wPCvtBgjTp8mNaNp$Au?SitVJ|;Q`h=bAIgd zauXcbY+l|sJ%s%{%0z4`R@l64Q}xZR*YafP5p8uvJZu$4v+V?N;G;>cGMJv zG?xuoTt6wI3L5OlXNR5m?^FydmJf$3F_3hbKcvrmS;0&{{IqnTe@PMixn4Qb6U|bw zU$}dxwbatZ#RV4_5QFxXhV-zUTC>M<9;`yaL{cfB#tnHHmcbSy!_X`Y0;|@ATtyeAAidq|r=pW1o1a|2;(CNmvpQneynZaw$=(4xfrWgCnto#PCh;YELPQ>I+u z5{6eq7Lfe8TVLjFumg{R^hmWpKkzB5%%?7nAJNxHKXg-7u~h~wP8KW#G%7flbu{Ux zKSf$@5Jv)w6sB>H+^U;JBgV79tR-Mn6~*YT7mb{lY6$QM(aujYI>iJT4rIdv#1@Oi zW({HcMBqI8N@_Sw&oVDDS9c&eBz&PRRs^QSBQP`ZD;85}^ka@W9OSg3>n7=%+EF7c z#aJec%HyAA?G^R+GR-H|pSpro;5BjCYJ$u&bj)RY10i%WK1`?xZjN#W3Zyz{k=_*^ zSu~d0sNX8ogOoCxuu?yyagxL|F2P_%$o!`Du)~sJIZf^wSWaM7paJu4j5dSBv@qxW z=~VxF768h9jfMhIK;xK}+kTTq3CMC5%za%Zi^FYXvgHw-uG8#;h0tcW8O{879lL{C zi614Y6T>w_cfuJL8Z_M{`R8Dl{SYo~@riq(K4~jDJHR6OHcJ`Xq4#mJvsN+Ks*kve zc%SlATs3GU6t?ZX`q5$wF`LGcDUmvxZ73ZMSy;Y?a6^=NfL^8DLQFJ)Yk75pRcX;> z3lU3lv2iY=iIK(lt37&8yKTS1b54i%8%n0%u&xX`m94Y$r}ZsbN}7fZbLL`@V+m%9 zxhzL#CzjP!vUa!~)KmFWH>sFXt}obNDoh_GghQ@Qx>f|sgNvi`PXhr(%cM*ep(Thm z;+)x?>8364vzUVNGHHBy&Iii>*W5cc*wQpnqHWu@ZQHhO+qP}ncAvIw+qO>IbDsCk z{D)iLs&+nnsmGJPAF8l11c4LLEv~~26tE`TrNoHB2OfD(1DH|y>KH2 zg9~GbADk{aHj!1bV?0T5Hs{o>vZ+0e+Y?CGB_DfJWI(Z{H{u;Ob6dUY>f zBD7}0-?s^Eu}#x*?Sv0{ZjBtx84_X>UMxA4QzfFJf7a#+p`x9Y3}uv6BT0I62NOlT zRw+lGRakuU43Kwdj>(6VlWGrko7#uYB1vBWy!pzoIKM^;#`cglxPl#?x*^wsF0f{0 zHCI(p`MP=NVAo-9E@J9WF75~Shunb&l~UDqj+T!UKqif~1{>+N4>S2ks%{19H=elV z)W&~Kjz`S)$e#ALpT#fTS!U`HW(sjB!d`IBRG2b&A#Zpdl3!O5K(lBq55MBxDv!%x zPfmP@%p*e+>(w9#E@Pi%_n5W+KIlV2rebuIB82sWklMEx6Yo=f2}!3Ln6Y3@TF&<&7FL z61Kf9(f)IGdHYaF9Cl_jzBkG?kAn(0v9jFAk=`5e_ycjbVsD&C4haVoU{K#8QT` zm!=>~O~ZHRIfqFKnzyMp01S3p30FQTf-!gLE(AAPE?UUDoZf{}neMYd>03&F$`~JA zR`$gtfmh6!hbr481SKPu`Azzb zu0zQ7P=8|(1(RaliVf~TX~eK7b7-Wm#Cneapv{L>ZQ?yM+3Ft!&f)uxdVfUMaoZ?e zS>c7nwxtw%BTs8QZkR(9vXhh~o!#+e<`kj>#@Nq!fgY4h4@aAe!N9I%q!j-#Yx`xf z6rDm@)~iiQegU>u?miHkZrozTFP#`;i01wW*e}fk}~ejU=8tp)dWcixQ#* z!Ax9kRKnl(I&&NW(XR=2f-Jx`e^)R*PlQ`TD$;YwkwSC!T^HE98uLT?NwbL~O!kl6 zf}g!B9W-*sp8g=83#^O@N=WG=^^u7@>p6)8qDf`p7#0Q~3W3T3&f0PvAE>k7eof5M zYh_#LNgi0?ti7E+TxK2hcNRndORYHvR5LS{9xjc2$0OAY~vD(FujEapOoCv z!bX%QD+?Y>lYq(u2KP&f&+!xiwA1hHEj4KQUdE4IYxnSRC%tA;dCNRZ`Yn1_sN)aa z8ALX=*^I~Ei}$g(TnsiFhz*jd=5Xk`+zRiB)l?n(+ulr_UH0T0alk!Kk}+KQrA7&G zPUpU2ee`G`8CS}}+f-uKK< zYhK6HR>-o5axveJE_*T;E#N837w%MYR{WF4^d?^}o{@g!Y7Apn(ygp*OOwX4&ku3xYI$@Q&&TJ3MDH7zW= zM~S7@`MWG3AVCS>A_~ODC@C%$mW9u=n2->m83M^LOq5$U-OF%JIeo4Z#!{=t7N z<;~af!Ra0tjSUi3rr}7aFs0c?1#seZ#$az+=bD16qca?Vd0a9!xj7~pc>KzJq|p0n zmNgJDMMd#QM-o>!6(tIf2@-{12JFh1Jg%$2xf~7}t(SrYTQhz!IiaEuy`dY(u?MUL zQ*3@fWO`;gkK6w8Sla8=sRgqYB%>4=*%iXZ%TrZC^f8@sQ?xie-O&w&LRWGr3M_I% zRWx(V2#z!))_1_OxZxbLTt>`@j4Y$@WZybdjiNZ#j_7qJflb+034YyyKy5-NZ6MXz zlNn_K`h{X%2P&nm#L_OZ+hwE>0E2p+?l&CFAPz^3*=IeW{EQYR+eFN{*X(raB7rVP zuK2W03W5q*zJI?r6Z!cir{fXn)GWmlckxUDm>O=D>L+inSO8L~KbeJ8gVHnxDgFU; zjujm4n%`=%@C_e5j$AG!k1-dAWm|rcV&1e$)w~GjjuoksTQI zjKe+f72U)+0oD(aur$!GNJ=+*JkUs?fYKfX9FksLZ4%I6K?tZ;#=6I4W%&y}&tP{3 zt!4MN=6YpGXcbBX!LZ(TK-j0*U?OMDjDZ~(X_M{Q=$=Q8QvcS_K(ThhZg z>z2JkYAhP{RCnn(Kcmjkc>F}`eiGU^s9|7qPFAY=BT8QzokSoPMENo|FWqDVCS|HJ zY6i)$BqH*}iwFJ@0+e5DNzI}&;{0cWcDACf`@VQss(-ynz3NDsyQe4eWU^YY z4710c%)@>(ni%=d5HKDn_CFV5m&T(P2tXs~*)agUIWBr6lNO zjs2$nYI}%1U@d*WJ#H9&WoGf0h4!B!;I&+SxncZd$d#94{5feZjtG|bsepjBd8c<@ zZ&j6O0nmz8T^yKW-t+ssdF6l8z}ZpadU8lbUFH~;QOV7=^Z>5RZg7cOB#}{IEUOa- zHiPj$XQk+?#6Bmpc$WntAuh%*)Gnk})Gzi6=M(*@ko%SsQ|6Tz?C<%jJAdibRLa zby?ut`;5;I_YF+&bFsducHeoO8Coc)1ocrnPKLFn$LIg}j^~5CN+n~%5PGo?=dbbg zT@)=Qi|;U)6h;5t;eEx27qwpHKX1lDpALz2{zO9m`%j2?~PFia06BAl<)_;$g4_qjTt!C?03*jgv$86dPt8m-@cm)FOQ2s;K7e3{7H zZ_6q8$&p0wfAKD9Je$vA_Ef@%zU}B#l$5~yM#Ad{sB9TKyvHp_A~+PX1Gog!wYg~HRrr13uX``*U~Jm+yX1aH^#QWfs^ zd%y85H%3|oNR~Vy#eWIMGH_DmLryM-#43Xe1ClN>?4Sx#C(n#n1p2MTQ6TDrH7o`I z%rO+EgcOTuA|3GF|K}2Rt3*1x;PBk1hrG_p)x8@CJ9s*tg`l5_Kjin|AUxm0YJr)) zJAgPYU}`ZvZMOX|N&Jj|uTa@rq^#IRk}30iztaqepiY*j=`H}3t?T6)G!2f6a+)F99URZXff?nU zNxo%#!PooGdn?x#&!3|udBrzd?%sap3f!%($7b}jy59x=uMzy~xWqL0Q5M)J{>mH3 zBci8}c3M0T7d^y@!)V^g?1J|(JeR?S*Q$#pIDD>7qZ6&^4TQD=XOMF=B1(Ya^T0O= zpl3wVy7Y>1BY@dYu_Hs1CTTnp2j7w6Vc-4inwj}bGuZ3wNOB8YK3p{8`6Y;}n@b;6 zg>Ud&-uq2WWw!1{kRqTJkW?azwMGR-hD#=w2w04<8Yqnl8|0wjRbU1}fp-BP6CGi`J?NNv+u|W|sa#OsgI22-~!R=_3Jm2T`!4sN_%RSo4Z{PW( zWZ+2rRkzL0Sf&~XBoU2>p&%Cmum%=~pk2t27a~4hD=s=B;*vL7BrwE^4hfES5=|Bv zj$j_J!d~N4AJ5aLzaP;T3?}MgIYoBnthwkdTJ(7)n{TmY9DQr=)mj|>dgo!&`${YZ z?{h#rzp-Wh^=_}vey_L3yOAS`X5c(9NFMSH*6>0z7`sUBk{xMseGPI2aL=JSR&W)b z3tKj}s{1rg6JlQ|L$S<@04J`}nc3E44@Qe)^L^kOJZ?o8^g%e1Vdgvzm%E@CVU6wT z_dOh5&t+kq5?$}Uf2|KK4rizJDjK`4%kb)ycBxzz!+qg?%$y%@r8UCT_cxp$gWc@u z7<#Vn?)G!=nMPr`(}bUj*CHJ7CA2hpOyA`p*pLnSopcP9BLFP1DHxO@*l# zzPHgpt^SXgYWeLlj|6ukRZM4Zx$DNuMma-3^k=pw-gwC854<0X-L$CjnEux}ay&2s zpbI-cqsN`13{*-_$-)lx!n`;EztI7)w7Ol6=TJ}B$xsHgEb?+Ght^14Fh-Iqj{9@z z7N2LA5O=rZ(3W`3egdO%@46>|FL9AOh6?jv@!zM``aQRcV@6>^^gOSLW#jPprE3bf zbJeQ~+a2EGG#+w47EUWy8k-{IvDnJGy1c&q_hoG`9Y%tYm?sVdtbQ>I=8GpnDG)~D z0BBEOwAGKh>)m4Dlwec(dav&pTIKSc{rJ`IPxwCk%In_ql}&TA zInJMpReHW}4C4@FapTv$$Np{dAD6B4`i+l;um)TIGkt%{u+Dm|F0WhVW_X`J)@S7U z5uhG&uzxkL?}a^7GQ;sa-}?0ZnqNZI+3S1{LPh<*AH%iz;Xc2}_Ufn|MfBk|#^7!? z9(K#*!{hR7Gyr1=Ld~c{z+*OR>IQQVj6X%*^6|dvnP+<)Ha6SRYBfC1Dcm6MNQ3cM zndeeLKqvJU=SReAlnRpj1-=$mU-|dETb%3t+QF3~Fo~M+hAx-d*ljLWk4g}MKkzmm z9FNZ*Qmgf_dF`Zro5gQ`44O67&9@pTKgs1Y+udO6{%SQl%}i#S>-ZhTP{ZSMN>MMt zh|8m=o-zq)h8hGV!A}azEg^sk2&-UY*~7 znq6LLzxp!6t^oBKu7YsQ-0par>3Z*!B9rreUO&q7ed~n7<)+bUe{5pc?|A>Vx!@X& z*Ree5@fK=Z3>bXs|DMXL=5`kBtvp?|I&BQL?RniFfsyb0x1HMT26ho*7tPyEuyYvGh|_oPG8mEaPL1UP!P;JDBk-;O9nQj zvrs+wl+bMXg2A>_H>AnTmd)1$)Qa-`xLma}p6PShNPLs$_k548s_$*EnJuQ&?QpCA zVUD}`S~njtkcc=>HS7_VsqPoJ%hRUkul!fncUgoUXsF(d!~--Y@>%>O`P>!)Xb4~7 zhK4W-E~Cx8=UFbh{Vp^4rR72g0vlESAwuf7BU&0;{6DrIM{fmtij|dZ`H!NMl*Yph zC*VVI%ciM3e;fswLaTSb?Dc)genP^d&01YETH!H#8D0FGJS@4IhchzpK?(@2YjL#{=wwtBMbND8>Cb ze7qrt=g_Xcj_JUusAd_9D#SNjkl=QFeDr&i11xoW%u~-}5(q{crLFOXEJ(Hgz2~j= z!=E$%%jBcvW%QibiH=s!^PJMVlDi4c>O0FU9ha5LDlD%0dd_5Ye{r>^fww4UfCy*C zQ8-W#o0Szx&aT!9&hfY+hd!wsxQU^m##`(6J=;Gp=X}N&+CwvKYJrjsFU6pNq%|&j z{l6Y$krFQACke#s7vW+-n;#3;Wz|9nW{W`ALMaZF1&$t@$L${oPCFgLbuZgpSf*;U zCAA0zcEj)m-z=*K2T_xdaA}7n_0G zss6mW5ki;GzW?C9i^bwEbq>E>mtH+v&fEIa>+Y~thM69(+3Z$Ys;yyw+%M+V{AScYek9KK z>wZ0AXSa*AOm!MTKbFJ!Xr zG#d=HLB2XTR%vH0S@^(Di@Ct%+T>=qYpC>e+kWjcp5Hwq!eoTXknj z{+pJ0Qs~*FBn5RmvBFE=VRASa3SHm*_phBUm#{i0JK&visi^WJdXcE4=%$P=hBNbe z-iF%C48@52eGrO*X@l|?W$7jvK+D!NRW#tk>R;S5i$Q|EXJw3ht zPTL)47G5cT7Vh&%iyQD9-&q*u+H|K2)9_H}zaaNZzo-B5H;EE`+t~2AS+v|$11tsv z(Bpoyy7Tq!_o*%W?rXL2jxXZs?<@}E-}JsOV+xV#q7je884ENN+#Lub9me-X=`c9l zuTt(iUbi=l&bNYtvswK&qXHo8ol8qyxLkCE2&=-E!v5g5;?AIrrYiPJ!gp^pJ={Rbc* zXA*2$bvQ6$7B&rN;1<<;;G~}!@q-EBYmLcpad2bY{0ukque)0^khqrt7z5Da>xHIC z4*LO+gOhd{W&rLz7OSXYkT(Q(!tuM-?n5F2`a1I|A`YWD6qkxpvl)4fMyD}8sJ}D< zwO$9x*u`OQw0ByIq{kGx+-|;pnsBHaEF{+{gl7WOIFm6r9M12%&Cz7Cy)Z%GtHS#B zmA%5fz7G1nzrgw51O=+yspxz~$Wb0V_olc1`+GPVfPt7GjhQt=!UrWv1=6wZ^qKqC zcNuo!?h7ofON6lz@lo|6jK9Eep(#=<^c}uQB+++LoC@wzYR#A<9J^=qDG&k8jpd3_ z3u$x`p;y^PiPVCYDJ`=QuQL4t>(5bu&wcTtuo`ZRLxWSZE;N``4upWWu%i{qd|@UY zmNo}mCNO3LP;Yr4pCXz`7ck$O$P3F8L%^V%62BLZr~v#RybOX?h*6Q<1j6kzcY4Lh zdoF{akmldY>1Cmz(j}ThIhe(Hrh|X0Sl&kE^bxmlAi6m6&0+u$Yfe!;@R+cv0JtFd z0Gue%m~8i45GVOE!GCd>1t+Y_2x4#$6!lDv_VoX!$~+501Ud{|X7 zX5qZBj*rLuc4^+Ms=BL?6M!T1C_09CSNkqmV&DcH&qgv(4j55Tx}$%i(Iex+z_7ub zV;Yc<0J#$gN$_i50I&=l4@?xf#Mo2bVECw-CW!$!RLaz}GY( zzOXf1q0JoW^!km@M{^7{WmO3zVeG=2Bp$=r5%PiZiwzjGgI)GwNf1Dy zY_9Xk)FMe5qeSq}G*~X2w!1f!BupYx@|Rwak(@m>bnLcHDC{{S2~=7-{73+Xs#fDN zq2fG=iPO=}a{5Kb*FCRa$^?PNr~F+!rv+^7WTwQ~Hda(VR{PdgKJ+B)DE&n+*yfI4 z_MI1DZM$C8f83Zigf?1$-V8V#E0+xX=*UHh%MHWa_hO`KPg$>JDs_~&IV059wIrZgkR*cxV;USM#K2~>aMTF5C`M&XgykF{jVXQxiCJ4L z3~dyN%EQLvC5b69Z#}c500m7lb~J}rg8h6)V=lD+*m&B1ld%n&SkzGtl2HL1Qr)9akJXKkV}?_s}2?(rf^0YXwfRakjeNgqCjrdY?F}mnNF!khCv*nQd%(k zgOT@>`k7=z;T2yhZI6VW#K@R4p^ptw#Rrf%#S`aegukkxK$)C(iVl#nDjOoo!OBBQ zTB%CbN8~NDfCemEF!4MqTS-8n=?O?v7N{V@134(A?Xeq=u5A6W)$V#x)jJuWO)K}u zo}I3xZ|Guk-IEzoDXfP|#Ez#ime3^P{i_U|7e;(!J%k9bQ9BkQV?y6MCL(R6`Xq%Me6dKSa!NT$0=3UdDI%HB!wx!hos7m&Ce(?O z+A{*GU^XbxF`$-RT`mtDe&ry8@ZvB(Fvru2_733R$Tm5XCIz@kJSi&H+`t-+#e&J^VfrMfF7r`sZGiupO9El+@Y~E|$a{(P1i;)0^E4NMK?WS!k)Jy_x=^ zS1=^PONljOIii4H_R`!1Nw`qgG+tXQVmJItfdE~Hl|RE%0a_SvfzvdeR;Fy@Oh~0s%>+fqe?NlJ`+VqG=(T~p@9uKkJ%iKEhJB8C)hM*O0RjWz?3mrVbEGh zVyfS}k{2ok98^kwv1Et=+P9QvT%Uu+vV`7A8e^~%SzUuFD-&^Si4AnGtV{|YKMNd( z9*=n}9((ERNg16+2PLu)!OjsSnRiM$NhT#^j%8>YrX_Q?W~M<1nO@M?nc?CgvV3kf z99GFnM6`(8HEJ*oLC%nmr99$(bexn(9Rlz5T zWnQ=819Q;qZQofeHlQh}_D88%aipYbCTF>tx{_%u`@p-wkD4^~NMU8@+l2C1R^f8)gz%p$vtA;VO2AY8^!mv>_L_rc@Qf9XyYr z?D>XW;Z>cN(R~26xvsXR=6V_Pwd}1CMk~i(OC3Lx*L@&`GX1sc)^Nd6*eA@V^RK`q z$z*^_q818Rn1u75&lSjxR`{|bY#MFQ73m9wf*#5}iLBpc^lBbp(-gsDvgA@B(~-0c z7%YG}$|f7Gg+-@$a|8vDHzO8(6hHHO069R$zl>h_6Rx{tI5|39*UP5$UFYXdL*z^z zs=);UvpoOz*RXWm`C_vs(-l)joI>j*#|OY=1;7FP+W4zFyxmZer?te zP`HnD`_p(!k%BxfP4gs;spJuBnGg%v65A<%+gJaAm+1+^3A7sp&S3PpdPiRrybB@) z1V`=d0y)}bFl*t`^=?m>^VzI)T7Bs_2Xc~`)1mmm1e27l7)mXsDats@SBi@;OODxI zt+U1DaigFb3L9F0=H+0}gnr(hIAc=zyWbt3Nh=XBxUSR3W)~ z4Ns|2TEacEH}1<`o>=lP+^qq2TV)M0KR#n~DfLKkoJs}yUSOc9EVgs{LP=szN?ccS zuCq{zGQ=tQC61EdFuR3 zplcE%fPn~PL^{KU-8tdNa-Tm4W0)n?9!xR|i{}wUkbRYYsO&^&_<8{X9DvFq{XOty zc83-7#bfes1+#B33fh0&Q6C3Cv2Wd}_#{u1rYOGO0osfCb+Bsr=ap^nf) zi22O1T^bQYVy@(JI2QOYT7dkpx8yY=4k@*qvRhVJ@D0#oZkd6tJDh z`l77MIIKLBkE$)P{|0|unzLfh>4QL}^%ApmY`axqGY0C4nT(GjDJDsOLN(-tFyuQy>vFNh>c z8%l*IVBEqNUwxo7u|YBZBGR1yi9EYa5yhV6H|)l75)NEUVmbFS`XX=7IB$gg6a<@a zZ;I3(=dg5`lC3=fkqYu7CWs28uP}iW!PS7MX_BUJ zX>T`5)U7%lCZakx#&J_hH}&Fj3Pr)u0lbL9Y(ojj?nW!*#AIiL^#XiCUF!sC42Kmr z5t6vE2GFtkmc~6~iOQD7XaU3`=&0YdFQim(ktEgv5c6cn7?59Tb|@k@J1bXl;WhhX z8I7Oc#qm$qri0<**hwHmh18uF?H79#cR<`Lr%R*Nq0FQ@1QmDsq~4dZ?ek@a_XQ+m zrKO;%ewtBn8i6&I#z@L)#vm-*QJCLapNlWje-fm&lzgDqS*HzxS(FcDN*zc!|2>Mu za~V^N(-0_^d4<1c)lLI62!$1zVkgZ-J3O%&A%p(C2$FSrhYq_B0bRrdKCp4qN zLOd%?YEb@j_F^ucaS}w``Jen8B}zD$6v>pZ zAs|HbhA)J&JVu1j6NbD#RD~CoHLuv$hjaZ^QFjOXu=`6V+F9c^tvENL@XHxUUn?!JQ zc5)%hqJ00s2*+V`QnhTj3fG}&riIXfi%@pRLkHoy`!h(H@2roY}uyKNQ_8a?trlXWx5vYl%E7F;;%odLCP_~Jo$N>;< zM7c1JF?#SK6&lhUku)Aou?i^=a$g*BVL>8PzIf-{!U`-n5KWRK1w_9{_%k8+K>lJu zztPx)(>D&bSaj}%Nzy7T3mC|mG$H9}(_44Ce@@nSoRsZ7nYvS>w#vXru_O(TQz6Xl zu|OS5FSf6Ut!{OgZ-0&4Px>D1k;RrTj~CHEHaL9)oq#dd zaR@8bYBd!A!cXEY0WY_KcDXa1Igr93En!0gv-NgZzK=-Cc5oa3Onwnz${A_J6>GPQ zfkIwjzc07sQ1>e1e8?GqPILIo#DA7({@JHQb0#pe>@4vUR|^^b&H%D4b+9V+^lL%r z+zJGhX#$MhlCxCv#xzLvmK@SeI{mT~vDj*)n8;8n19`x66F~73N)PsExb>qRuaAOc zLP>EMQbw_K!G+G2iaQmM9f!$MHR1(( zqEGi5bD-@_4&-K)^QhfcKj;uk1Lg`&(rAYkNN`nEL1eEe9uG*a)j6hu~bo0 zQpi!h2i%Fk4C;EA$H5C9$I&nH+R2l5YeuF^*l4b*be8V9Pc>I?J{l?fW+vq2`}Cr8g;mzLse1vzE2VnkFPU*`@CBmdNOq;9`a2)l4lphnTePWKMv_{U?@pTLJqGzR zSkDKo8P)RM83>15a`Zi+xC6OyBStY_f9=DvtsKg92EP%&uzzMG%*Lv*0J2Oj(!-&vZI5OVTYEI$45v@d_L&zSP+V)(3>Hcd`dew0Y>Tp zJy0IY1Oh$+ST>k8aW?@EfR32Ve|(gyU6Y0D#6DTKhuS3H%0O==u`RdlH+B=XCCPW$ z);ehOuLXP;N+adkse;bdH`xYj5T%Y3dn<%rq|YVJT@hmlj}o6QQz*YPD9rT-BqIYw z$PdGEw*~xYP*{RFz89SwMWm;|K|;ItPE7c2{Q!au9#$ONu9~_-I6R@vg{+E-3PVeu z0|y_cn?<7J+ zd%o=#vhKge7cX5UX*p}XOG(`ouAQsEkm48aJg5`8@~c5-6JbCz=_~)cer;){j}(<3-=pa2C5LQAAbrBQD`n7CitA>FsQEdeyE614^r11! zfG~jWZqf0b9aoouF ztUlZ~oo}HOApM%=qB)3TDS=m8(NXl|VL4Ng%U|L2FlktKzOxr_oa0i` zYM_BALg6sCt4+x1h_rMFxYC?wy3I@#bf;)x>4L!I%l05m4jZGw;I@cDW|;?+CmTsJ zT6t)hf117HWUa_xgN#Lj+rl!H?ZH`Q-N0Hpr*r?Ch{=2SRKBFmN3Eyuy~wLHb}ONk zK^h{7bWm!vi!u>070XDrI1^hCFi5P7VGCw+>>$!|ph69C30Ol7p{?K*eFg;JReZRc#D_@~O zNsPdEJnVt(WiY9f-|t>fO+Dy4Jpc7k|ErB2W$~%M2|Zu??K&u*@2T2=B5yJr=IYYE z>pKqI?{D+c>^1yi)o^OR^klMVA2p@V6cXmbT?M0ZA2B2GxL#T)CEj93B8!Z#BDe~E zW_0pJG6eeESJM>U4%bV&!SM)sUbFYzPurg7U3@&xYOVFF;ZRsEs{=rpfKS8fye7)~ z2qCj?){CfyHli=Z z-|59M^uCoIUkZb8^}dGv(<%C&p|4Wa+)g3SL9VZMwGoy6`@`{GVK+Tv5CktX%oHVgpptY6CQV-)Ydb+?hvACRL`xx3C~S<$X9hxAAgc^Xm2o}- zI8mdf<(q+$v+|6^Eh#f`E32z~&&OY!b2Rnm>oZN4zAq1!$aB7?&ze`O_Bgz5NVG8| zxzTQDpVt)7HtTx?-w1NRWM4^bDpfs%Jj-N-AJ|eyzScybNf1{r+#4TR5OuO*=tA7! zqGy6t%wQ<23oZrQ@7Z}Znv@bDZ%-Ix0JGOiSDP2;eo88DI2`<(t>&rz9=fS0S{Xe{)FL&F`XUh3%XU)cGcp#FE zM8I6(`rI#nlirg@WAbHgfh2=kU3P~z}sc{O|v)7InJLmO0$9;CX zS>YE=;LVS{fD-k{-*xzooeA`-n$Lp`{;Ut+|K4LGkHO%3Kb-Ub-ZVn2cvM9=V!0KE z())n4N>=;~8ZTlwyLhP~8SeP4VM*t-F`dYiPhf|=1H*^`i*tiB2Ee|>W;KJu)?qpw zzeUpC`8SwMEE3y;cX4Jpk_iF|}o;>+RJag~#i4*R%Jw6$C0j z{k|oRzY=!M$j!H5bIEJOwVE;fb0WS6t>UKN`?4a;?Y8GS$4(1`WbT##AERO_+95M9Ce!*j=Wh++3t#L_kGnj?>`P27hEjx3M|8q50oAGeB z_dC%`9Ih}xLrH2gccj=~EFeueZ$=uca4KOIz~6Y3e9&rrc`R@V>&d%HDOE(!=KU|^=*X|qyoZ}Ya*jZV;CfT?;R<{E#CK`amo=rD`` z7hM&s^)}zz6CSsPTm6}7l*yV#ZsEs$x!35s)<9TpWkT0nXsoIw&SwAN^Q^sf_i`(5KsWOcY(d;&NG(88+Yc5Z(Y0*@f&om_>R~`J6~j z&orQtU>vD}9>M2&fp1T{ug-1DwCxpQgOP$o1JS@@VXp73#{IXjSHT_mg_opI7^uN5 zDQ((N4YHiFHEi;Ja$m6kgo1$6402yd0VOFjqB>NfHb?}bFGRlf*5|S%aw~*3b8cQ2@-#u#_T`KuXvf!Ocnn6B%WkN2-1z5oJ(`gq6&DWeQK+ z3Z!YAVGzg^!c{Ak^y~W#g9QjC;u51Iu({8@ob9w#o5Kh-DqxGiCUr29*57q0Zi5ZL z&2u3sXyx=?D0vy?OBP-jidixpv_}#1O@*Us=Bn9q{__&5tKwI+I4plgHSKU4kw3qG zEJiZV;;`rY>J3-kE!fNPmVC)y`Bv=vkXs}?2dhG&G_IFk*~N(vc~vI3{Q_(*BMMU> zZVwI>3uGt?nmU*SIr%N5XhppGxBCOeb;P9e8{PVcn_8^Rb-thL{d?r|`RaRKHtGEy zqDQ3DZZ_Nz$Z)420v;IeoFy)!Fj03%td3YIMPhYE{pM|7>u}X|9WSb@)giIOXdb=! z-~Dstxr~oH&|&eJYKoLUwe2$?8G$7m441;X?t04UkOrKXntC5pqGC-g!PLs$S*Kvu z8ynGe8r+_vj>6%EVmCY;e#yQ0#||xv@Z#i-kU<*!U&;afjHblbkS;PKag z3~6zR3NY#Ebosn@AKm%yZM#3NA!4ao3M^Z$+)oRHx!Y_#d^ytufmgFw>m6cSHoYj1 z$W99NPEjnHxne8W2hMS2gD?;nYmTWxrwtkfJE2!)RaG(0V6Z)A8wADUaw}?gcwQ&o zB^+Mn4TY`1+%L8h=Wq$U5o4QB$6!=uAt~|Kse7Xo+;=5nl`nxHO9UNB(=xp7JQpYU zzvq6xKGyDB;g8wv`d+p7Iv&h)qjR>KAC3LrR&d?7fA$lHvJfws4}<>UCwn7rm%$v+ zj>QzWHMwFfubBzMb5QKJu=Q-W;b|&!x!f?-aintD&rsi&$;KordR#8R!ff`1MGq6( z+fjfF4LS(X5q&m~$8Z9-UEkw-q1l z)1xfBpF8~J%k)n$Fs}FYM$hZhOK!%81%@1HQ4r6Km~G;JTOX1s0_eoi^3wJFIwU8w zq>n))i_xSKL}4W#mXydctnas*fBQdNvDwz_u9qu^?hS>(;I8-Tih^RzMYJ8{OI%4~ ziB~YRcwR?IWTj3!pg9n$-yV^t=4v?E&mTX(G=i@m-=7I)yC1GNJcjPZ#B^++QNWQE z92=2i5_wmxnSQ0U)-sU^XzDzZq+xtQRe;cI(1zVGR|D z0fbdm>VZ<+8W~ngR^AKIgUUFf$dDH0_92>(#moijSl~ZeAZF=?3Yo}kn;^wv5U2=D zRsiF|jAuMLvJs%y<%4~TS#pKRQ9-VJQ^|6lUjG@X0xdH_OTAvb3 zjoIVzxoBip`Ul0(4HUo!s%;PXGlebJ;6Vp~#M{!AkoCtEskB_U%KQpH@@EDEF zV6M6j)?}J*gJtdGur}K|twG~>EY|99(Fl+0uy`f#K&8@wkjZ2$j%;;LKCO5oHv(n! zMP&*P3E~#2y~8Jx>2i1+r(bTi8i~y}{;K+Z<1^1@0;F+npx2~zU_|; zS0k+uuv$TWD)Qyvr4>X*wwn7;V83^a-8Yzd== zfHRhh$oU{J-JmG>0d)?a8Z%g^BG@fpM1XP5nFWJ7_n@RT=ZSJpF;4>3;wZU9qE#w} zMkBqw6;VHm=__}&bQWVFv(h)VHdu>#MU3`QUdcp~0%q|-Kz0m!&;plMT!gMFCXe~?eIoH3r^oqt z*rsfAeoi#>^eiT;(SE-l?v{E7!bya7gD!jfwtpmjxgxXxh3Fzj=yAVC-~&|n>vG0} zgk&!Wq~KnHTE8Vw0!hYh^?y5VIEw^kH&GDuhsE#2zZ@Tv64UYfg*Ei)S=yfHsr+;7|%~Pqr_o~o2c>0Cxn7V zBQOY!_RBw^2x)+no_yj+>@hY1B_TnmR|k(Fa*Gtg(9xLO`;_&LqL+knDWhXbaslpHkU1z>ei=` zIi=D2LPD*~*K$_s_b?5bX-*_Y3|}S>$svuZy+@D$vf2l}Ee=@#Yi@|VQ}L~#hLsqH zN*);+NnjotxBwn9k6GdeUp*EVrmiFG5L7yG57YrnoEEdpdgp+Yc<2&xSa$!nEh)4x z;Jnx}zFGg&1JNzStO< zV$s1xTnZu)fj~tsH{fj!51RIlA(unW(_uw8BQa-1y3Qp~kils!HJV^v6*e*u3J6KM z+ug_zl2ifD3bH;>Q>rtC#FYnz9aXX<5#@~)3#_6@Yz;KY-H1-h02=lr?&+0>%tS_Qmk#N|`+G^*~(PF$s2q zs*!edmCb&e$8b7B5~zK z`uU2l(`UCt?4P|;sZ5Sj8-~k?iYho1A&BTCzGeiIN4q(@9c0Ww)jK@+@IwGf0=6;G z!oXJlb$c*&%J+R}{D}V6+L_>c9@|Q9v)AG|7N?s#dmb2VyQ|gJABXeq^Lncc1_N&; zo^a{!|2xiob%8ghAj;hl3l61Fsv2(DQ2+f6|I70^VuxG%oNcwY-tIfTpGB|F{;=iG z{wP0JQ+2*fY!doCYmz}?u*zcCl~-Liar|$T0>lGHDfcC_MlDm;Fm7q!Cg87o#$*eS z$z$^wEDv99^6e^Wbvu1HXCH7lD)u&l=Y&8QMDtLIinExMZwba%yFrfNW(XxAS0osl z%-Uo7EsvX1+BLuto8)b3eEna#Mdhcx8>@`R&G8qD7IL@RtP_#B-EHwV+j{VL8;_c8 z31lmgh$`5@Aq~bm(cTVeSbR8>pL!}v&hUGnUrb}uY2b3KzX28qJcmU>1PIOV@ZIB zU6)bVY79&8M`R0pKUMTOZ5Q49zF{LW|B1_|rTky3pFvXXw!5Y$C`aT9jM?VX5UCQc z6d4_)IFtD1+J#8uUy@VaoYz5CU_)M!KR&|K3+!t&xU6;rPCXFeb(EV*9>Y<9 zz(K>{oPo{U;Q6Y|9umI3E{|!n)arFUxA%lKs@QzT*SEZ#Lj4i8JUJkXgNYinqJ;z( zjLk-?qUpWu9;fd9v~UmsQBAM&kTdFx7n9Nap9a1HT^>Up?s1tviRf}!eP+@%bXD)Z z<|{Ctv+lp|)onYI93S5|oqX?4+j6-;t_%0l)q5Xn;Qlb8;Le=0h`%-#I1Gt6Yme*4o{Ep*udmmlK>%kfL>rH%1JstpUSe>mKE}Gi>O+MgnfZq=Mwb$O> zFG)gVOw=_`?r3T9>y;uw9|{Fa@r1pl7O@LkWW4gW0raJF)r4(?vKu z{?8Ep&;9yQd|#IxFpT7_5NqRLl_V>6+x|&*2#uKt**rTCp?=pT9Btg+B`CI63TzT+)Fu6 z;+JA?vdQJcAX4a45dt7=!Ygo2Y@!XUKT0EdcR8CbkNG(Re#`mW?c8SjdwmA~?KRsi zn*GNn9hozZYq+6crX32_lDSSO*gllKeZo0ku}EVY=5C`IoZG z=Y-^3?)K+UC)Kwby1a* zZ9Xjq2SiIPV6b>Gz$O1s$?k{^J!8!xP9)~)v33SPG7npd7C98abgLgks%0*7<-aey zPXCx+X@QCqAHciS@>R}ORNr!IEa~NO90=t|A1(PD&E^B#-2B*oearj(Gu@f=GOTRpBNggOud|TA${2TuchRUGM&}YwzIzoZBDnQi zt#!9{|8jjP(*J&Vh;jpnT+Y}u#5nBEDZ}l`)IkI-NKX$H4^$HXoby_RqGHqoA+#y! z4T9&mIc-t)%6FQy^9_C%K*yvRxelm+5KIw67<>M}XEF>~ZM!vRbZBhfj>lb`BOi8qEN z-Y^*>aB%<|*wOzSjsJN>H_zKpZ@!=aOw52hiHzkS<;@ol?Edd92cD$%Q-RQS6gB3K z7DCyCv(j|4j02XQNFjr|vEjW;;jG~BJh=YkmqY(O8#6l5vR%2X-}WK~Gyq>AGz9L! z&Rf%8wDGwa)Af=?@rpr3OA=Ur)v2kVDXC&T4-q0m#hVAolAVTwt-9` z647A0f+|6ST4H6C*-_|m0QlejMWF&@~56s}@_!Y_#*WdpLje$d_tr$9D(7$YX4{wRv^U$O$9O|Ws0gu5tM$EwBtuj?jp_amon4u&RT;iveh4iEFCehBZ^1RebiG& zAcap5sO$w%=yw^&)}VjXN4F>t@0o?jAIfZ z8c6~)D>uBLpxeala3z!^7%^eB9!v?R)aA0A#cz`_1<$Ok8-fy)uZL@v<${XsLL!Vb zAWfe~UXXG>4prhvMVuB?ba1NX;=iQYCCk-Lr4sX&87gA7Tm*46H0E?t0Hi&zSt~e6iWtJG3OAd?6)Ct9D*GxuurekQ!*=fFO}nlw(oxyn!>HtP_NG zCbgwR_5s4cw<=`GhiZ=??A$SZ=9`NFAorY=a*dfhmy~f&Yb4{77FiU_450|j)T;b1`?G#|7?mAwB!PYv z^w?T8(i529{wTeCv0yKX4~M=&!Sv0EZ8LhPncnKvZpM$Uo=P0IX&zL_g!yS$raKp< zKV5E#PT-Fo+RXoCuW+kcJ{XNEC2|;p-NKTau&O_RTU?i81joL<~^+# z)-p!a42NUY31G&bM2wwXN|F1X*>Zr3Hj5PORRQ)~3iP60Q1fY8YO|r^i0CFI@t2`! z!T$h+5^P19L4E+u7T5eayAk6W2_t5S3BYTy5~-%vpxq zkL_NXws%-_9z5D6_3xnu-e@|+VHSm;Ob5KA&r=>}DS%xp!+9?hahSBO;~YEf>iwt; zC#hp|fM-&fripcIB!OCy;`*cmH)ihl%5}L^w%9>MV)H~}#RKeULL8(;iw;p-H0>|~ zCi%me@mVD+ooUur^(Ppp!(o>aRS2kP6XAOZhj zxEXj&Ni1Hbl3)66(J2>?mC!8trW_$jePnx%AbNa_aKL9{1C`%?^TKWaH5xzLW09jD zU1@fRMADg%;=)f8S9&r93G9Y4T*po&y91$BE289;R0gu8N2q`_WX1FCb^TFI&*wvyIYFZZ-@ihCRE||Jw{<(U$YPtIL<7%zJR~C zDwIl;A9otJwfNb6=c^R=Gj7FFiv&=b1tA~N=2aj5*H56Ym#}&le@|BgNRm?`h=c`4 z#Fbg6tc8w+DN%429Vf!gUhqV!XS*kTLOvO^}jvL>kI{v<%=nCP%1kl60v$O(`D zro^Kx@^rO5s}g>dPc~Z6Z^;UWIs{R2X8_y&S1a8xx$nCeoLej&&Xj4Aw_boXLgyI2seRF`%v$`a_2KT$bdx__T2B?fXZ7009crKnPhgB{0L$67UNg z7OTa0MjJ(76S@(OQnW_Gj?nj3&{f*k5vm;G$G%lOu*%;OcwrYsO|TDdHW@oODJhVp2$4{U#W1Tl&GL6 z>!YXkDZM4ISZ$O<_4vRD(U-(UH5Loa^;`X=zcGYiFEnaUc<)voAh1h8+EG zkendCDdLQr7;(NdlPZ;DLZnktO5)Z8ksLfSBO>Hk8gF#D|713P=z7CHU2N~vhZ@fh zQE~n5AbFh8ibNf8DoOXJwbt|GHNnsR_V0UZ z!~gvprN!4}vPAkJlgs$yHKWb9W%AaS$K&|71Tq=qt6>)~X2pEPey9633G%nE$2vZ) zsQZw)`A)V8l7xhDfB>ZBN3ga0uTq02fE9ddu)IRCMlG8DFgPlq2xUB))lDD>K8^&C z2m}#OkN^-Np`zu@kP<4Vs0c75;i({y=gsZ)lY8IB4hT7{$H|$Jw8h#uaEV?=dB&6orNOT8tQTEd_KO2VdAYDCGLc|eED(a zpmF}U@oQ)8(zv1gU*y-7OiB-H?=~ZPy6G-T=Rsn5zNNyCJP(h{T1!iK)4usb*0!9A zOrD3+N%-F|wy5I;#&}d+KbB8VmV2r)mg7+=(>E$~U=Yva|{KK}c$ALwslx+FTFfRJ#_I zY*W~;1)Z?Qt>gVPd(G|L*a-Ki64q96SU;Clsnx$OA20#Uc&?!Kc-};5k$eR`jKt+6 zBpSA8YGq-|H+`rk&qn~rZr>5A_P@Y{mX?yLWyKZt} zvB7kmcfxe>(^OT|(t2K_8HaK%Ejjk^as%Hi|Mv0!7M;($g6TXa$9B2j)vh-+mh|JH zW@e=qK#XT=b+*~*WpjUG64-Mo?kVYK=il8?CfLwv zqFy-($f4jj>6uY7)ma?D5wuN)Y}2^neSGy-9oiC)?seCC*}INxJ(}@@f?llI_oslH zr=;2ICbo@Rru|hzv#qSrdmCI*++A{*G+N=IC~fQLHGJ&iR`&Z^a(7czQMdUx=|TQc z?5QvANIrD~ZLr;FQv1in!oY}@6R@dc3Gt_1fi7vth1_}1ChkDt_J-$SK>Qgik}}}N z;ei-Ec~BUvl%$s?lFLiZoK825K5i;1I`4ieAN40MuuX>u;-eg`tdFOpA9WOG0gW_( zBx@6PKV*`0w7qqbrZHj*I0PAW-M?ew&M`FpQ2dSVV7|-rIhzgW}BlsD;Xn|73HcE(SkRI zmTU0cRH_d+iK^Z8#sJ&s_{hlEmHya*F*!LoI3dMEIE6wWEkYH>Vnr}%DJdwDT<3Q*Wy3{9f;a{OkfI=OB?)m+;|A02Ew>ma zkxpwebrErp}Bjb>+jn&PSy>Tw%Snl0==< zscnjYyhRVJVls)l5#sbv@(TAwlfgKPa3m2! zruWGubFV+ImyADuJK?`wrx3&A*$93TPV69A&61YO<@3)e7@I8=yHSWabg@BD@0+ry9TRD31K-MWsD}ohYB(Rj~WE* z&d%+!m>M`;YGeO#bFD_}^3%j-G3h^fcp1va>Gstrlfq;OH)+~Sa0^~JMN#cC86(a% zIy@}Woeit+jp=dAn6lJ*98D@ZnPRxDC30)jrLzIOg}B2@GJ#&_N3inu7>zAE&!~hq z?Ro3^;vS7f(-%LTpv)%vw^HEa90?0cEkDM4+-~Lv=)#|dhv12>Bb+ku{H#8zLrW3D zmX`y~3D`GCMmVW_Q&!LdKd%x)1a{dcQ8(_N)7xaQYTNo~nUfc-&nY*}V;VGYiM|MI zg>6|ONkQb6#NshjyUSb#pqmvUWFQ#RjGNMLDJD9-iGna7SB!+37f=x8D^vtn!Sp#z zbT;Q(>rc>o(&QgXZKgh4-BPBga>Y_0ZBRr#O)zW3#5l1CwutND6ln*-8Tq{Qh++c6 z6&Zl1`{4rsr!6p9EE;yKmT(z!@{Al&>L_Qs9Wi$G8mpjIJ+m3@e`+|L5m-5hbkSf< z=k@Y!;%>L-iGYGB?ItdB-Vb$Prp8H_-vS4)Y7|cebLn`Pu(TQASsHFxajNY6ujj&! zs0BZpot=83IBl=nw>3AsJn4Dv=E!9nMml9!NJr*K%)SVyF0(V*4IY4yfMv6It<9{h zt&J{G&AMd&Y(TBmgq{%mH9won<|St*V%xoqX|b@&;-kzg{u~zPv|;fbvl5hFz;iFr zj>tQm&b&&+5r|vP8QGFd7JFupV1(`PI&U&{(ciR5^rVKmo$S1#zq@;IaSdz>OM6ky z-7R_JNa++TKqyv71bu>D+2Ux@$j@gr*V%Mk=H77mEnXs%?|@ZKDl$R_VQYvobqu7P zJ!uJM^wHiPb-*8oOaf9@QNe)20yYB606bz8NEGW27M5q(AlV&evo zq<9re1S-whZ>j*oc#)KASj4)9ka${!CuYf3nr4Qrd4mid&kzI-2vK<7cDtL{7WMy7 zmtMa6Z9ir@DcM;AoN@@OXeXPBf!$YA%XBK9{|t;008{(UoJqQlo{_v1fJlRLkuQ=0I-Lb|X zfH=gZeSEhNpcVp0xCwGH(<-Vm4J-1OrsLBZzX6?OoiMS8wG#A= z#m2#i4N-mL!s)Z;t-GrT`GqN%KnTGG|7JokGl3D-L5n3$=yoX_2LjvvhZg+y?sh$%AtkVWlwbuwiF?SxfNCKyWy~P7VOefq(qUF)jcuH^jX) zjQsprZ3zGu?n8O_y_NA+8sAyb0gvu!FPsKq_?^z{Khp&KR2pUX`BUeNFBb6YjkwVw zu$4qyExg~B`19C z-M_ADUrpzuj>Nl9u`7RtGedl~L0#TM&G2G(uNAI8sA*bIsa@Vz=-?_LRUAf$rU|9S zFP}f32YZ3ZAQAzpyvE!`;-CSMB0v%(4}0rU-|hz-@AT3lu7O*Mxd*E1t1=flkx_z(Xbi`Y}HL$ z-PzL~uJ>lSC*$-DKFtD`>!|OaP)7!k_g5Cp;|rh^lC#aXyS?AU=bXXT8R@4G_450` zYi7rvL;iMxX?!INoIC)gk&BYYn zIF-_ZTzUjMc*g#D?_FO6u=j}gya5x$jEItM351|9uq7qVvSIpkdT$GaU49O6w@9L6 zjaTnx%VzNxY)6MVFpV7+7wE;pbC)14E73INr6UznyboyJ5#U`Kch|*uu&hd*Mj2L zg3=H2&Zz8RMV-b^8Ni*uzpu;I^2CDChjv!-{TCddP$YdJ4VBMt(6WuAa|G$bS;e_a z-gaR@OI;6{XlkI`f3yd3Od9y|lVBjI#(bTynr+MwX4Q~~ubpM{ZPFW--YCxgE%8@6NCfSF?FHUjEigC%?ETMDz2s$|rDQ}Jck zFnJgIh4by~d+Q9yk+8-oFNp?PsTQ}|O=hW#`({-r5XSg)0@=BO^2o}m2FRm{EQtKa zr+jS-BS+iM=wTt6mvupcq|E!`erGDRUmxI!<W`t68L&O-w{F5P{g1m_aN=JS=*?QO`vyyqO3=C^&_oc1zpusQVn}JIl@8- zuUzx`=kNt^a*U=?^dqdr)fXhdDi#6<>9y6i#8=V6zyusJIrb>Hu=N(=uZ8`C!j~!? z@eAO75B_XP_wLMdFpX{WObpq2{1%v%si(cXn$*{Dmss81Um$c-*I1gdr2!wn>JuGO zC0+LHP$v%sB$7x2I-0y8V5goQJ({)*gezO$$W*{FXz_p|wWr{&nSI8M6UcR0Ae_o2 zNQg}=rjV+NU*~r+A^=5d5(RMUJEh-^lUEeo3=OV=b_qb5&-Hlp&O|~QANB8>--guc z(E1S}@FYGS6a|qky0hOFQ|ZA|BSU_Oa{|_yg{p4+gkuk60WEEgsrc(V#M7yrQAb0) zAax)C-Bi~~Zdzz;Mrd=NEc%Vj9>_e6P574mWFU&dsX(a$guY|`PkwH(Ge_8lH%slK zCeBVEiH&^ML|{sG24Y|xJ^QtP6RTM3xaPP_NPN>?HWur968|W!L8k@onHP{{|dHNlq)Newnp)8KU{OhXm0d|NF!s z2MMsK)UN`DUjw6$1bn*NXPP8#IgK-?dJ}0I$xt4IAmv>#>bV9YDDA^O5dZHHo4Nr* zvY}gdHHz^P6Ot&pU^c_@=>Ym564GG4_4Wd-km>WZJpTmRz)A5&iO|odkN)j4wk*?T3$@#q3?H&@KvBSJ)s=~%^BVicrj|j(n>Os zWgtZUMVVwPJ&8?~u?HX%K1nG&7-6CN`dyevqxY(4R&BSix0{xhxXlx!| z{xTig)zsblT}aIt>0td0{!C5q$*O8kw^AI!fN5w0dKga8ZFn=B&Ki~ZL%QKYMwncU z^X)8@yV<5zx721>xkY2?(#Ie!;&k|3I*NVtJJ6Bt*7_G^;sai0i7`LmmtoO}aXE?M z(aq3|X}ogN#?yP0jJRiuMt{+n;cu?+Z^#6ELQd|v5DyK>ofr1u9QI*iRAvj%MpC?` z9$Ko>+(DpdhOAy&m9Td8(f(EFg#Grk6%2~6NxeIU_OBX<_HQC&kGE6GkQ{P#RJwx% z>J`By-WO)y%oAHKCV3iS&G)(3xN(Drj**vPZdL}InkTSRlJXLIKbfUjov)2eor{I z5vXPN6urs~8cu2j98>djZlQX=Q4W9^cjvLU+GQuH-!r4>Xu zlPdg$^w)6f3-d8Lm$E8N>=fhbe9Gdvu;uct7#=ntKWovSn?<*4E(SI@TNf2hz=yg? z>!W+dp0Gm%DwEf7BMp0ue>OGf&sil<(UcR@@nwmQBIsC!a|4@z7}w!W_X^F0F5Acj z)W>uhQd8PODwU27v4qMwir^VoGPGtYp>%8`fF}^P#61vrH2&zr9J~AiUI&c z>0W?~?Z}05@%yDj8Ut*s$X`x606Ug=xXic_B6)n>#2_VrK@&2R=R@3Jp6Uo)a_q;E z2J7|OTe>!PyMOc86vjt%t3O|O4lV>M;%uZklTZJ2Bpvlot$ywF?0c{*_v23Ty==OB zTVN(#3pincNjGL8n1rukFN$S=HS)*E=&>z~2-aat3}z`-H)v*lCwqQStMKoe!lg6B z9v!$&DR7?C*#r57-8^9hoZ9Vf+TedSW3o(4?CWVA@5v7Qr4x3CH7SZfI1sX9r$Ip} z&9W@@uOjB=0eBTk&?119TnWIee;c)YoT%6Eb)Vt8^}J_+JI~DOJx;SU}d}nOqk4(?57eV7c3gf}Z$_$()6r2hrF>o`F=4Kwdz>xx@ zC^Uj{l=2nQr)i{CtRSh0E-xUl9_jT9!KpnE@XB= z^>dxHmhxl=WLt_LelM$3ix)&h@z^x>qzt6iEBe7IoPZ0_4DqyB7X}8JQ{~dUP1R0A zr1h$d_AefPf{e%?et( zVq|s(Fp(IwWS`;&;8|g&(e}N=>3`NF0}F6b4}%?17j?x*!;YTW9T=Mj*O87?M}@(3 zFb}!~1khc4fi13-5hs5U-jE$|^KAwAt^!eVpe3vVX_0cMs%s} z*7VA{7c`IgAWC)#Rk;Ln>0eGwHDe16Ev=t16P_uLn;I96KiH9(kPE=AF;P;BpQE#i z1$A6nR=vxJ2-E{DX(NTmRm%i@hq?3BEt$k2LwAw3p~TP`@nQ*vG4q~J#_el4m&paQ z`zVQrvCGVimCUqt#8P6yIZQ{>kIIZo;FA86Q+UJucg}UKa$TfiN%_8lMyQTOE{YW} z3F@-Kgwr>LE!f!2gN%5Wu!BFWDVXt|TxlqNEU$y|#^a(!9x-ewQ-SKHq6V{#MvLOM zaTyC1+d;ZV`iP6QTdN?8O1DXE@49HqNRxU#rIW;=B6(5qxtc?&bPzmc{Kuxo_3l#F z5JH|FF)0Q`Xn&Y4;1O1%fq+NG)xygmsC0)BUX=CsR3d5dnM&N@oXEjOw#dQ&mXNzQh*V;1cxi9=vr&z;^jg^sA%>VtH^`?mwRPV%(Krrr zd`u*@+Roffk!@T6OmNS$?BA9b)QPE^P+!fHLeL^9Q!zoDD?&So!ZA&j02I;GCD_n7E*JO0NoZ(HZq!J@>^!OKAUJ& zhn1moAS9puD2FqQt6b-w<*yN^ZmiPry+!H(wO+N;=*&?+oq9(%@5t`lqM;=#oyWER z8_0BmwZrboNM9*M4024=L0HZMJVZV0qIFFkO-C>m5kgrfaY|wpYF{Ep;;wl{ct$>5 zQqWk6hI*27?DNpEHB=nl>!#3UDV^K&N%`!WE&FF48IidXXns=R8W#N(c92Xx+MlQp zHD*%yVNp=y2f#;|Z`goTsL`YK)8JG}@F#^OnT8s_vtEgb%JRPj6v9m&?%qY^CV%h( z^ME7;<*QwRt4P-VyMc>>w2KVG4{;T7&BpP=f8t5V!@$37I9AE5%klZW7 z%t`618P8uo;aa93QR}e0fK~9Ouv%BkD)=&%Ikb@+Y#_TUpSYT$$Lh#dVd=g!HYMEd z5SYd}`6z{P%SLS~5q3dY>8X-t(5R$ZKOec_R(*n{Ociz$gcfItxQQhr>2u8bGLFXL z&E9aXqZMzpyu`CJz$z(~#uQ{GV@xu1PNe;Lmmt8SKdo2h}41UXRQq_~9j!WSoL27sV3fjri=G?J(cxLNRw69NBpfuwjND3O8F{u|q``pSlA z5t$0bN z)clIDL|!f85=h{EW|8!9BT>2}z8t6BtmfB|JeD8>bvER6&Bxp;btTlvbXq|ztf;az z1KG~|GJIEcC7knNJDEM^?U0$*mRj8v0}_fbJGb6@)BhIj$RSL@w!V#9trZ|_y?eb>3Y{$ix%h)49jMC7sjq1*}s#p@u;p{q&LLlZen!Y zl`lauV)94l7N!#%JJ;kr>?+Dz#pR`$IcnXLj^6rbr61PvQuL(W9_i%oy>rs81oz4KpStO3Vh@z!Cpi>6Skd{&A$U=n1W!3n;*Y zn%jC$?$i?5K9&vESp-Y-J+N(Fd-mF>3rbogEdmAUE4iU|7z=<*wLYSxJ6F$-*P_0h z(~u-nvUBn&J|-KEKXEmYN9Y<04(cBa-o-pOcD&&t5%N_p%%H(ukgUOtFgF&B0iupM zX`#H8rJe@VZ-e;5m3)&1y)^2qMgDm4Dg3q7pk}2zLu`{=5!pkhaat#nS9}!d>cd$K z8HwD9v%wIO)28CyNbZQw|HO>BZYHRG#X%Qa>w=i+`>^+kAe9Pcf=iQiQt1b4Ws2qeUelw<4#p-_TX@%t(arQ9D>W zgK(e>^8Tp+Yem2|yUkYuwe7sNX)2a+JOxXVK4Jlivzcyuyl~ks#L@6lbGa7|8q|%M z#OkGB5}1Ce`e$UomULYQqeiN5APmPR*y9W;92Y`^1oUhG$wPapItosmi%thh(3-oe zN>KG`Fi2G<0pO6YCJCmu@@G8K>;tplw8yFxK=H@pWoy?R$@l@Z$}Xoz*aT!Grpk2c z!@Q52=ffg*#kpufajVx*ay ziUhrL;Xr5v*s`%$a~@So38PBoVTY2X9e*=$f|%?=F9Vk5T;s)_3RtQSQT5e+#ibT#WjzoX=az)()s)3G-IE$kuUgV@h za;mbwSw4ssv$PYWXJUlb=W;O7Cvgll%8yjI8CJlQVc)mYVjckA-zbQa2yqi#juWWA z;uNv}oqwCl$oG@c3a0%)Epf+IuE>@I5p>Qpt0xA%LYN}B=)}Bjz}8V$H_KgnNjIY3 zn66g(D!j1muz3rXfMF-|&+#QlLoHNJSAC8inZWx5%Hf>o10sDWz?y zGnZl%Pn|H;86MG&f#mkkFgZ#42DOe{%3l86w!O`gqyWp~u!dQvBU4NV-W(hQYp{*9 zi|lT0-d}}iKyG~vf#ChR3=fB+c7-t^S0mBkS+Cx1`hYvgYN84A|IN%HWx2+{fip@WHIG3RkK#66#n#(fVSImwm_!xZ zJf1Li?$Y7F#6oPxH7zIx+x5`w1c)FG6(wJ|8C~PsLv{4XhnA2>=VXl9eI5dNp_*QN zcJmdr52JxOBQE(+XdSjs2g7b1eyQ;zl^q842i+%|b?PT{w^Z#6aEHbxaCNgnbHdIcQn}U} zsUk_(Y0NVVu_AjTMMQ~b948bLl``L-}-*&Ri<|3EaS4M&75Htu$W-JUZ(KqyjXenc_h|}R1Fk(vJrYt7HH>aghYRT$l zvt?qtmLa4(9YU0s`Ea)-mRzMxGcco0wsvv^tJ|V=7gn_^T(x}6otWDMQTQ4!urO7heT&I7L{}Xa(1I;oa}$O*R$6_f%}+Ov z#q-);!73BFHdY_q{b(ttARF2F#!niZuddGuW6iD$N|vLx+Tju9RAGlXlfV04OcTQe zM)hvpEcN}SX6(`1Y3c`UG3O%j&$b)sSKfsgy z2JstT(ufXf$?1OsXPQ1M#Ucez>e*!lkT0QlmF->cDW3>*?0SP3Mrrbp%lfAKA;t_# zN&IAnQ{w9S=^?nG0)xaI#BG9@JNB@g&TAVZSeW_T#EuyKidHH4P`?##Xd(Lz$i&(P!$nbFqsl!eXZ-wUk zqXmYm(Nk{6U}(w$z)M98C@M(q0RE`XoAJDv-G2hpXT~eC?fL4tR^nFLeK0da^3MorkJO(d#Ml_Y$Hz;)~=mA-SJ60VR zeqmm$Y5vxb$BK9DCMEZeBfTvo`^X^@TCg9OJt9;Ub`+blVQVFgznOoTr@5$hvgv}5 zlq|Ng|C}e7b(A1EFQ67f^3mGVI}k)FdLq?EamUMMQwP=b3t~jap|f8z;f_Rh_WTWV zwOR+nytM52jqs1P3Qt?!VjMG6$UhRQSMe>dV+*Z%1-E$=HpFZVC7!e$kmpGp!_MDi zRMzb`OuJ$UMjJLiXZG4loG`=mp22fHhAHbT9nSv!Q>G1F+<)#3;ThOV^g|+Bh^z0y zM)9k({*v8|gBQG)6~MM!jUv!u*m~II7>*u20}1nC>im?91LxyiN}!pFa#}D&X1E*k zmNN4MIA*zMqBc@Dia(Jn+xPAqZ_!`(XmoQ-<~P{w4FtZT%UANxRi%a%Vc-@xw{+Zh zqE6fOsa4(7(w`+sEs5i@i5R>ML7dZ;E#e_ZuW@>9Gvjx<$PC^jf89aO+sL#G#5r&~ z#k4g1+xq(US`0!6`MOPin~BsuNLSk(ZP2l)X#|0!6t2%Zq5}9FTkMU!O#2!P2})*n zm(k)0*xV|g_>!9OjgBkXBDcq?dNLu$IEiX@;Uj_tN53%_++u&zUGcrTMK6G6-UXG= z4fyJly88bRqCZ&YEM#|HP*tn07id2!WpmZo4#mD^V@;i) z71Jr%JS#^ycK~8A9QrgQ*8$FqBVsvaH&M`V#v#f9g~>8yy`v*Lq^!>hGoSoq3$JNdJ{0`v5RV7_6 zMn6U;7ypUAl>g=6?Lw}K?Fr;O zzdZ|_g1BWNzzzT%mQU#9N^>QOQJA}3V8V7>#5qTsr1c5rum6$@_dZs7Jw^Q9HAt~R zcK``EDvT>dF~ulc3YBcR?)&@;|Kg2WK=%U4t0vk!dg4;qZgLtf$wgLu3wD@hM+-AT=a>WKp7>IzenU4}DR0hF^=6*<^8k6e z+isBvRiu}!T}nT0mljBEXQw?CE+tR5b;z_^uLC)x;vRk{)t11IrW0r-vYtMfe-iyI zm9^UGM>1Nx+Eqtr!kxdHSFU#OKryZGRLc}G?g@q_aI8Y~2ip&~5szy93dB}#s968d z4~b_sB;s@42rycrfw~Llczhk&`B_Hz1doWi_QAl&x6M)SpIDn(SIr)Mv3ROctK!0` zsIZI5p=8s$=!1%^PqFrt~{xfz;$=H0Ca z>@C$Y(dZ*Mxz2+mEEup-sEqNGWz2QMyJ+e+Bu{;bNXgwj?bAMlLr?<)bwn0SDht>V z>XrEpB)$ph04GHl3B!%62ysosVbC>V6XMQrNNv#)=g<XIGD75i+O zJ87T0U;qJB_5lH{1xC#!)QAm4xHkIETeptjM@PXpOS$jpZPR2g)f^6z0&2WRMi6J`5mCm;Nt7Fu)ZiTEFP%T4#404Q8x0PNlVe}H zi+b*kK}(@Kh=vBkjorzH>?%SHZ5dCT{8*#MOw%1xxfqtuEt1K4I}C-!4JlYH1u9H`^2kV`cKAa9Ix+r5VVa;;F6#9VqM2JM`y0eJydL} z|Arv^BTs}N$V3)sPO)M^bfMEJ;ZJVA^0866GUTGcw>oTs);xR_Ecs%G%(;J|jFtbhf+Ll%ek;0Vfrv7SEvp$bl}dRr+yK=~KrC8EG^VAKr`&33ceY1@9e zM6}Jv8yebqeTpJ%`YcaNzuRwylXgrdQWZ0|{I^WLq6^1{s6CarciG&>`xz;1Mr7e# z$BagR;?-Y4!F9LXXnl21J4jxafc7)ZfKfkKP}1FzBS5HQW1Sf$L&UK$ZX99B?1;V0-&`O^zNntKK?q6YAJd3+c;T4hq9y81 zsmB4_jSgvM-~I}z1?iA;;IY)QeFPIJU40l|*}=^zue&USYJSI;R%a2@v%oQU-*=Uo z2^<#Mj{uNqZfabjV$i)^C8bpc5jKeeVGFvzMyU?s7Ifm{Ge)Kazz>QO+kn$9nlRbR zH_YXiTp<{(~yJ7(qmF{b}J<_K?u%6}A zR-KK9h{YSBCdLinrWPtnAm5DlAhwx}rv`+((p}YSA+u?3_ruR&<_^tYvpw!EShY&^%2zoIds&G$I z3hgYRr+BwE2X0m1I4`_!n|+i+`~D%&ZldWTJoxOWsg@88x3agde43opVP4~3VY@g& z^IjE?Li-uLK_ALX>A|VEBft}{w7R)A08b^B_qwo42DyDA-QX)S;OKdHy+P8)*}hQh zEV9uAgj%}+@Y*(PPms@fg|D#ijI$bTe{iy3tT;PQye4*)hhtsA#Y-`zwGBm=hFBzJA)lQdu8QqS=)`fHiO zCE4J~@d_eh)IV8}`I@&|1$cJCOtE8)PZh$-ECXD{-Y!KQ1Ar-)(Z|Jd)x-}g>-~DA zoP#VQ$_yr$!=8}r-$L!uVikW}?j@K3EvkSjw>%B;k0)Ws3e{gY)Z{3{LM0{9&5xzF zfzBx~Xk5d((7ZH?dEYU%?PBOYc$KT8$WpjEI=*m?T+Xw>c;%itNdH+^H9N&Vuyj~d zY=qt4C(%T8Bik(-O?XI3Z=H*{tmYPi>gMa6Vw!Jux`lJJ^)Hs;^oULLGPoZ}U_8PQtlIoHmqDvO+7OK-2av z`$C4i>&)eUD@lD*?gkqnX=8<&SGa&nnhPcFKUV>w8OYxrLo`nqYZdb$>D=XQH9c%x zr4>+EM|tVH=`4Z z$A=4Ja^wAEU3J{+pgh2|-Wp}9Rn^ozUKZln#^4=kMy?8HFovkMDjq!W@`A3WI~9LC z`u==GbN^-63;*s8C}Nlulfn>mx;PL=rGc5D8D`@64-4te*d=VorRDQ5rsp5*HA$u> zxt15n8!NYX1NIG&QVH+%fcU%y>cP+@IYK3Jn#jAi7@TqNol+J)hQ25Wp0#@9HcPZu zsMLR~Q5Uge>WOoh=@o&F2?1=JLmA9Q&+j~fqp)JC255d}nT-Rba8cARdYC)oyX;_q zadS$QhyjJi;A7OH@10_IcD6Y1OFqte;`_ z2&_?NcWNxU3kC9e@K4#aZC~l}@q^1ll$)AVR-Bu@0`m<lT?B2{r$Hr0Tpkls2=Q-V89_Sbyag$rj5I-AE6gxAEEV9Cn-=ot;(om(*ApNv zxHnXk=7r8vAOF!mU=m_1Mc7GfPHO=UTZP0oTn$Z)aB84btM~$9^ak=-Fs*W-qfx0f zdzDrdr93dI?ZRl)pvIt4ux$`>(2pTqHh9v(L5^CTB0jLrB7d=|VX{~)*Wy+On$5Y| z*TlB!P^XZ@UjW74$&ua7o2>2Ae~cScA?%M{rlkRix0z5JF&a{t0g-TPn8Ge9s9VRf zD4c-o4jg(ZIBVX>!RJ>?q~`)NgJ6sDILnL=m^fN0O6`7c;I#6QofA|!cbAcF-zB4p~;+)^e zs%z^J8R&L`Z<-;C8}p)&qPJ*;z<7nIrZ?NO*HoZWO9= z9CJ@SZa_lR+nW!rHz&bAnF^*JqrH2OKxKdM?t^JTof}5%l+t(5LJJi9-!HR+fS39r zuEvEsy#nKK*|c|o+3ZU~s8?xy=FT5CJEs{!uol^Ig(+&ot+IKt#^@gwRHR|nQ#JIe z#ud^;iF*rR%L->$i()K_35kaRhL!!Y*N45hsvfQKfW$&}9- zb1tRHWCq~wE$JTxGmZ#zPb8EbSTSjsXd;Y$ZH)q2y?zIT(`*{r@vOs2as@uP4fGF} z4Iq<8P%%xn?>mLD@%?W?reDx1T;d=v${vh^?;L#Js$(eBQY^NA$wJ0i0yELnqgO_C zjfr_DyTyOv4BMe?>jM4dT^g(hih064b=jV_;j^4HL8((>0jbGftM^ty;TFb#j+uHy z&xaK{y&dKGqsg^!S`M*ul=N5BMcFK(!DmTB7mn1G2B1-mxhmdW`pzyO-$HQYr9wJe1Sfm~gaCT+b6X=ip3A4vN8AGXOwV&x?BOBhA<%eAK> zNKf`ma3zoFaD7RlH@J$z!9&FHUU0;8c-DFHja&Fs_3oeliRK+{<|HUga6$S*1u$bJ zWse=1HH0|{xsmo-2>dbAIx1I;14V%RQq3AD6zi@hAVrxLO=2GWqpsaqPpTYpdanoY7}oMEO1K`UnX4%61~Y9+Xa_i^^nlUs zsif0wE0lWxP^2n9C=G#f9;lJV{KL7C;*3d$0IzZ|LN1dz-TAc6^$N*H&h?UlEhE@C z1w?g*N?c_!2bUh8J_2=rIdn2n{kXNnG@HiIsxXy-guw^-B~99M3;3rdS)uCkP}DjPVtHb-cd*7P(ioJ`;SCyR4CI$%?iEg zP~58-;{eNu8>$`XkOSQ%wphsVap`M4=$-`agJ9BwuE(G0Jv{`O0ZD=!wPtsaFEqC# z$Q9gvX^j_B_m}lBjH6U+F&SBvMQC(u(3n;#_GKJB@ovYRz>3b!5j(OzJs%KIWwXRO zB6#I<%h#J5a}c;P7yv@6In7|6s^33G?iF4~rH-c>I2KPClGmkTeH?$~H=pBfB8gIq znEKQyxumXEgvr%E-D9E(@m#&T07dU(8nk6DBQmL!vXsq1aaupTG)QyFp3TpI9 zb8~d{cgzYj!5VjPs8qi>&GE@pVZkEX%@AO=njI(W9)(OP@opWR?(ICs8iLGjTNrBP z=t>!-&s?PM>ZdkovMd39lL$DZnZ_Tw$ti9EiAK$iD{#<+OD;grOzLkSIK^DYN8~_c zwh|A}=F}|-G+d=e5I2~r{h&W;sjX}`%`y!xfHN`GVKO2*lK%z&Z^;M1e@Q<6sXYGo z1M;u>kL2UONBmDwNN91{C-}cEDGUGr^#3*D{}6=;+dG;5M-8&9p>4m(1>=YB@Dsex zM=vKIZbX{~SAM>ZV4&MvNBdH>CQ~GsrlXs7v>P8quZY9#cu*sph#sC)5r0IUv=AQu znBmzcKt<&-%YW_S3-3WeG(pb$d%wT9`Py5~vX5vOBs_aM`0MdJn+@-bs$1m%#dyz> zh&-n+2}4ClIFo6Ws{$i&}M@A6bn}G1Od7ZbP24l4Mk(_W3 z8xv{Rb;^%Dc$Oh_wJUc=0N3BlRO zoe#!u*XN@@I7J>VglEvdynr9#To@^aAs8z#&tZ7iAklw#M*qZ6J_`n>mtcjWHXd#$IDa1@<<3O7KQ5-Gte5Cx}@3yJ8u zg=Np%c(~uIw^^DN(&@pB%l=HMP_GN_+%3~{fO$nEaji52)s3UzLV-_nb5meSR!9n$37A5h9Zy}jZM@i8a$)uid3L{r!sCN>D-fMf<+FPXn$QHl9H^wbFH`( zo=@5^NgcJdS5a#ibQpP1L)!)vu?Z${X7oWBXKuvlw5BE}r=b58iBd>`O1ajHj~GK} zYTn(@g5>8f5?Zq7&+J_y1ICFefOK{W#XUu(G{n}!y`REBsLfqp>oIHsUbdJ!&W#v9 z;Zl8+6s5^?6+^k{X_&>sf+ckhRMsP_b*huhq+CDgm6rXU;{*mK89 zCDgz4*wYK|h`N9?ufY3=n9@rt1!J~VLP4}41kM;_Q6bVNGOMTu=i<%tBu34Ddk-MtSlH@#Ccz?uni(l9%-&*G1> zzbb#PZa>Rah}i8p%hA!%2eyK2RXBeeR&BbBQi8dxkQGhdwqYg!Yo2#QYuX|?_`NA- zS^j-CTbtAf>y999KFaGt7MaIT5mlT1J*ri^ioVQ3JT3g=~PZZx@{=+EiQt_Sr0y$R$(~fz2+nG{+r>0X{M0 zxTq}?<#xfv@y%w2k!{kRQ>c*dw#TeBY(~p8s>9{$GN!|3A7IS=#+y=mIcG<2C{d z0N@k^0D$xVqKkr)rLColrQ3f&%(bqqJvKYik6-^cxbQCares!`;G$3x?Pjg%dAHNT z(`4WVuBGQmk~ZCH(!*u^&~i5N6IXLJtBk~j*f>_^e zPA|tfPGFoY(esz@sU6eXiS22HgAln8ChRTuhKt|Feg5y8p(e>~6i28G4yWPio}CDo zD4mgfGFN&ZH(y;Zot}vj`7hur5!?Fx+%NAxKaByr_}ZzGWO#?Khohs^TXjLO4cM6J z83Qt@;~jTD`p_h1NXb(P4)fy{m%E69C2x{Hp52~~2fy6kqi%6uAg=dx?M*NJRcK%T zP915`qS2$(>0@$<$ItKUhb}2tHr^Q>#4K!c9Qe17+yCi+-hpiP{n-;TMj5p$4KySLaeQ-4`_&+DRsZ z`JT?OAu#%@dmmN1DVR$S&si}>UA_7+rs?4LaTVqc3t!-INa;#=ij_n?osa@aqpR+T zvw^4QFI0bHSHFTWX9~s^!1hRA>(}1Kcw1+P1|~|-llqtTES;UK-kyATWLdSi^BzDT4^VvArF(ry^IgZd5 zyR;~SBBDp0gM4zcmeLgn65S0_n(?(uvKa4u^nA(J()d9@?1!1?T=m3Pg6KLEC37Cq zb(n}=>LFn^1Q}+5avLdzmW1JPFe#=svXG);JEH?;V#lN%Nh)&zcJA?xdw_Yd;Q8!= zLJ7XmWdB29Qu8i>l|UE!5x~$Y93n8PPY6eX;6;1qfZ)qYGm)K;E7eep zzyCppGBbI)@b9pm>^i}&;y;3kUcM_o4a|w(yn-?<%hecsa}&Pl0bF7NuMN^>vy!kt z%T29oEvYs=+%*OGbYc8I|5znBlk40Dv19(th1HkJ9*De1qS~f_+FDtYloBd2huB$| zW&2n^`foGw^1tg$66dh`*u3T}y@aRkdx+Kw$*T66*xq-VNwVfgH3lJ6x-OApc|La~ zSf<~ij{I#48s}=)j4<9Dq~f3p-6nIrMsvMpbAFQrzC#7yae|*|f}g&|i~!i){P4u4 zX#_TL7~a(2{%!MN^dk?|^z!mp*F%K8_OCT|HK#c=g9teplAt(Ksy0t)y)RNlvnbu9 zw>ccv8K)ySX)q0KL@uJOwx!HCAJ~ucQQeH}gN<2oK-PcD64nHw6;p3v<=ceabDXU~ zz&-*@aN>yPT595~Z~SbC4XiV{m4-s&L;QJ?*_dGBfmU;HW3ySY@5h1Yg3A15vpYib z3a5H_AWn$nsoU4L*ZYm%SXgA26)l`5lE1LSOs+LYXrA9jdlj`GCXf8q} zBf70d?P+gLW3Qrk$!`CR@XAwu3#gJ)eGH;ek>GC6#@vTrJWY2NgA3&ipO$r5Sy8#37nPND`>(*v|5rTzD>VO8 zymp2Trm%rg!LvUd7i>vSfGd1C-|l>0f#@eqf#bP{uu0=_s3F%HCA?AuKy zxHEX7HKUdnjt+BtrRfasmA*h!zGyb878YYA-xFx*cKr7bch^`bY*`3u%JptT)mh%h z(_u{w$53DK7$ilwQo4zzII|pIL>bmhJb;NOYZsSk#pI&&Z@H?{uJ}M_7Ydi6h2X}d zX||8*vuInxho6x~f53Ok&nzv-OcL5no$4+Rf*lk3;w8%Vv>N_)H4pXPsdFE7&S@GO7GIil9IxL$nn z&k%|kso5_do@h+bn3IWp#jYIF-5U{_iuf_8^H(kR704jJ7gUrxFWz${gcbKlbKHEH zXRc?P3et;JhK;SAbmW}WjEKr$XZITcO*X-8d=QLgUpm|YvChQJ*iG3=)nC$An4Ao~ zLH$MKhMLx8kH10n{zqk39Tdlwy$47L!3GKL!5s#fFi3C-2~L6s8{FN4gkS-J+u$C2 z2<|$BArOMQh9H694%x|j`?lUMyH&s4?&`W#-RIQ(>fG)>&N<)xTATur9m!q52F!kx zhuMET9zR4rb8prIG@vwZQVQ#Z*kM}w^s^BhKZpwv(dESiiN#7sV^=|? zJm>=hn5}HFfo8?Cbq8;g=F&I)U>5BO85zN=Tm zso@azA5*1rz$GTeUqGbxyR$!tcdkCTTT;(f+>KHO5@WG{5x|%x=}5x=M6XQ!phQ(w zW%9~|xY8{}?X}NjvNog+U}=;sDB-PGKO`ensYu5*8cs+|v9zYNQ|tWMTYI!c+A@;i zLy=X1GMmr}MO8hGEM~{-F(RK_V8BIwWKZHy%T{63_^Y1yoIh5O-`o4+5Ns7R5#cMm zdjx&K>Mc`@WOasEy8{Q(BFr5{3?CT)5(Wjz+vNS6oS>P_C+{6d zI+Y{DIjpCG<ln$% z8K9MN(1ahHn3jx@ta{uC;c;iD_xZ-@<2kI|yn|FnuF)D`)LXRN(`;B?c(9|0@JQsE zc1UzL*1z4qccDYAYwHCdS$=zgl-Mzu(fH5+vNQ58J1q*H@U0$O*w5OZ(+ zxTpm_3{OY*<|rjJN!0hrb=2ApHjud<{h7T7mpvOV`Dvh&qJn#q*_nHg8?{J%rXi)K zraS$Nw$*2B>K@%1uH!ST!Ui|LTrG`Gi>@$5KnUkw60MdYeG87_R|E#%uk|rk6~bid&2nfnTIyzi*Q*Sy#RKmh;h#0PG?sn$Qehj0?#s25dc7A=0?>|QRlke9dyFIEhh^!t5Sv}{nh8yVUk}ouTseO98 z0xYM^dA@+Y7@c0Q-aT*2hK+e4a;vf1E4ZT2hz2jEvCn3n=PWvx1PE!u1rpb(PW$KA zJ_&L7pQkY#Iwe|KGisCZsLU+_WLOQKO>9RR2ti6Z;R~nCpOl9UyS%Vr&SM)1bkx(Y z?XX$j$YfCTXNXPZIpHdcDnYyGJA#;t-KmGnO$ekU20Ia+-UQ!6Yt5En-p8bzt;6o1 zbZ4hWN&P_9`SkiSKg4-L*|=HizQAtsds(t`a*g~?SlNX4flsfp49iZ8BpT_-9#P4U z-t^3F5{Exl)F;L8vuhw6G2f7Sh~xy%`fyGzT1eq<7;d+XqH}rIj+ecG2BTUCNvThm z7v3)v8{GczU*^p01c4^&V0<*#hdb^Zs%?&Pud3@W=~WnrAK#Mwl_36ETnZnH3k^Y~ ze+T#g01hhsQ*(iOSVKK|oE$87pI?EA@#(T=$h$YP^cfo-5;ie6uqaF8G%=Y;C+}$K zytFuVH@xqfjReb^u#vuRvWOqzRAD_N{1IX>sAJT8x$0K{Ak*F1pmTbPC;?TY^NHW}8+jYkWFl_@PSq z)z(Zz_mND#zP_&BVvrD}Jhd4y{HVS>jZz(=800r^O&vF$gf6H$+XJG|x80_=cz83^ z_@P}UHM&~(7&0a`Gj`PYVO=ZyK5?z(tuPV|h5e zXwH%*2X&bdqXiT7~2D#+b0o)`qvB93+wTS)dVZ%q0-7$(TBX58kbkk zM4OT)=khTr-!F?ZtKQYfkEupbIjsVjna36>l6cU0d0ZxOEY9$9E#DXUk$jhd_&r9h zFWUlrCzllVgv@*Si!k59Y^dEt9emU(sWqe&($F}z;l~;TY%>#nRgnPOWSP7{B_UT! zDG0euy+;pzygU0cp$7k^(UM4wuf-xn~A=5fus_yd2?2?r>vC>;|rMUPIJ@7brC*w*dXi>09NuS8&41c!bItYVHA zJ@c6ASaXsnI;?$fEWP<_^`Z`*16`x6r zCE&f=dLLukHu!?~!PV&w zdTQeX3H9p1Q-$-2SurUfMMA~aOMd2p@AZ4{5v<|(-7Rs~)W9x?Ne$gr#fYq$^`XzE zmp}-_yyc`bPjnpAK$rL_-FL%|!gU$7X&jVPa<}=N)uazCSn6L_;yC5ET@_7Tn(>d%Mc zMZHD@Vy70XOkQofIMnPgDfK*w;BkFn}$-byCo@=d)H!4uJr4@}qI)s2*{ht#~xRxWGE+)JFN z83*}ln&YIV3-bsdH3{bZcl=l6+(TumaEN)l@6hu~!7?=WeB)e#O4QKkS+-D`F??zo zSH9eP4SKc}?{3Ge#ppiB?TNN6a+(DwS2w$=LB&U8i?3wlEh!93Y89$P3_eLQdye}y z<{NFuej9_!HoK<>8$)`A5lD*-Re6eHts>4!c3vWon3ppRk}i}Ps9ZHohrczd7c9NtA2YHo8m#y0L2V%mnMb_zt z85?J$9U~W)OCds;LB#0;`jlCR{UlRyYsv?Q$u~GO99f8N7QegAu^r;(T=BIbgWs7; z#|?O4FDZq=jaW1n`ztAIul2=Xnj$*ma5tb%N~On5Lb;0m{;)d%g)o69rw8G9qm#(s zlA&Oz5X)hUmTP_kDSRI>Y;`b7P(^y!qRu#~8c(h{|BSj;<_VSJ#}byWNC;2TccDFh z-;_se-PqU-E<8V53W|T`lUk8C8RFXD`^9(G;an?2>T^dd9rE%sufO%;+;nRi1`(9S z%Vc4nR!}x`f0J{OQ1pgoYO%9!oMFwkR1kM(>G<8>Vxvf&$4hh=g;QB2&0}%SZ1J6m z8tFMxmX41u_=x$584g;bqY1EYIl>dLZit-Th2SGoxh1o~Ph10sKYU`Xs*5;QiZeHn zvTB~nsd1q7E2 z-J+};=_OsFf|d*BlV4GtlE?4M^l<6)hZ&x#Sjxz1k9kDjyIavtyY}=!cTgm$zYwVm zz}agq_p0V49Md+za*EW$G`ZP4OHVbM+Uc!_)BQL&v3OgvJWAnlwCG2+KI~mZ8FooS zgP{tg-EB^Ab%BheKF#i)Jx1otX25x|8VH-{71(&%ugIK~e+3@F$7d0ASsOy;12e!q zSzUXu5MxU}bb~UDQ3cJds&Y_XU;M{&W58_+{t@4BrqWx42dgI+y zE?(7Wt(NWunORzJ?yVaDeSfotVi#sGJU)F$mjh*y(oKGat;zGli^Ue}B!J-+wt8pB zP40_Xg4I;(`>(O$5DgPU+qRp^=(kQJpUrW)B&gR< zE=OR4AnFV@JJXU%&5~<3w2sq3E#1Ab#adG9ZYF3?C3&s-63^F5P`{uReyFL0BMz;o zQykD#Fsd<(NX%=0;r>a4C@-+(j=WQ4$7o0}OeJfk^d#*4$*IcA6t%C0~57bA8%z!hMxl zK6ki?3#6uvPiaQyyF3G$SvnDwuco^Gq^NzaK()wirqOhteBUd|+ieOdKQ2l$klqLr ztHLWqV@$M;H~LG;hK9ZHTXg>b!R&OcQRz}T6vjg9iEh%M@K!D$S*``)p77GgD4LsV zx|r2*IA$xi$~Lhn^004lFhWgTF+a~3BHDOTEvdCJ_<+qwa?>)vBXR^MV~J8oU8@m) zwe_ZXNUsa#o_W1xx%z|7_g+%)Z7UlClVrtg{sW;PqR~_&BOmKIg?Ah_<>Zt#V>gl2 zXgH4G`>w^-xhl4khjm-{vu7sbbz7XX=xsq11(gRb+q%@M^Jui#p8K*|Yw1;9rgtid z)$^09<|B94RG<57C&v=tplA6`j(+}RRM1W@Gg2A;W@WmgJ+YX(u(Ah{>^?d&5wf^x zdPSX$;f?{~iV|X_YR0+Di@MFRtA%5RZP?#|oJ5wTIsr3h4&t?!kPBd@lkcmJNGg@h zyCgD40tA?gj3DMyGRMSX?F;BM)!??)KKWgYTX4|IB=e=ZX;w&3IKm8+5?O%g4Czl7 zSx+O*PfMKK3f!n25qutHZTQ|^9_)`aA4w^!wD(jAx0B;$Q?d7DK=;;&yKA}|r`;A~ zKis)+D-JYfxm+L%Ph?l-E?lCn@8vmuNRVNcL-jobNm=`{FHShqF^p%*fO=&3#e-g+ z>_k^>xCDH3PO5H@{yIL}3$?RVJQwogck{aVDkCXt=o=+u~c{gzVJy08(l22DrTwP}^*V!8~mKs_SF-CnJYs4X^K zu!@|mQcDb{o%6SHIs0oyE!bShyIYp(x!2q0h1w@JFEX!!molgNmS%4>z3UchqO3=L z4h8B5mvPZP&%Uc#KF|Be2d#7cbw`MSExX^@LkH9OfG zcvC2)Z6i81BI;IF-n6xkV>1by`I;w`Bw=(3A?c7I3u=k0i9YDyQ$5`7ABo~YpoHL+ zxUM{o7d%R@XM|Fku8||xro=pAgxQV4Y3)VjAjP`UNN;v-Pf6R3n1WCZ|JyyrI&zvy zzCzlAXNToY9Z`{qqIw+X{elDnKo^a~J8+{tw49Krn!>?onX5J$r{P74QR6U{U%46@ z`Y(0Jzw{x++%?FEP+hv{SpWd{kNW@s+CN7CK-SUB-5%=T#^Ysg_q(Sca>ytfm3FbB z+)z9M07_)?pPp9q|E4o33$=4I`Nb))a&vQn@bbEvSwZbhTzTwKQj|7OHy$%b`@hRl z^8R7Z3*zGw_2IYD fHRZdQzfA9=PAd!mfL<33rO3)J%)`gSFC_R6T8Fx+ literal 0 HcmV?d00001 From 54ffce923c382c019c00475c27c42ea749526a41 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 25 May 2016 21:38:26 +0800 Subject: [PATCH 478/524] =?UTF-8?q?=E6=80=9D=E7=BB=B4=E5=AF=BC=E5=9B=BE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java Virtual Machine.mmap | Bin 86768 -> 222579 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index bbd345bfd75ccc26cacaa4344ba37bcbb89946a3..42b7955535d59a2800a23819495b4067259d4ff6 100644 GIT binary patch delta 151864 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 !S6~6>nuZs>cAziICVSeI@Wtg| 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 From f2b5a8d532b52d0f345b228904e93baba58b51ed Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 25 May 2016 21:47:37 +0800 Subject: [PATCH 479/524] =?UTF-8?q?JVM=E6=80=9D=E7=BB=B4=E5=AF=BC=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java Virtual Machine.mmap | Bin 222579 -> 222415 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index 42b7955535d59a2800a23819495b4067259d4ff6..e89e7b9e5da0c5aaeb4d43ac0169f8bd3769c4cf 100644 GIT binary patch delta 17448 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 H=otV2#n5Ih delta 17617 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 M^bGV2O)c~c0Dj@aUH||9 From f541ee14812dede259d00eb827c8678b7c936615 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 30 May 2016 20:26:01 +0800 Subject: [PATCH 480/524] combine --- Java-Virtual-Machine/GC.mmap | Bin 89254 -> 0 bytes .../Java Virtual Machine.mmap | Bin 222415 -> 281949 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Java-Virtual-Machine/GC.mmap diff --git a/Java-Virtual-Machine/GC.mmap b/Java-Virtual-Machine/GC.mmap deleted file mode 100644 index ea75e5a9549463fb12e91873ccb67aa1278ec71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89254 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 diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index e89e7b9e5da0c5aaeb4d43ac0169f8bd3769c4cf..af2e095131ec656a5a03300563e53519517603bf 100644 GIT binary patch delta 77521 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 Oi;0Dam6L~w<$nN-2Dp|0 delta 17475 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 Date: Mon, 30 May 2016 21:36:32 +0800 Subject: [PATCH 481/524] =?UTF-8?q?Update=20and=20rename=2000-=E7=9B=AE?= =?UTF-8?q?=E5=BD=95.md=20to=2000-=E5=BF=B5=E5=BF=B5=E7=A2=8E.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "00-\345\277\265\345\277\265\347\242\216.md" | 3 +++ "00-\347\233\256\345\275\225.md" | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 "00-\345\277\265\345\277\265\347\242\216.md" delete mode 100644 "00-\347\233\256\345\275\225.md" diff --git "a/00-\345\277\265\345\277\265\347\242\216.md" "b/00-\345\277\265\345\277\265\347\242\216.md" new file mode 100644 index 0000000..cc4788c --- /dev/null +++ "b/00-\345\277\265\345\277\265\347\242\216.md" @@ -0,0 +1,3 @@ +# 目录 + +##01.浮点数除以0不会抛出`ArithmeticException`; diff --git "a/00-\347\233\256\345\275\225.md" "b/00-\347\233\256\345\275\225.md" deleted file mode 100644 index d950068..0000000 --- "a/00-\347\233\256\345\275\225.md" +++ /dev/null @@ -1,4 +0,0 @@ -# 目录 - -###01.[使用socket发送HTTP GET请求](01.使用socket发送HTTP GET请求.md) -###02.[编写自定义Annotation](02.编写自定义Annotation.md) From 3fa8a25390d81ef1ee28b9a00580d1698f2e9a93 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 31 May 2016 00:04:08 +0800 Subject: [PATCH 482/524] =?UTF-8?q?Update=2000-=E5=BF=B5=E5=BF=B5=E7=A2=8E?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "00-\345\277\265\345\277\265\347\242\216.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/00-\345\277\265\345\277\265\347\242\216.md" "b/00-\345\277\265\345\277\265\347\242\216.md" index cc4788c..ea59875 100644 --- "a/00-\345\277\265\345\277\265\347\242\216.md" +++ "b/00-\345\277\265\345\277\265\347\242\216.md" @@ -1,3 +1,3 @@ # 目录 -##01.浮点数除以0不会抛出`ArithmeticException`; +* 浮点数除以0不会抛出**ArithmeticException**; From 4cfd6382959218d65403d4b91e04c93757a53dbe Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 31 May 2016 00:04:35 +0800 Subject: [PATCH 483/524] =?UTF-8?q?Update=2000-=E5=BF=B5=E5=BF=B5=E7=A2=8E?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "00-\345\277\265\345\277\265\347\242\216.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/00-\345\277\265\345\277\265\347\242\216.md" "b/00-\345\277\265\345\277\265\347\242\216.md" index ea59875..b96e4ce 100644 --- "a/00-\345\277\265\345\277\265\347\242\216.md" +++ "b/00-\345\277\265\345\277\265\347\242\216.md" @@ -1,3 +1,3 @@ -# 目录 +# 念念碎 * 浮点数除以0不会抛出**ArithmeticException**; From c5305fc630ba669f88cf652b657430a811d920ec Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 31 May 2016 02:25:08 +0800 Subject: [PATCH 484/524] =?UTF-8?q?=E7=B1=BB=E5=8A=A0=E8=BD=BD=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java Virtual Machine.mmap | Bin 281949 -> 315810 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index af2e095131ec656a5a03300563e53519517603bf..e16d0962c842ef7543d80dbb260683ed3825ca67 100644 GIT binary patch delta 52910 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 delta 18748 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 v|1+iBIYbf From 57157e0f7faa6d5ca689691733200cf57b88fb1c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 1 Jun 2016 02:34:30 +0800 Subject: [PATCH 485/524] update --- .../Java Virtual Machine.mmap | Bin 315810 -> 317017 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index e16d0962c842ef7543d80dbb260683ed3825ca67..a28d1491af8e0a85440e5817be70898b7895cec0 100644 GIT binary patch delta 24470 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 delta 23222 zcmV)RK(oKutP`T66Gl)=0|XQR000O88k4?A0Uh*!K?ni>918*fEC2uiVrgzKFhoK_ zLNr1`EjKqcLoGBnH8m|kLo`M$LPjw*GBQC!H915N+s^1GR27aaCdoWgq`sIa zG86ytxBusV{FN-7^^hf%g=V?t7ZcFVKk$Ug=S+Sv;YBq_(x>M9R=dVlN@{CWG?1x( z@x_G7P8Ih&1zrt4rdT;kmcE$Ca9ruEMpH>-r~+A;EYQVdmf|K8OhMxT#~!jsrYTlq zES2(fg5@0XgzW7mZ5gWFU9H|nI!p#yOvnpFW z+Z*Y#{$g6Zau7j-w@VB(@O+Q403V5hu}J5CznDmo`3g1hw?ctr6B$5JaTjY~aTGseGFi-LY$h!XS@l+vR*y}B8~>{5HTSo_Y6ib~y9Xh9_7HfYbdt*e z<%l7Zr~&*z^#)w4*P^-!m4l+w84g^7bdv~z;;;_GP#p{zMAGfQO*-5$B;vpeY-4AC znQBQT9Q8$rMD<~+!5#cj{ya$+gR?H8 zRBOz}qJbk`BO~zL)tCJH>-_ug_{)obo%Ii$XII*npLQQEbZ&puUbxiScmxjkm6!b8 zIhltD(QXaV8En)sD*8(iJ5^|^ts#xZtdIDqQr133@Y*kyT5CV{V7v0Ty>gjf{;GTF zM}QeP!>=!OS0A>ozvOQ{lN-D~eV^G&;F|pj@qjLiH<+1xo-9?Uq^f_k^_>TQe#qcU z`)v=0-!72;csC!;P^wY_fR&~z9L4_e?(!e+Zp#cF+{ex!VYk(bDYD5_4|%vJL=n_5 zsnzNX2#}PB0Wsi)(Wn=K!g(rJPftV9k}pf(Mkn4h$S+}P4I^5ghMW;AoiP^6db2+6 z@Er9T8JUEC{yl&G8UJc-^TIQKe(C$oOH2PfcdoPXUHje&IN+BT+Be_uOXpi_SKBw< zwtu+}n5X;lLg(5u{_hLj57+oR_vB_CyiWkgsFEk>^Jp98xXlWMwAhrsqN~$!{YfOx z!E7j5qzZE34k@;_*8b&}z7%tjHL`o_cKgcx_R4zu!TcvU5;?Osj_7fJ3jwKT6Em(* z(!k<~{B|;94d*jB?5gF|fr4fRE@rh}c#Nuse{vo$j5J7_D|6i^=k^&M{?SwZH25Z)0Yr3^o zyyS=S869h9Jx7g->~QUW#;5zkPu16i(0=2adt zk)ex}N@VW}u$bibrTQqsqsnLlfi`>|L%0N0i&^8;jBh%ctH~c^a1!2963a%BoG(^N zhntYcOZmqrqk#!?$jEeFZM5FKQ%>aKrG_RGrE)A3O4{{k-0Ae`>tpTxx+~&oz5gJX zZu2jJnDmlDpi#1a>e?%d{5KCr=>6$o)b`5Hz*FvZSL9O(0F{U0GE7o221U0RbYvSU z5U=DMQ<$w`Em+l5C>Sex-07o8XL$Z}K#ic)z!^wuw9YY8!K_z3Tae#W%d6{DP3^Cv zgxyfi)`GcsIiY~GF;0_awuWd-gs)}`myH#D-G5|&_EV*QU2BpmcK&mH^X6;ilrTCf zd8(^wtJjpPq=*nQQ;)ON5FUz*(Sx9twtB1gmYyEyjZc@NbP6{rqx{l1KBfy=Wa+!4X zYMOF$V-yPQ%X96O%Tn}#zX)98pA?G(jS3OjbZ9cwM8;?Jr7^cpQ&w|uNPgqOLK;Hq zLRnX}(g7Sb$D&nFq<9it^igU5{dfF>ucdI36uuCDW_!dahZITz|F+hzb}#+NfAdU= z<91dbc9y^H{Ib#6xDTkJd*OY1X}R_Lom~$~VUUx>Ku)DNQ7o9zS15bE@Y92i;2r~t z1Fn&SB1;O!DzHfm!-3?53>b>*v?z>^CRJ(-6ZcdM?r6?8OR^;=oFROa{8A;(CZlm1 z4d)?$#E8v!bmfLGb)v|{N1RUR$%$7R!YrsT&GQwI1VF9wPtJEgEO#G@^F3>8o0pb^ zKJ+D$YtsRLw7}x7HT>`m??9u>0m0 zNfq<+UvFMq>}ym>m+lM$k7aV9KT&>~a}1Q9T{z9?^l1^Ofci?bMO&R}c7C_ka=J zA1TG?cyAik>7nDjr~!fwR*PrCbb$h&BBrTxDnG;IhofyT!%>y(4-$V)XShOM%osiR z(^#q|q#bX6p;48{la-1pMdvA1j-pC`6&0D!t7xvGsx%96CJ!i+rBW126%$lNMHf{} zky4fNWP|-Om zxLN^dq(DCaNL;f-32&r}G)IH4ZuYSFi#Q^}v-^!mN{9jr7sba}szN8Jt#=8h{=drp zeVYWtB@m31RKDMu3fN#UXd1$QJ>b^T-#$~y|E-krR}GLd8i5cbDYR4C44m5*NJHt~ zk&~g-zHreT^C3P6$@r5l+^!4cTw_#68QV~ z2Nj^GtOUdE=;`O)QIIUA1;v>cR-vU*FeUt*PzkFHzLb5r zG5Kvp@8n3p68)b9fQZf0!rHsunGna)Ibd#ruBJ2nv%)-^fTSwSd@-S$82)2IRGOhw zgj3GX(Mz9$;3IsG{NNzE-sk8hPDJcywCJP()?#`LhEWW`Py;+dCbR*W)Z=;`27?y# zI=ulJG0J90y0na=6rLh~$Uwl9&9jg>U6tSc_ZMJKCTUHjb3SvZ>0wRUS+i08G=~J0 zp}iUy(Lm~{Dav5;>Jk>OGKm3-OP0;M_ckwG5;A(;T?hY4srtYV`QzP!kpB4n3x4TE z_xIo1b5HsCuiN*QJF7Rr)lno&4~(5c06CcHq$jp`O9DcA7ClmbfE@fR3`-BgqwyDf zSjypXQJyuZzscPo=dWkxA<@BWuNzp-95(FB;3GaZV{NEpvr>*Aj5DKAqXZ;&9>gJfYaSyf9sro3y81t z)f;~KD!=?~Ywb#ZdwHev`UfGHEQZ%WORcpZrKj5eeAr&O+}hY^y}#aTvPZC6X}aAP zuiM{W?Y?;2d(GM+xB*bQ++H@aokfX{wCV(g43l~Yf%HJq;#y(x-iRv~?6VEd$6!&2 zQdd8zqMsvRm<(%WO#n9ojKkjJvacW?O5|B@x!ADCMU4;gJ`# z*}XnBfyK*ih>8)kyHLwb1&^G>mXj%^3756!omU&1cW<@l&hfAA3Bp}j=yWnb$ClKv zx>A6`gt=ZKa(ay|6Y`B6Ix(vMTna)d4B9|m_Q-x+aMr+1H|)_FsDPPWSz6;TnF`~a zo7$N&3!rmtm&>oq2IXu6|&>C%zrK@HFv2w-)#2D}_EC1?|h=EX>oKwvr)YKT%ai15nllVB9 zWXt`3Za=sr)Bw4(F69aJGEhW9=vx$mtGx28cjxK?useYB-PyPgT_FCZQ2(Jxa21qq=ZdR>ktmHR_n!tDPrlqA{T7ustVH*Y;^U!U(>y#!c) zp|!TS`IFoejD!BusN)i%3Mm(5AQ7vN)m!wjV!pCii)55!9)R z7@|;BM|!IIG6xwHFd}p_Rx72~S$sKvpG{ZR>MKkjYWWy5GW^S}QYX(ZZ~kzXpZ`0s z8d_`Xt+hw|-J60bvGikao&Uu*t+nUC4D6kM{~b6G&aW=C-d+JlqHq$l_VTun$NYMu zZ&7xhZU{??=3nwlPxwbS`YlNFIud#CSMRs)K9*i2Jb3r!f6twlo2}pzQ-{xg3u^;; zxKSjkMMJ=+k2AT90u?mV2p10~hyVt;>(+#kqH{>IIYtvx(2b&R(4D)`z4h&&7TCPG zy7`0bYV+h}4OkjDh_lK1loijS)6G1`&Xio^EJ7sK1?t=8QkD)dFo3%Fu}!zMg{haNLoYwKgq(Q!$sugKM)# zt`i%c;ZsvOcsiO5q^x9J({M!W8BaMpM*Rc}YbUpCy#Xsv$e$4k!T<*un0(;J&VnF9 znCZo}*6&xq&HA(OS@@54cNFuPwIjuf^!TJskD^*gi)mp9#&C4RHAg9z-J-29nw;Bj z4OBHYJK?mAQ6wY6s@E5POYNT@_D$~I!1OKeeTGN&(dY}Ck+U-}bG^!>ac7or8!{o6 zPhIp_ykkrULIqM6gVepuua{r?k)MAv=&bAk9X#EO zzKY&UXL+l6!40}BtmRaEkoqixk2*+ZB%{wEQx(E$hn>!B_Row_xoU+$>MfCd zIRKfI#RoJ6|LDF1U$3U{PM=ar=o19m>V?+E&w`6N|FU1i1|a^&yZQdl&Yd;jtqR30 ze*LX|T%qLNQ?VJvrH#4OsT}&$(a2>t!S)_`88$xoGB85cp6Ju<*`cg3{R!Bj1yT|RugMn!hmVFZ{qfZ}+gR<$c4G5}7^f0nD)TeI~D#QR!A~>woX>rJa>M)6V4frI6X<=NigJ4((>vg9$jYX2M z?dz|Fihw)ja>Z@%5}X3g6mnuI5Xc+UuqHs~iI6YAg$t>CTYWu<4_Ts9rT5eg~ zDohM~ODjeDC$~sKxk$(83t!NZ(-23!78~TF&C>*e`29%ilos3*RJT-LZ`XkJmqhYQ z-vZyLm%bw{jC{VqU)_+V@`Y{7UVbZF5|zJy6h`T-`V~EgPkA6CL?WJ6YnT}#1Ua|@ zXKa{D=on*GXdnDR&e;L`PHP^R@*?|PlcHKee#L;%)Jwn=15$$naiBfhp1(10Z9o)* zYx0lSc1gI?y%Y$DJs`t&I>dlpC}}5IGB17(l@NX?;2>|8a#b#sOZl||_b%`&zYk)6 z_{psp$mv3vAW`!{xiV}q<7(QYt~TV)X7v|X$BYBcMsw;wHJ*)BjODrl>0xz`#)8MS zwh&ZpCJ`j2*HkSo*}WHJdfM-wPQ!XDZcci`6zz1dN6txpRPP1Ffvb}K_;uog6b_c+$N{@qSa1+>JS|SToZ#{@KDfg@5P{>Gzhjmf*EwUP=EOJ zIxnJ=hGDQyuSZb`(&^!?>{H;>px}>A3n8c$J;mS4V=5C{pn=S_P62teUD-T`ESc)hg4}Thczxp+JRewJvC$)_HN-+6=0Hp(0ZV zVN7zY%kz6iv81sS*pm0;nWRp$NmucclBlI9M#2;ud3!x2jI)A;L@} zSx3qo&-?1~M}{gcHXTkxz^w`N5=pW(PUm_H_J^pCr|&k8myI?si~_%6jTaxHv8;M@yK1+N6^r5 z*DU0wBO0h`uEwVGa9-Pg%#U*=-uRrAk(IQ+UM%I9sxO+Wx=1@c3x)0e$~a};7L^Lg z3Xg6}j!WnAe0$|*#S)rEFHT2I*K_7svlTL9P_05WJSN=z(G-PZ3Sr~~*E$=E)x%n^ zGZ#%cEILweE;LeO#AkEvJik0Ys67>9xRGUFrPxfy@_GYKG`TW=p|={HF?(Kqn?^rn zXM?P*nkA}G$Q93(Ds+0Bd<}TH{a|fyB~^RwX;(-n{=T(-RpRt_Wo;dC;#C> z_roROsewnjPtI-LTIT29bYDCcC4?j%6eIl8tnQUrbqSqVCXjwCl(jUC0mvP$63uWf z?9V6Ur+17c)Y)Kv*`&^?V=kvTsm*wiBb|PEgKh%7&)<+}nSc3hKc8Zd{P}PG(OSEz zm}#azc(_gvB`adnAEw<-4>W#~^-^^O2nRVapU0_6!IL&etkw|WB(R(_8*TXHpXb2z zbUMxI3{k>9mC{i~I_}DhGq|q2O@H##xF`*W9OWd;S<9w>D5r&7S*PvD1X+1?zrqs` zeP%X{icvxzkK>3doXUmJ83Hn<^#HPQ*5Qx}uM8w+DKdcxAF@K|m`KsdX31>}#ED#J z%1ku92CP!mj}a+Fou0!&J;%fc#SMCA2FYn5AFQD;u311L<1F^xxwG1Sa7kQ!_M(0D zDZhM=UtSh}x8vmUZxH~YzIh4Rq(JY7)NjP_&zc4X%Ph-kz#YwbCB+3KkL@ zxmHx#ghh+Rf*Oi?rZ8_l;!RIe<5V7R?{|OrN!nuNzvfo@fB_$nzc}C5y5N#xidVs$ z$FZ2v!rp~>RVYE$C}B?_`7P>`?>Nrdl9?IA*7W8=87^tak+nojf$}BUX+uMuA>!s- zh$tn0X6&H`I?awze+@=}x7YP68v%w#Uel@zL0HOJopM2lKIGO#OMcwoA7=?q(QZ62 zS6n%M9~m)yHO|hO!o?=hjLxJ|jUW~_N5)y}N%3^3Z5=!^ubZY~$*^A=aYAN;*%oI~ zB+iVpl&-QyHgpITogS^x6I8x@QUP^=o;U!1Q!1nj@d~aZp-?l4W3fy&>N~Qy@bKz_ z3fl{;2WiHvRVyCTWgM;~J5G0JKi#do<}jR`#q%0V+>yflP|nAo?gFew(6o7+dUia1 zG`u%#b$VF5Ph1K!`N+YT0&R#_5Ms7Qm@5vnXx20c!Y6;`1Q~Ke(@-iLCUAAOg5k!0 z02IlM)5_U+EV$7xmwH>73^>rh<&h#D!u*O-G1zT|HL^IKo`LlhgmHPSIGQM-NV4iO z<;GdHR;=;VTiZRb*ie}QJKKPbOxj_t5suE-9Sw-8dE9z$gSPupf0{TWbclRBuIu48 z&)UpZs}HirYYtyDLpclM+~rTot}tnTLhY4B{+ow@?Zj%x@7u4=^WQD<>(@5t?(^$U zl+!FDla{Vwsn6QO`na{4jm7E}ZMI(3jx!PL`QyzW9|a3O>n7!?2)rN>wy45|)%WkON@`v?BHue%czP^TvnQky(xv9jRhFfSoJuIrq7paT z5YNj#JtIRsvDsWBJUi`A=bG7nnAshOv0NY~f94OvV3lbj8L#HdH7A3q%d;h&ew^js z?*70pf7{oILVc~iyADTWUY}#PGp{`KVb%L^mLKeC*m1(%fxjIK=|JK@7 zaL|3Ypcq2P$g@1uRJN&)dZTnsU5_N(O--R(ogHTy#Xxxr<=`24+AykrCt+5fi3B0M zQb;rtO^bC_GtO$ZVx^V#_1C~CRV<=AIy?bGMT@4AscC}NTl7;6U!!Wn$GZ*0<_}-B zf4w3|BPA5893asZZGlZ8xgoRiZ7m9mC_3^mDh`I#BDQDe_h`ec;Rxu@cWz!*7D z$T51%f4Hd>Fv!U9dXh|q^D{ZSEr$eVTyZ*UreWh4?Ml0uUpn8uE_+7cwm-DjGLnn0 z##**Yi2@hsq``peF&q~*s6~b1Kq4_|Ck?PchZ_*R4wj06{z>G2l3<7TN=$yed2zAx z{6^>cW0_Ii-uhBIsnw!7t-%0kaTLLDy>`S{M!^UB3Tj+uty0x$OdYFFr=T&KpyoVT zskCogYHhsfY<$I;k%sSAiT(y|2(P}8{#42OnMrw2JworThl~_9b z;xl3K-Rfarf$P{L&5SQfqyov;I`rOy~K{?lB z{%3yShFH$`tuS4;ur6dbh$-6bn{R+U&|X}X?i>R15hj{l`i$9NiCU~Qlp&@WzsbPN zjC-f2mEJaghOM>dz%^^nFH3tiN$5$aN(7lDYvg2}ET$(#k=)-%sP%qj5Xr$u_~oxU zPZxW50)$sTY~EbuFFxj%{-Go>pJum@|K>sW{d;M1hEI^&gZ6kWm-I}Vt%%E%GZnOT zwF#GB>(CXtU{BQjPQs0$AZq_uqClRs@Fm z<{6MCLK4)nFr|{Mlq9whHr5aconQa1^IY~~?$DoyxPhW;uP=|WUfyW~=#O{vQw*6L zZp)z&@?ovMgmKoPaT3iLI*gg7wR9Af-{y+j9R)X2^wK%C-j}Xc+_ovyFh*Y9+N|z& z=izF9>%-jve?m}sKuK-c4E(}He)%WC^!o6yeeOl)=O_H~ys%IE<;Cu;+wCj&+bg1- z@Z?H+BzWMxrn*5=m?d``$4(NyIdMZRuWimO6%|uX$ zwK$sO7|q7k+D7~5hl=C?Z*Oxja!An%%!X*aQ7Bt|jL%pi5qn(Q9A{48+S=x&rS|tP z_~j>(2W_1EHh})U4TMnJTp_PHw{d6oQp;-zG-dT0Jc*9e`Cad z==9hG;+AcqzG^>s$G=d<_FKv@6Ol+PGOEynRyJe4d4VGZ}vQuo8lzQrKzNYZ`ry!G}nzi>mC@4UAxYyl@4 z9)R3;-7kp;7x1gWGu>x%V;2;shY7@gD9^q|X` zSe|eHa$WGGMXKMN+vxuOtzxu(n(M8KVYw|4ql~maq@waMiLgvHLnLFWVnj24JJU=z zd|aIk%O41;p~)~(%+M7p9y3zSDRl;OsK=S%^Wtsi)kgQykKOg3S{sk0{ig<{J-_gF z^WtKA?rHnMLoil~5%g&;o2Tt@{nBszyX(LgSD2mFEp>X4-F>;iyUu&uinJln!?kJo4**OU@Q2VQ3n+`uyH0 zKU!C3$?{lBf%JGoph+pR^XdU0RH07pfJSTI`OsecL0mTbx_$MrbW)sCR#cpy=4IgB zr~eRLh4~;=Ve(bQ3ATWLWMM5yx$=ZNpk^)Q02M+>`Gq-BBDMaiWrl{#oS`riY!JDm z`lAT*%TI-hbFVgl_~ch_0}l+)qY!J5oHD5how#qRD4Z8=Y>V~3FG!)e?yq09*OwKT zsh6SBL)MNtnp3$<6KYmosnxP6Ec4ezDL{f3TC4iw7KRHGO1n1Qi@$kzp zgv<|tOcp%gqGX){^A%XCf-wL2rGMA^{?;0hfhVPLEjw`rS(|*qCd*od*Pe!_VCs=>7dqZwD}E&X#lM zNS&TQ*v4!a#uAQFM1EB|gOt;5n6MOxW-ShT>+CdDJy9OW#~kK=%X9yp$kRod6Y57u z!k}~QRp;G}?u&2vThF?eeiZma+VWep!GNe}uUzgMS%P!$tKbs@YfDN{1)Rh$J?8J; zl+sdqKbPl!g+;u}^X+*B46*I-;+7${1+Kc(@}hLC z06FxtFW`}d2_1A49QACRwvw)Z)t?KhYtisH%fLK%+g@DViJ%Z$x_ZBT_pz|*R2-|# zhwH!x;+I}@?mrf0tF{JbHz$J86U+SqTIi3C#J2747J;j!z!=~sAA>v;ZE$7GS%sRe zuupG)rgAkqJkEMC`;qwCqL35w;o{~)0YqW5mX*u9;BL>~=+0g2i^xHs+komED{R~S;ivZVe{>$M z@+&X-Zys!3J13ZY%M0!2kN;h6ymcqX+gE6Rn7v6P%;ciE5H^!>=P*O+qmjIXI6zBU zOCeCSnAj_-kt_Vtk6=_JK?H7S|NL;wG<AvAC1yX?ok#yg_=9g08*2AJzrx40N z-pxA!a5R~xXU8yyR>9NdMyyt``Vu6D+b!{c)j9TB-k{G!Md^HcB%#hV-E=)b4dnWu|u(&7Q4m_Nz#fm5?Uy>sn8|LuGJ+h^?++1+aB;3@NCl0yxSNAu7u zQH0D6%w&Llrku+y{|s5I-h@iJ*{a)0*UAYj*Kiv1M)|#WGm@$oJ#hpj$}>q{pdREJ zCi)}>%}1o0{v1j7_5JSafABBA{#TcOF=G7R4xh*RuV3crc<0V4|Nc5KN6$>h8HP&; zOGZj0mywD^v==V%tGC5qmvEafzw-7?Ywa4)PQc^qzWAD-|4E8~^|b!{%l;Be#gbk| zCeuWmHC9}(P7S${Jmn5mjhvGiqk!&Qdu3Lur7)sYH&^nUdpTEYbDI~Q@$+(j7w3{8 zeZFKgQ%%OL^IAh;e^8w>&{%2&_z9Jwb~Uqaz%xlK?JF$!WN4FNnNQH zCku2XF*!w6i-`=y{)@H24RDJxh0l=_BbjN=Le^Pz)eljO)x{MWX?uNtoKeZXtmc?0K`_z+|Gc7W>D@J{pwR{Q5OvdPGb+lI&u|1cYv+ zSu8|1iC_q%*XmFN!Y~|vAF)&xV~nLxpWCG&NMFIIhLVJ%0gp52dklGPER__O*L{IA zashSJ5zV6dszq(}Wy9LCzdRjuPmNJtrztMftZ-Ce0IUD`zoa;0_ro>*&OKpHXV}Az4s356-!Q0z{j9dcULLjx2 zrd|sYIHr#l^@znns^za00dX;cgVnZZj?#D;VmDE^08n#bCxD+Zhb8>d$DcHuD)H zjOfn5umwT1HpF5xnI^%Ff7SGwlg7CJ&D%W)(X)rZvy~5mA(N;9{6X~wT&vfjx(Sto zqSF~bsJLNL4{7x%qQ&%D0}dJbTDCU`n%zSpqd=Fv+K_gCQfGj0Sijv*flmy&NxeaD zz;MK%*CTouIlaY82jvR?>U{g>heBfCFLK*%+ky6xMNBy7GZ!QA#0*r;Xh>($m?^oY z4DI{kgJEX=dX|o$MAmc2T@f+|MSEMOUVL{51^X+>pdncHMt=#5c_Rn-* z{MLST9#|-Un@?^Ci7ac2t#`M3t5mLT@GtLnUtHg+IoB)P2X6ki|F>cM_wL++FyZ>m zH_{cUCI0EP_Uqp}8@Kv7Guu=G+FM-^6V(>lFP5ZFlSpSrIQ-VL%?s~^WDwAU=a07D z#@~4We)Y2Cwpx|m*s$(ybvw@?Nu*+Dt`K)3Eg|SnDQ%S|Fka)=xyV6wf8~=ia{Z} zC!L4%X;4%*i9>pDN(TXvBuJ>y)_F4;k73%EcUnmU9&GA@rA&65xkUWxW&WaQVT(Bx z!UC3m_R7!Q_1+ANM9*M+yFdK2d1;aV`d0VJ*PT1UD(%gGT;06&pNehSGkSVf))jFy z(lxgSikefiRawU{M%!QN3XiCAB&5DZneL;!(Un#4R0^Q*_diEX>BB^ zl3@|wn`J?9- zSsT++a0K@ntx=b`3hUDb(x;JM$2j5`D_Z7yu{khBQl=h~7 z0`9BJVlw~5<+V8f;xb$R;xbN~{^Bw@JI^mG;K1&IZb&5o!;>(KXblDg)j>FfX-8BN zamc61P!TLgAh@QXhrFpq)H_D}eIYwNPO>~jR{Vq4{M{vfX`!|LPswy^KYPgE6ISI* zsh-N|$I~2C*$bF*p%vxGOZfz>Ed!!|y|T{F%RPg7{GA!bLRgR-hza&9_!^e0l6jSf zOl0UHH3V$K2zMPkse=$mhrn7C!?d_w-xI5Sq(T|8M5+2eBNWTg2{LcY)9GS?Dsnr+ zR318+%pVh-elTZSkA%2pp4vt%$S|CE(L$xjYM!fXU+SF!B$YT01dQweMDb7Q(X&PWJbSfys5eH9zcWnJcCNZIx9LE%PoZ1?g!M1i>*wN^Y zE4y3YI)BJphUxbXvYaC0RNj_n0Hqbv13(^derMBOrg&T!q1`Y-J7E-me(vm_aAv$9 z9>32!AT*QtJP?cffOz1Qpi^em7&2kM8u=-hth2#vDi z2~l(wlVbGW&s6BWGFP}m?5%i@07&mqQQ?`vx3Nrq=Oe}{$B0)C8Q7k>6xUIE=ptRH z7Ph7=FmTFGCWTab0jQmSI31)$kLYawKJdXsAPqn_{S3YPZeNwF&`E0F+eMwTuXM5I z<4k?v8K6_^Lf-~&-5$q1Hv)*HH|%^uKpKpU2>rk_`w;!sc<;VTgxE$VI6+~-lM_SR z9DD9R^n-~K_*@H9FCH@L7PhG}^a+E|@5;PEo}W9S6!Y zT>%EyK2PttX-DrZR7rHhC-$Kp3$PHkTHDz@iGK&439}S+C^b2Y5;5)8Q^OF|AzZpL<-mwToA>O*pc(I_7hBqf>2g#-$#$91QpS8{SVuI z;ZWKRIgzqMC$&=J1`Ne@S`@~IRenQgy7B8R1+>q;D&}~93J4xu0VPv-3fiTBa4H_x z8$PZA;-4=M6XJl8I0E-|5cFr%LFjHBgzoka_k=j0gF+neL0SmjUkkwpY9V;+S_qod ziDz^;VnBtRp$D`O{8D^(ZJ>jFH0#c(( zO8E0c$LCPbSOs&BN@O;v50|ICtBS<>2iW*i6TQQKS=9)JAh7PZR`vMJhNhu-6v@^xe{-`sXC(8U9G15Geak+1F z06!=?fbSn2INogMXnh~q`V}+%KU=?_tS%TKljkV$kDXZhqbJYf*&>xwAILsT#faAw z%C3=r{_N64I<1~GeB|t!;VkZ*YUocC$Hw-=t+A13G>6qRpHdw9^Q`5krc#D+FAmcq zsJwb)JOOPbr2i5AheFvcJq7St)_<1uCzADIPe04|&+`4xBHxc8mwjy7oFQ2m=N=DC zc8@Ex2vZW$a<07upqvp=86t}G>E*{CN$R_QQ{VR$w%AERI3pX@2gSoafj-F)mO6M= zS*~@52TnUHj??Ewgi?Lzu`VLqPmk}TWEI!qA7h!{N#}^Lef0OSgM{$$l>gp**v~=3 zUU7)S?T@X?3WW|SGKEo;4C^93o~<%uvMhuokoc#xfgQphIePjz&o>J;62$fgTBC?sQA9h89Ja&j~r&pXM5$dz4F;! zQPf`f^O_IiH3no<;-A23*i)m#Ay^B4>;H6f(4Y18XTAMdZ-3U?pY`@9qPK%oUetb- z3|*2T!QcQ*oq)7)2--D?3~ms+E#7J&E1836*urp!sTc6{)>a9-%cSlCST*o_ziO~X zmK7j(ZWSRvtc>=EFWLDD_?WL493>GqY5B?4(JrAv&C&w79Z>`P@R2tOz>{o$^FW$7 z*6@XxJe@r5*zN4{)(1#k-SKM|cU9RMl{~@*8K~CV>;AzV1g26o!BtsG)jv9(C_Lo- zM1>M=lQiH~(f^)e@dzfO$l6;fM$AvKkx9zSa3LxWUP>i>@htdnW$RhcpxAL^k)wg> zM^;32)W0Sv&b^oV?;1cJnuL3Q-wA6C5DeomvMqLw{XkD*hDu~Ye4n&lN07qi44qHz zI1fG$NG7rODIU zGdr+-$q)wsCCMVWMNYda=X=P~0UH~rg3Q1V@B!6AvHx3qHpVaoNg=9#whs@}js0yR z2Hz_25|gM3x@j=ex0tRTyosj3lf65>n3&C+snCTUc4n3$xx=&o7*tk*CRHsmHBvfb zEs(;tm%T=&$O`9Sl5`4?*1?UzgN=FU1j|$y!LHle9^k3W@xI9;G3$PffRPlpCqM9G zJY-fJ036@ioPh)EUIF}nQ91Y_Z?zDoSYJxwY+zAC==RAd!zP7u_`r>hW=Ztfauty> zwoVU<>77^nv?!avN$vK@o>-%)o%f2AFX)?|j3qfLOc#IvCkv%RIw20au;~T@!T1>n zJA+_hSbG-6&I-NR9?ij9P&f=BXA$jLtp7Hul3?kQv{^7y5D2n=B5s7;{{BU8Z^Zvx z@7#Lde)h0^_rqUQ!Vb+FOZ>&P_T1gh#%un?JO0k^{MrTn)!biHeK)%GezCQFb#Nnw z&h4*SYmZvLKRtwdr7!ZcR83&YkG1P-@BNddVtUu6uDic%2OIlIE_3jg4Bqv{#Ft;r z_(EqO2ncBK7ebMLFU?;Hv|stsm;~Jey_~q79l`riy=cvZN6m~xm|2fm!0_99^ z3zRSa&%f-qGs-0BRcZ47{7Z$bZATRL$Q_`7bKvD6YT%qR!4$X8SN1t~FlUQfTIIcd zT|Vp9;kl+Q<8In#fF3R!wG*2l4~`P`+SW!bA3KF(AvwfB&NQwT0;_-8ML+wx@E&H|6;NPBU+ zXL6!Y4x-*dhGS-|K1Z|&!P$yg7d>iMvg4q@KYH4Ja(*}wKn5hbtIxWt>%$@8V}TWLh(WC=5>Tqn_-ocu%o;6~?NPt3;?Y4z zZD)EMBzn7z4uwRJI>dod6b5Ht8u7abB59?fOejp5D%M%E90H>Abc6rq*>EuUt8D2Q z8%rs~8ir}Oktk0=xsaupx40VN*&HH^sJ!~D`{Dk7a7dW)2XEM>Fb-NsAIU+5bOI{R zhA4!HhS;n_4iUjGKN%JT;EWB0!p`57Jtu&+AKm~+*V75B5v^5n1uaz#gsPQUXHgDG z(OG@YKYFdK0WgJeb|e&LV8~~Oa5o&Y=M1nMquE;f=J=y22Be5X=CG8d=x88}Rs#mF zRgJKJ>Ig^q{q>?8>c6#iWk?JTuVA4l3YJXRU`rMn4T79aYYcg#&XzOELB{-VL-4hT zf;5BjQBcr_%zoNn*Tk%}Q){gG19g(L$YKgE{W2s9y={~}ws_0n;ao9J5;G9VZ31`H>7-cc$&i|ADZf;mGLgaAv{jnH*@3}qE4LKo=)#A>G-)qR{kU$2_qi#Ka zQufQ@I{tdEJwF7ig)`McyzD>5s^XBUDkqA_&iV*k}KKmnK(J03-e1^i!gxPLH zedZZk6P3lrZ2$7C{ngU(v9LB0d9px%eq=Z@j#|NQ(A%835D_#O>It`zbIPKZ=O6K_ zw~r5ptC~zx4zf@<#$>fJP~-}+MpCPfm7y{jA}ShJz!*u%LK!z7w^xRUE11bVB~06V zBpjO7io1~2Xr>6YKNc)IU9)jhRt~w@ef_p`ZHP#dMVS2kSSU=nDD#XOO`#BfQYmm& zePl+RHp_y-^C#_Z9uFZW07s;$Vq!RRb&p{Je)p%sdnb>@#t(nuFJ9dIVWoTdpS^Du zlVyi(=K0Om`|ox(LsoKricL^Oj!aWSwAKA^hhKkkSStr!IbzJ?k(uc#stZgL>iBfX zTP=IT9-ADNQ+wq{esy8nc-r}YZK|C=zc?b-NOM5vM(uSdUWzrsv#yY}U@@}I29^rg zU^(O-f~o%XcpXNtvGzDJ4SS8L6yk@f`gD{b0tQ{FAO~+_&~bZ=jdzT>Vm6&9GL#l7 zxJxYL@L>!zBgYu)jy=Y@@s6?46HB`TXw+wI5|I>zS6PaS$l+MFHa7TwZypZA&M-9U zU>|g4K*F&!!_r)H2>IE1_dS1czO(*x@auOrbHMo{Ah#MaE_;B|CaodJZ3vP9gBDB6 z64==KVimm4H>(DJ?8?{xXAjS+)a={Q(fY4RMk$})i5eh{oMluMZP&*Sha(6A(#;_b zC2;8OZjclZL{hquLl2<{l2V5bk&+JSE=iFtMH;0;;*c-i&%55|eeUPWJ+o%5Su^wB z*S_}bPycJ?hv=g^Ngfn1#ziu{`mry?>wo*M>V!6(ftNK{XzEpC7cgZv`%@$A_$Wq7 z)cO{(gCB?h@{e!jsl-?NqT!vMw!3ALV;Cd#e>^3QJj&_hrrv^eJz%V77foo16 zGP&h-TeW-%sDG*{xxLJ;aI}81r}}&=-}q+t783-zy+sH8C&z$)XxKCx3<9y>fI#FR zP<^!~xC@MahbE{;XoC-U{+uE0L&3D-e`p12&(j-Ahd`kC3DEyR4|o*>6%|Dkf)gdehKfQKLe^B9OnL_P+ts{&lJPBjgGf z_!B>mLP61$1O$3d3IaX2gDPmbTYK4ABRE~1ZFcohLd5=)Hk45Um&qInW!1W2j<8od z3ovUMF>4AVh9UB5b)&RWIZF!c1SX<^{+wKH0>vKkh-CsfET)#M>_uSd`tUl#W3+M8 zZ@+PKaUbQsH{w;<+&9ED(A(A31vpsSZS-_?*}JbGgETX}b-x&2a&QzHQahRq$HvB< z#l)uisc$SUE*?U$A6xIy5EbK4;~|cu3wR~IT2Uv(rG&rA9l+UuzLv@Vnj(*JFQ%*0 zjGOqLQh`>SElzNk^h&WeL$ESq_Y$jyunbYm*}=hm*n2{4W$f1>vbnZ?IKXcJrN{94 zUARo{n5`j0hB`BmW|WMKrK_enw{T1dvlfvXF-B-G3txtrd0JW;xp<5+Ot)B%k@DV~ zZVe(VTbwX;`c*6lTc}+$W7oT)o*sG1gkafR9zF5s#y8!|-Ak@u6l01+hu}b%7fq!v z$JJImIJ`$&JyV=qeM3b~uMe6LUXU52a#_KU5Zq~gS4D9xdA5YG9(*lgoEU#X)V@t- zoO~aYNTbtOOvEnjXC+j!TdEGFem554)t<(4=651iH`F?Rk5UVqo}81h+5@?$TjoIJtJqH~kqkw{Yr}Oq zEjRndQKJ#MGKU=q0#FIkx-oQyZ9Y&Tfv0C5i(M#|rCmg_15_UiH0`c39%3DuS01#{ z7x#u%g$#-9m$Z&BL+WbV0ZN(3`5chcEYV|+F z5S~^W7gijOrUM=j?;kH%+^J=cg?*MA6l8qu zFgpHImj`!l-yqPDNBEvcq|pswuc>PNJ62C|mKcKAl~$9F>l_)8_Ytl1j4gCCC>BNm zZt;mzbb!T1`d1-4pNOR8&m)I=_WGXDRHJHH02k}J1qys)GDR_2IPgXb{`*cTh0RLIP-20htTvU-D zBHCev-BKV%sal%x0w%i0Xx$z;sbm+~UZ;r<&BxqR9w!@_efEsG6y{KfEvcMMda=^6X zvZef#h@rbB*O)|myjMRucK${~KgClkJ&dyAJ{a(6+jdkr=s_hIdzyryiLNvHj;hDw za7e`&LO8rZ-i2KbU)qbzdcQ48u9xN9c5be&+Zf8Rs(j7D|r_)C(aqohQdlKRz1kNlgwg){vu5ph(bPba^u8#d{oY?nI5p9Ov3;er-nG?4TyNw^*DS$Oxf zyYRzo7vf9BP5aYd5qx4pU3rR#e#*=EDS`0<$4}Mh4xcP@Lq$v4jDlM&(a$H;e(1L< zoNxX*oB6en@1rda&0cVMmp8aF2h$Ui^#|r4JAGB8U&VjPal`j5t?b1|gJX28QccC^ z4$QGCeXcIwA1tfQP1#P5HKe2g`IK_xF?m>Zyj}>7wL;5?zLpP|BP1cPw?_I}HC!(s zh6&qTnIArA12bcz2|Tcu^jzw)be6=a1ra1|dju2IGI<@nat6=Ff1^Cw8OjI*4S`pJ zI>qJGp=C-;@ZwlVe%7_{xh6Dz9O5f~26_KApDIXts#?Xhq6*Yf{1qe;OH{kpiqjR-z}A> z$%&{pOrnfYzS0)4Sr;L0*pu6`K-rQ5)~!pGb-da)75O14}dvq;+)X^$UgWd ze-)n=qhA(FPIp4Ob$dA^V%|4IE^N<7O!J6)*hcuJ$l z3-YeXEi|d88X9!S<-e$Wrp8neYw7y+t&i_kgSaXU{}P}s3GD|4#elck>~ZngXLK0(*Q)g8MAeJwINZ+L(mDrx zU#&sIW4r08&3c0M^@(|GBg9F9N!Ya<33YmPA?10ZtXl}ltaNj8bnsPRB+84ISAgt_ zc{+yWcun}E7}rS27C@(~5kackVJcpUC=tKjvT6FTY1HL?139S2*~wr(IIr#F%CPO8 zHpC#VWS{2d)^UiQtG0JuI8>*d@s*}!6pSFAlm5(k_=D7zt)$U~M6S1?pE?#iZF%xD=i z{#?sLTbHy)HU?22YR()?gbf^>>8~)B@g-kj2fXtvUOdx0-^I<}HkOJqpkYg-pphan z{XzJ}E}bdPV>E$qz#SzR`}285MZ(RCBJOE);;BXgNe3A+F<8$O&HG@&YqLX+{m?TO zY`0g`*<|%7v|0dj=9$tM9K%BRbr)@f4Z)Fq&b&o;`+}l0=+@-|0~w;&v}u#)GQbwU zQD4t)mE{gn%A@g*bHWR*P;It433k{mW@n>oF7C%Wz;q37E@c#V)~5z%Xx@M2R&xJfdN7lkWpWXfT2u5pbwv7kVl-{zvf>=1iCFof z-bUElU(#O_6s3XF~F7D+boezT9Y?uk>8QM39q!mS+3aZJJ zi^tv#j_>9?rms9HTaikl1xxKIwr}XLHhvLJu*?FAMmxPU>-K7&Werz;pM7n!uC+W3AjdpXB&PHs=UR#J@O5 zbA!8h_X$V;ud_&^YX|R_63Ol5V~?h2p1Byw#!4;kH4|ZHA6%_poUXROX6P#zC&3j3 zP=06I<*1b9Pop=%>>VgBE3@XQ{^nD;pM8>mor-s&4qAW;TId~N$4`7|^hJ5hiN8UZ zG=Zg5+di6_K7X5gEXA`2)+dHSDNp1{{j44Y?qf=^6VqVIG$ulZO(Zj(*!FCU$sE-g z6XEyN#czHVPC(y`55Yl;s-kio7&Vd8(6-CIVuzMnX&H)U)k52yt<7`Gh92P`yX9^I zoQ4?`>&aC_=>9)d+NOEu(a?;i$LTnp4+58;}) zTGxk@jXY?$94QMm_<_!esS+ysP?MGg>W%nWpjMIMfycx&a_e|QHG&#GEEf<4#@ohX ziLg=(2vP`sPqwnj#@sC?`rwh8mjRpn^Q)(upBLj}l#@|(KWTT#ZCd@l>>MiWSBWZe z&A-)weLomD89~eTaxSr&c8*9+ElOyxjDk`QaJ4mD_`NS*iZ=o_Utp$_8=j7q@WG>} zLJRq)z$TPhof(>U_ydrL?yf0tKUbyTlPp=v#DLzomH_vL+WTlQP0}!*G5dk+kCLLj zyuRnNtm$WoU-;CMl-TKOqlRdt{eP<|sTEl}@agf2vnIg%=zwTt%iYDvVUk6Lm%lZC z+lufnA9b0i_dSx#jkiBVN1cA~h@{yG$<}#g@a5;ZQb*51AsIqCTSUMHsIB|$Fk>!t zmeHuYW8(YJ|Dg!XB1zQ930o}s+Fhz9m@eS+Ok3nhN(9Td^|eJQ^4dMP+a@ttQ$O~l z{pZY23%Sa^p(A_I&0`DUE?7p%kw0Q?#Md5C&OJ6p;G^AmeGeSh(2F+C%LNm+Dj4in zpzXibo`MeP3ARgw!FggW0HVE{S^u7?RCmU;TWDZSy_2R@BfQoyx1*%-6tyM- zkr}D_J~U{3SFJ^B2d6{jF7 z`@Odt-`g#FJb#_j!myONxQvBPRZp4iS*X7zOz9I@3Ko8Ty2n~z21s&qH3`%_wpsKp z=m_AIcO{mfFHb&KyvN?tIrX)J#24KOuN_1Aj&f7EP?PDzIS)UEGg{9`u4|lSxD8&E ztjz0O`f&@T6MX%J(p7s|%pcypIb8S@kf}~$>&hPs+ge`44+`AwS}i?JJU9^Qj^lsTFk{f_ z=MNSyAhWJI(iVA6xFUWDh;5ZyTU!T-+B7h!)vZ<$2Rr7MH+d1*lqPR70LUE~`lDr=Uq}z|mXdCX0_4S%?m`%jF z+vZrgrVN9XH}-;|pu`^28VW~G4ouBK&$kLd?#PE2Rn8O)s9wE${k<3CeHy+#4uQIZ zA=d?$8$wr6lZCAkEFKaxNeZKSmXij$dJkSX6$XX7|_KjqOtJ$w83#0!a9CLdj|uDonYGf{c3U>h(<5dgUj>%$aL0mH?spl@7^IaaC{L zxLr4^fPRt2%q-)MF+KGeWhqRbF<>j0!4u2Mm-GQBGzlgfwwH+NjD44Xe@vP)9%8$Fo2|#VQhv$xD~Q01XpfuM?olwiMtM1!-}z->fteXs9;maf!^*?M&vC0Ao_k9VKav!K z)ml>lJcQ>>K%y^eWs0yaEwN`{aiVvnB$xQK0oV;cNxk8aoj`06O60M;NkuZ}*WQ^+ zc*tOBQo#^8$DQE}I_kJBr>}%Ln0~kEknOt~&Sl?#Jgh4sSqC@u{QMEml|J)h(SVtgFbQbWm z_<^U+`-Xr(oLBia$Hq&$F~s6^A=*QSxtpvb?Sm@RzH*ioskjYLE03 z9Hb)kyUjZBjc3M9$vTU!BOXzMoue>rWj(SgkpfqRp$rlDJllbZM-u z%h~f)4>+hBoX2L-aB=sv&SZ(Z)w6HxBYz|6F$CUTJvKVvJanpTn61QakVy-%w$9P~ z<{Elff?=7YAEKE$b0swj!*k^;+w1v19tzTW|EQJRnLCz->OkJ{6ko!!@I+#DHn7% znEz=gFDs40y4^vbM8v;6VgX@!5jg>FMYsU3f-sz4K~WAa!^0~C=i!m(<>go8l~33f5+exwipa^p`DNsJ;4-{Iyl??-Sp`{n zK4E!9LB)FROK|WiE*kg`r}uwJy-0yE2qW+h$h@3)2wx{Bb9YNyQ7*23iu3&=(o*}6 z0skM<7Y%ghs{h%Lvttn0U#|Df7=#M^Ssh6=4l$tr<9WwJgQn|wK%nQeU=Z}~QK7p7 z?T-eO@feJJqYb7-3XDTokaOb@>c1jnPe7>1VuQgTZx1W3zm1LDpM+2WRd+Z4OyHkb z^ZzyLe=7Rh$jYzt3NA4rAdo6KQeXmtk6x&Oj?4%JlOxS0AmaZ{d{rC$uiXA7M+Qzo zsL=1}+-asDrhgUY?~4KddZ&L112IEKQcXh`{`R8B?g|5BzWi7Gf6#KW|26l2D*9XU z%Kz?Hq{AcxANct5UrGFvp8c;R{;5by?H Date: Wed, 1 Jun 2016 02:32:30 +0800 Subject: [PATCH 486/524] Create 36.Virtual Method.md --- 36.Virtual Method.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 36.Virtual Method.md diff --git a/36.Virtual Method.md b/36.Virtual Method.md new file mode 100644 index 0000000..aa4836c --- /dev/null +++ b/36.Virtual Method.md @@ -0,0 +1 @@ +#36.Virtual Method From a8a53cdfab5787ac6b5d40df57f649facc7909ed Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 1 Jun 2016 02:46:38 +0800 Subject: [PATCH 487/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index aa4836c..263d237 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -1 +1,3 @@ #36.Virtual Method + +什么是虚方法和非虚方法,Java与C#的处理有什么异同! From a6edd79666f67f119a7f655b8f44f3165c639697 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 10:11:53 +0800 Subject: [PATCH 488/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 263d237..3aa2709 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -1,3 +1,9 @@ #36.Virtual Method +##36.1 虚方法 + +虚函数是面向对象程序设计中的一个重要的概念。当从父类中继承的时候,虚函数和被继承的函数具有相同的签名。但是在运行过程中,运行系统将根据对象的类型,自动地选择适当的具体实现运行。虚函数是面向对象编程实现多态的基本手段。 + +##36.2 Java与C#中的虚函数 + 什么是虚方法和非虚方法,Java与C#的处理有什么异同! From be2fd2050cdc5beb453021239c5ccd291ba8b213 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 10:13:28 +0800 Subject: [PATCH 489/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 3aa2709..42c9cf5 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -2,8 +2,12 @@ ##36.1 虚方法 -虚函数是面向对象程序设计中的一个重要的概念。当从父类中继承的时候,虚函数和被继承的函数具有相同的签名。但是在运行过程中,运行系统将根据对象的类型,自动地选择适当的具体实现运行。虚函数是面向对象编程实现多态的基本手段。 +虚方法是面向对象程序设计中的一个重要的概念。当从父类中继承的时候,虚方法和被继承的方法具有相同的签名。但是在运行过程中,运行系统将根据对象的类型,自动地选择适当的具体实现运行。虚方法是面向对象编程实现多态的基本手段。 ##36.2 Java与C#中的虚函数 +###36.2.1 Java中的虚函数 + +###36.2.2 C#中的虚函数 + 什么是虚方法和非虚方法,Java与C#的处理有什么异同! From 36a45b65f29049b0b1f152a393f5a79250846fcb Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 10:16:29 +0800 Subject: [PATCH 490/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 42c9cf5..bbd652d 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -4,10 +4,16 @@ 虚方法是面向对象程序设计中的一个重要的概念。当从父类中继承的时候,虚方法和被继承的方法具有相同的签名。但是在运行过程中,运行系统将根据对象的类型,自动地选择适当的具体实现运行。虚方法是面向对象编程实现多态的基本手段。 +根据维基百科给出的定义,我们可以总结出虚方法的特点: + * 可以被继承,也就是可以被Orverride; + * 实现多态的基本手段; + ##36.2 Java与C#中的虚函数 ###36.2.1 Java中的虚函数 +In Java, all non-static methods are by default "virtual functions." Only methods marked with the keyword final, which cannot be overridden, along with private methods, which are not inherited, are non-virtual. + ###36.2.2 C#中的虚函数 什么是虚方法和非虚方法,Java与C#的处理有什么异同! From a0e86d03e3294183a5d151c40417eecf31d5f2a2 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 10:18:45 +0800 Subject: [PATCH 491/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index bbd652d..557a090 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -5,7 +5,7 @@ 虚方法是面向对象程序设计中的一个重要的概念。当从父类中继承的时候,虚方法和被继承的方法具有相同的签名。但是在运行过程中,运行系统将根据对象的类型,自动地选择适当的具体实现运行。虚方法是面向对象编程实现多态的基本手段。 根据维基百科给出的定义,我们可以总结出虚方法的特点: - * 可以被继承,也就是可以被Orverride; + * 可以被继承,也就是可以被Orverride;- **那么不能被继承的方法就不是虚方法,例如带有private、final和static修饰的方法** * 实现多态的基本手段; ##36.2 Java与C#中的虚函数 From 7cc1733083a9370bc9d890f7234e2516ba4a6d4a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 10:21:50 +0800 Subject: [PATCH 492/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 557a090..5d915c1 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -12,7 +12,9 @@ ###36.2.1 Java中的虚函数 -In Java, all non-static methods are by default "virtual functions." Only methods marked with the keyword final, which cannot be overridden, along with private methods, which are not inherited, are non-virtual. +根据36.1中的定义,我们可知在Java中,所有的非static方法默认都是虚方法,除了以下情况: + * 带有final关键字的方法; + * 带有private关键字的方法; ###36.2.2 C#中的虚函数 From d72f4a123e3f1abdad7ce6600c5e68b4930b2d77 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 11:22:57 +0800 Subject: [PATCH 493/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 5d915c1..c756b47 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -18,4 +18,11 @@ ###36.2.2 C#中的虚函数 -什么是虚方法和非虚方法,Java与C#的处理有什么异同! +在C#中,采用了与Java不同的处理方式。在C#中,所有的方法默认都是非虚方法,而要声明虚方法,则需要使用**virtual**关键字修饰,例如: +```csharp +public class TestVirtual { + public virtual void Method(){ + } +} +``` + From 2b4e92634e5087e2201640ed327eddd9508951d8 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 11:53:33 +0800 Subject: [PATCH 494/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index c756b47..99ff9b2 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -26,3 +26,5 @@ public class TestVirtual { } ``` +根绝虚方法的定义可推算:**被virtual修饰的方法不能同时被static和sealed修饰!** + From 1ff592571555430aabb21959b5117047cbb0d39d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 11:55:13 +0800 Subject: [PATCH 495/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 1 + 1 file changed, 1 insertion(+) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 99ff9b2..128c356 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -28,3 +28,4 @@ public class TestVirtual { 根绝虚方法的定义可推算:**被virtual修饰的方法不能同时被static和sealed修饰!** +###36.3 虚方法与非虚方法的异同 From b15fdfaeb5e1ac58e90f6ffe7c0adbf8e6bb503d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 13:25:53 +0800 Subject: [PATCH 496/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 56 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 128c356..19f2924 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -29,3 +29,59 @@ public class TestVirtual { 根绝虚方法的定义可推算:**被virtual修饰的方法不能同时被static和sealed修饰!** ###36.3 虚方法与非虚方法的异同 + +虚方法具有多态的特征,而非虚方法这没有。 + +虚方法: +```csharp +class Program +{ + static void Main(string[] args) + { + Parent p = new Child(); + p.Say(); // 输出Child Say! + } +} + +public class Parent +{ + public virtual void Say() + { + Console.WriteLine("Parent Say!"); + } +} +public class Child : Parent +{ + public override void Say() + { + Console.WriteLine("Child Say!"); + } +} +``` + +非虚方法: +```csharp +class Program +{ + static void Main(string[] args) + { + Parent p = new Child(); + p.Say(); // 输出Parent Say! + } +} + +public class Parent +{ + public void Say() + { + Console.WriteLine("Parent Say!"); + } +} +public class Child : Parent +{ + new public void Say() + { + Console.WriteLine("Child Say!"); + } +} +``` From 568bdd7fdec1eb7a1c972cb68586eafb1f2da628 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 13:26:37 +0800 Subject: [PATCH 497/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 19f2924..5b8e046 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -30,7 +30,7 @@ public class TestVirtual { ###36.3 虚方法与非虚方法的异同 -虚方法具有多态的特征,而非虚方法这没有。 +虚方法具有多态的特征,而非虚方法则没有。 虚方法: ```csharp From 94343e4ab40289438ef586601a50e7c5a4b3ec19 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 2 Jun 2016 13:59:14 +0800 Subject: [PATCH 498/524] Update 36.Virtual Method.md --- 36.Virtual Method.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/36.Virtual Method.md b/36.Virtual Method.md index 5b8e046..29f3adf 100644 --- a/36.Virtual Method.md +++ b/36.Virtual Method.md @@ -32,6 +32,8 @@ public class TestVirtual { 虚方法具有多态的特征,而非虚方法则没有。 +多态:**同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。** + 虚方法: ```csharp class Program From 7983d19d1455582a1b7feda3684d4e3d768b5795 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:42:05 +0800 Subject: [PATCH 499/524] Create 37.Inner Class.md --- 37.Inner Class.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 37.Inner Class.md diff --git a/37.Inner Class.md b/37.Inner Class.md new file mode 100644 index 0000000..1c906f6 --- /dev/null +++ b/37.Inner Class.md @@ -0,0 +1 @@ +#37.Inner Class.md From dad554045a01b87d8a924a6e28b41725660e214a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:50:37 +0800 Subject: [PATCH 500/524] Update 37.Inner Class.md --- 37.Inner Class.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/37.Inner Class.md b/37.Inner Class.md index 1c906f6..a06b973 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -1 +1,11 @@ #37.Inner Class.md + +##37.1 四种内部类 + +在Java中,共有四种类型的内部列类,分别是: + * 静态内部类 + * 内部类 + * 本地内部类 + * 匿名内部类 + +[!images/inner-class.jpg] From 00934737fea320a13a781b967287b47f0d396a61 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:51:55 +0800 Subject: [PATCH 501/524] Update 37.Inner Class.md --- 37.Inner Class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/37.Inner Class.md b/37.Inner Class.md index a06b973..d44b03b 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -8,4 +8,4 @@ * 本地内部类 * 匿名内部类 -[!images/inner-class.jpg] +![Inner Class](images/inner-class.jpg) From 04785930a80a2be17bad7f6ee8e2fee46534ce38 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:52:21 +0800 Subject: [PATCH 502/524] add image --- images/inner-class.png | Bin 0 -> 200808 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/inner-class.png diff --git a/images/inner-class.png b/images/inner-class.png new file mode 100644 index 0000000000000000000000000000000000000000..80200a97bf68dcf8a485e6db73d2c9f8e3d4a3ab GIT binary patch literal 200808 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

%fO}+=I;I1*R%Y}e&2UDHCP6=V7wpc*ipKSfAj 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 delta 24452 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 z Date: Wed, 15 Jun 2016 01:06:09 +0800 Subject: [PATCH 523/524] =?UTF-8?q?Java=E5=86=85=E5=AD=98=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java Virtual Machine.mmap | Bin 449849 -> 450089 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index c41c38d1602b4c46e72dfeeb9f9319b6aa1ed18c..90a8919d65602e1af2c242b939ece57250677a71 100644 GIT binary patch delta 31400 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 delta 31152 zcmV*EKx@CLyc@Z?8%9t|0|XQR000O8{hh){0Uh*!K?ni>918*fEC2uiVrgzKMmIS# zHZU|aEipGmMlCcjI5sUfI5ajbK{ZA}G&w^vH#as$fkuT!0kuW~PY68yox(`tTGSq& z^#A}4_5c7Z0001DX>Kn=IYmM^IWadaHZV6fEi^bXH7z(rH90LsG(#{nMMOq2Ffcc_ z!gmC%^$z`=!br>q3u?1a0065Mw`lAFLj-@wbCz>W_XP-jM zAO-;q61A&tHPAqdp`mFeeRxZbV_P0%DT#;Jk*91s_D*8SK1m!|^6+2Ip#go$U$|>^ zBZOuNbz>{9?Y*6*ht<8F^~~!T{`#Nwd~T%53T2Kje0~NUMb3<{g#@4E3hB?!&|!c3 zS?bJ4S!4=HCdU`p&(9S2GynOw|NH;?D^vW;%M?efoFFznKZ9)lgPs}jyON)u@!@(b z>DP$?n?r9eCW&eVpUBic|NP8|gDvcO3cMP8OriW4Q~dl)Mih&m>GkDAhRrkO(L7g3 zPP5`@g3s%{;MmI)m^3Ts&BbDlOE7;T_?}GxFbIt5V$-i za@Fl4)XQ5V)M~ZS8a~PkX?P2&pY)E0D?U3A-h z&A}8zF~YI6fWQ}7LEPspJ|+)e#nv`2b}10ta&j=}{{}gYzrcq1BA1YV$VZ1Tp1kPe zYo2PYl(iVAoHK!HFz+8X@6UgD#`BGu+Qo}fWHm+ znlfGR=lt2=44p4II4Tng`4RfC*8rHg@&LH<5Bcbjw={GGojDnsLbD+{HjcXTzK}nD z*jwa*t>w$VcHu5ujN`D16pk>CXa%w0vbhga&U{2&nJ*E@1&Wk{N$vfy;e zx4-K9zj1Lm(O|%h zC}NUPxA!*XaNCl|3lD$E#v$;P;s`wIu@D98!)#sL|DysqhAY5Z0K7(mER*yXa*ZCG z;PZCAAa*|j-lt$iDph6=7}YZQ`5D59jDn*na0CuEM>rP!P1=&BJg;LW===m0Vf9GV z>Mf^LCk)1nxrAylFW90^fw4ph^K>jaamZ^_1bk=th4l8O^!9%n>GFJg?S1>%)z;;w zok!Q&cfV|1yVP8N3=X8F7t+01m6r%3HkatEVbC=y1d0&{n{ViBA-�MFMPb+A&1n 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 BuIK;& From 845cc06a8bd71be1b30484da33bafc63e4cf614c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Thu, 16 Jun 2016 15:10:53 +0800 Subject: [PATCH 524/524] =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java Virtual Machine.mmap | Bin 450089 -> 860525 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index 90a8919d65602e1af2c242b939ece57250677a71..680966bccc62e4345970835bbfbbe7d226bb9dfb 100644 GIT binary patch delta 445114 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/K$VR+L?^J+kP?mj2GmPe6m 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%0AE6#3nMZKLQL3wfo$ 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⋘̸-Au0QiB6U!bbxX0Rs*EuGdb%BV5!@OBe_6}*^N{Tr)xx|@ z#0i>lgTL&A5s@szE`Kw${)V%vrjYrdR7|k~m`ihcw`uPTcvEWT{gI@MZC7VJ#OzI~ zlzk#Oe=#CYs9jZU(}eYH7F=7X zQ?B(US4?ZPZ)UY1=}g_yV9jYnbf7|ja3CK%RBWyydc@3Zw^=*n;~$}jVSW(7E0oYu zWKa!uIGN^WCXmOg$0-JF$JSx!=l4QDAeoNIC&%-|#*7$)imHx|2_humI>Cb8qEmDd zmz2}%AehfE_kU1j5wuYgB1uMv9HO}_Y7cOqi{-SY3EX-wR*;7;03gN4H7n8X65-YJ zXQfQ$fgi?5V4yt}DZso(^(UB62cUN(@CLdVG{Y2#sGh_3$!-~Pupg^>BrknvMb^^G)!+e!1NXvI3S7Gm8wrchj*2RYYeA` zte`r5ZsSJ!`o&U-(S*?(UZ*N!bn@OAEKW{$2hyQZH2F%2Qlc74FobV9Pj&e(TI4xWNiL z*+@1>i&|8I=&LbsNx-FPDY(ylLHWZRQdKB>PI&r}t(6&aNwU_VY4W*zf*o4u+Z=b0 zrgS74^+prUk#YfUQa-we&dIaa?jt;%C(z8MXnz~6ge|tDYXuG%!L&)j`Z1%11&54L z9?f+Sj(-~Cb4efHVsuM_;g0)B^1#XV1>+TgbO|W> zX^|KsC>5)*M{83-7s%^!BUCtzBhOjVxHI8-d8K`P;;nFClML`#-`#_<402ugu8>lp@)EDxng+4b~or`I^Ssw3$@2Zhy#}8)5sXW3oqKA?d7C&WG_5p1IWyi>T2h z?#`ggm45n0ePG~*%_OE_L=HtrD3V|{Sc2}TZA7EOq&ko%F-q^4qey(VAWv-u1R!JX z?d!X=x9N;Z4jvOag`h!XvjqA#G@{qOa!KxmdlV^C*h+`L_EB;aBYxMfhSwj}Z5)Btslr;JBPe(rOLyx`7Hg8W1eNOUkJ!?O(EYAkQ+lChv-9eu z77IfIW)M`>5d`*G6F%H1ozIA;On-u&-U}swN52}lOIA}(RM~9Y$rK!99;+nui`{lN zFQmG!50$81t6|w(IcXxyaohHg<^nE}?-iSg3)%0;Nuo|4quA6HA{;M`?qjbwj#7%?}~`%7&@K-62#5_j`bkOur_U1RR^koq>lt?boo~Gf)2ES>w=Nz zH{hwE0rZ`AA9fK(atlvNfWUUJ(rCmZ05}473qLe|KrBk#y{4ZB*p6J%(#Z zACdio*}L))rem0&!c#y>$lQ;iwemIu+td|Dft-=-Ds+h;8=_@qR)4sm8Q!EEuk~>F znFFaF7n?1N6*lQ<5m{g%gw4@xac~)F+TcnwUbInc4fr9pm+GDkDVWmaP?)qoq3rA$ z^I~vcgj^D~GQ#@Qd?lAtiz8Jq=ue-qLaO1KAr^`9WCN;fXAdi&VfITyT4njcoj;}J zAYqt;EEkI9ZiG|fdVlYbw^Vwf_ox+>6=7LIGHFM+bP?gqWwbPICxcxh`MWSP9lL#c z@mmtm6xSICBVgq@Wm1RogF$&SMioD{pSo8b2}8MOcGJ4F`S!y|p8MUslF7WUcIYr1 z+pAHz&qaYKz>%N-NT+%mn=KVKrd12*4j1^TZM^c1%M8Gi+JCyIS>y{3M{4M7siWGN zH~4EhS5_6|^{WLm5sMEM8ep9{7=1+swqF(|%I_2Y_AqVZlDEniEgQX1q*D~rga|%w zJaDtI>I{b9yMK$ot&oBoa6cbcJ&70?zO~{u7xf6E=Q~W+nin*_Nm4%B%e?Rh3S99l z2j%4ylak<-k)ND23@o99ISf+Kltg=A7HbUKz}a~g?>z@f45~^+S)@>Hj4V{-LH($N zhlFHMI7$`|7$OcL5jMS&yunX_F@;85!p)g+opIw--+$r+Mnlq~*?)JdP?$J{M0fn5 z^S~-T$6*6IjUAFOiJD;bBRY(pM@Qbnq3b9}>#Qo#k(Zm))D#x#*KCCuPy8@=vv z+0-9l1h-4If=aPPP06x*Xd5SqKg>L!@f~Se+vvn4RN-u<#9i1UP$!b_n2ncA)*{xj z%76<=Eq^CXVK#g(1ZrUHc}OCm3X-|8_`x95c6>vB)aVcZ_D?9x%_@FYcSN7{Gf%qx*faskWv&Q6c^b+@hqiGfF*Q<;R=T|LoBAbODEY= zw11N=pAVH%6-H~S7d!V+0#<&N8m?xUgFqQ=)P!_9*Uoz7YFl`beIeqLouj0R6 zY#vRQZH^{p2D z)yZ8VKuJU7S?@2B2({w>i# zXIPi*mdAVs8;%>OnWAO_OD^DMY0>hi-04UV6cIkai%jE&cownUO2$7GOV`ln){Y;7 z3l^>Rh9L2C!%u@ls0#h{%*x=ENPk9;6BIK%SPJYJ4^5qfbzbiihUMY=wOr~fP&F^{ zVn)8KQ6ca*MDcMV!qdirIw^myF5~J1H@%N~v~cg+hdSdXKe>zUD8f#Vn5ohfMV-f1 z!26TAp=@lAIkUkC;1}5IoROXuq)LTka5j?K(bS9?7z>P9k&5OhyTbbyV}DK|7YGx1 zZKednwON})$ghq|-X~3C^RiB_C(7DR4hVM3zga`ZhJ|81Glhk)jbpZenwNLS6ek)~ zzit_m5bZUX$NK!l=+u5kuBI_pPp9NOKGu#oElG7mVJcWrpfXNqfcOa;7z!$KdQ6Nx zBtYZJIcmUb>o_D(42wp7&VL~-jDjUwsrB3dN=5{?7uEfq!34!>okGKsQN4p$Bm$X! z%Gy3}NqO%qvyK=ngp(4R21}xJFUB7$E9(?Pm=V+0lt=m6kiQ8HSY**qGSJIWgE_~D zmZkmcD1CkDyd*m!lACf(Sry>6$!f3tzO&t1>Qgf}1l*vLNkT65yMN^Z+xVihjeCtn z%rK%C)jyOL08_HFSPUtPlt#=bX6W*7!vDYJ-R%E=Jow-8w4**$e=2|qsJZ|ErMcQi zmLgmQ^uIG|UB>@APz+h=1NupTVKIut0+~Vq^!<|(lNYTPHVpVbP)h>@6aWAK2mn+$ z&`1Ft^ngJK0stHf0xbY60001DX>Kn?MKm-*H#s>iLo_u*Ei^VbK`lZzGD0mfH8L|c zI5sdgHZeDWMukQJwMGI@2m@3((6<&r1n@BfR5{R>33CJ=e^fcpNUNLE6*{~E09U;N z04x9i0AguwFF`XfLN_!tGA%eYG(jyiF*G?XI50OxEk#B)MKLllHAF@@LM~!yZcO}T zP#oR&{ei+@gTvq&bZ{Facwhz_+}+)S6Ew)+KG>ka9fC_BxLeSm!95T(2@t!__jm8V z>b~mkQ`Ozoe_i|R^;!GuItkjE%7l2dcxY&7gm4uFT{JX65gHnL2N3Yzh)Bu$do(mA zG`NDi{u}hmFB3?2qn7bop6H)DX1K3oD3nUjct3rwB>Mjw^Weak@%_`; zmaE40|L$$J-+Lge9!$GW(bJT0c>Htv>R-@BZFO0$2lKhC}v#jxQk;ZVyQPg}E z%*-+CHOmKAiAbN~>Sk|W$(dW&CQ`-V7|8)OeVljJN@!fw5-<2=`;>etXC`VA z^Mw%}66sqGP6Dt0E6 z1LB4G$$wS2(TF&CWTplrZGLKa6s-TFnO(@o9=hYtS@-~dY+Hz3&ik$KNU)Wu>5smR ze=drMs~YHG8!&uX%p`%Xe^p{IOML3A%4k6+CSj_>A58b9UJLfIZ_Nv9 z|1uG8Z#PToF-cE;7n}TdoA&lmp;Dm(>7#i5u>5mpUQtIp!(2+By+wpD)WiAwy@jNL zxOMf(h)XQYX-_>n?&fBSd(!mJ3U+vAt(Rn+U@u{&Ak4^@^(msLM{}Z1D9cH*e;()p zX%T7oz<}Ji8mxF#JbJQ2_mSx24|q8-KEC)wwmpGB5whC8}&dt1v2`+G7%L%X(h*J}51=P@pW&C~ab9PQHS zfkz0>6w^fn+mrs=*z|dQzT=KHf5Bc|L7`2m%#v{;Mnv9;{NqU7)Ptm`2|m)RQ>4?~ zb*IqLj@R2MYf$I4XYFE(2x7#33tUdBEn1fHs%HzjmFDx_`U8UxnVMqO)c&Hz_v-vg zH*OkVH9P+WYRyBKL{TYxcnwWrXlms*6PaY~+~jD*0S!C}_KZGW2q=AGf06)jDTc^; zO2A@qi&}z7WbWb}cCuF)xBoWN!UMxPHn?F(bT>^|&uIT5+&Czkp4V?^G4~65(b?Ro z9H%|;Ya~a}N5EYqY;5;jGmv(yg0sF2e3I?H<{77%e<*31%C^5(_|#pbi47_J@4(#c z;o=&?avwHX@M19E9$N}le^NMHx0!6*EG*hpJ7-Od{Ip{D8Ylc4CjorAi#BNdEq3qp zQH4sC!*ffjwf`NNZ6{sHSl2(ANkQeEgUEuwv$QU zB-UmcB305bzd&TF+K970Yu}h;U^5xFt}AZuPjO?YQne`b?t_&4fAzdpzS0TF2Zl_u zAy*-ZI|BNl)9+H-`$Vkn?-Nt27cD53jb$?62Hl2a`7HrlHh3@`a_|>Tn>YZ^T}Q;` zVftzZSkH#v9Oo}eeYNU-NO-@SL7j;NEHI*XFQjF&J^#D&LbX4@g<6wCcP2^@zUn zq2rIGz?!0$B#(Vkxx0BYX-`6}okjK|QaP3n{rYog{(bH0e+`Ic%^icctn?MwX+Zx~67wnHTR}zy6AxCAc>`^4~MvF)u@y@il=iTxo##eL!~kJ90yV)h;(l;dE~| z|JiCXELZid*B>NLZV0=UW7R>eZe1hxnVGde9~;<(*^`S0;R^O5@36%2ZLCj*FHpv` z^?FYPHUTsCe@wGEsYd~-jq*mqgv7F{WtEd;b0YZ2ZzfD%+ zq%16Cnxw$2m3g^d;a?yxfWjRHRyc5_J&Z)Kjot3Z+rDJ>%!gV+d!(ls?cIhwMbMG& zs+aY=Txy8h+l?GfMqhbbf~^z1gv!e=t{l{h=x0y+dme&HBTszW_4U z>FLGao4Amj`(mW+H>WEDOY-Y)-QDarcRIdcrQ^v&%}$szWZ|>pyGD7O%38g9 zbm!Jn$G2=&_}R1~iA{b#Os;h<0vZj%+wyxzLS9Rd%sSu#;2XZ|uczwRK_i&?HdFMD z^{f&Ie;h)v_avJr3K!Olxebz-GUa@3>A({nc~t)%?a%I~A)Hyec@gR=-e9(DTV z`*gz?$u)_>QCkMOKI6Z1%P@+00D5wBu=AS*djo(|T_pZxt#FecK%AIjDEdlZEJ91Fa?Rb2SQ7F zf164kJ(b!fJhJ6we%S{?|9e;nAFCtpize(Dr82KU@~cF+!&7R`ss&y0lk zLK~kJ&M9>DT~zTop{|u`;eY>|8BrHolSch_*`I>ueX%DgH4*L;|05Qwz%Tw*Pt!)f zyZ`V9_9R*Vdz^TMr;x04jF9eGaHlC9oWaE$&Y-z#mBG)MXEx&v5&q+uS0i^Hf5!6C zYFsRj+Axw%Tm*O>dMfoEOIl&FbD?_!XD1|1j42bC6ZMBZL2Dn!xpyk;LrKHrdAWwf z_`+l~ghS+|4ZD|S<)*>1gyi6G1<4DauGZ;kOwH}8HSwdUY+PI{L#5fPR`zd_MP9y^ z%+}cg&rR4{vl%THt_h7^wkp6pf5ExDRg3FjqvpWgtuMuQS=G`{Q(FCNAHON4>_*vk zBwNf5R=xXLrwUQ^XtpCWyd*YN6pGg<-ATt-G+Gv*Ehcv&JF^K7End` z^BfnVL}%*!Mo|U5ifm!yw))kd+81E|XD@jUhp{;q-!I2G?|1+H=$hBie->YPvns>W zb@JO(v~(}Ak=+*>9^{VOg6g)N$uZT^&?HnRkdQ|M17@o=G~WS4fMs50lMw8bbOAD; z#-yH7?Ij!l%P%4~j5MZTvT|SaQjDO77k<%gp2nmBvzZK$f|=E)5lV(Dg(z#ndbB*f z*b(mErNrrlx$BZ9M|}j^f2nL{@_$ZV4hV7KJrmS+96GC|%ylpW5@?#e>U|xH zaMVn(0xMyj{rmfKfCFbNX4&J{yRVb~E{p~~{MdAR-*>0Fm|(QYuJ8eI*}2Ke#$~x- zeax+kcLEw#kX7bBsvg2jWtJHD@1FsW3)3a!3fOhb*SU{G+e@b_ z+=HR$M@5>>Q!a*loI^IyJn+CuHxthK@|q($+e^8{QSIYi(fy3Tqm3wA;2d|tQ~Z3P zBL>8*W17{=JEO)X_Dh-5Fd_;wAh_AUA4Rf64jgcZM)=_3A|Pv5sqEkG9ELMU^v?y} zKFx$|A2J%+97G74f4SiHnfc-^h=WK;n$JjS6)l+LZV&{eSsx$-+rM{y_P_M)WRqk3 zwLZZDd!gyd!eTW(|9`U?S68xbS2s zNRuVyRYX7ooML6X1zw$grl&>rt+)UO`#yzz!yxm}7v(^_`}D8Qf`rlPrrY1WDb*KEV+O9ALviuzzTyNX6=S+?`v+jv~FPHu?^XfB7UA9X@0SqXXl+Mb`gz>~o92DP< zQfoa*R|6U=7gz{qsP}KTV)2i^`+dYwLX!ES7raw8qRm7fIh+nQj$EkFQl3N`cwT)E zsffT0Y`PM_!eSM6z{tN7e9X?g4!aHs4g1-Q&%71P6vD|Voh7Mw-c5%}G-7aU5{Mk>b(uYzWiXgAnff=V_#zp*Wh)@kGh_4DQl zi+rLKH*DC3bkz;Gx8yr{7BHC|e;i^U3bj$&&|D=Y4qk}XE}Ipgf8-wJzMd|os#kZF zgfe+@e+dVM?P0ud&LtI&kn5a&KP{s3x~TyXjctro&WrO>KQf+F*2)zwevtyTt9rWNv*=KwYXS5pyt%Um%bPOI3@a5DXgZq|3}Ar^y&nHfxa{T7VEOt1K%58>yXrrN0*EQ*=Oq&o!nlpg#7o> z$;mn6i9dzs#YfO>3;<72>Zyzxd(hYu{iUwO5<}iT{5-4t)}hfx0{lXXyLg+KB6jb* zpUJ1D6=`pOA6k&62jM+1==vxgPV~9~Y7yw8i}D4tuVNOHKP>=C>W=J#|lI6(es(J&cTz zdH2m>iq_lbWpr-EPitaOn?3cpSVKCto1m2h70ZAPhqC)xQV5R^oehA5Osn^Qntws! z0oBna$+&|N6LyR)pryvXFsLEVUafY` zaL+*^596ORiJ@^J1Z$Uje`rNdfHM*& zp+ULX{IBNZ3-B?_QqQPQX4V%8+=K7+i<=gV>I|nX|K8>Duxg2G0gvlPSM#1bD?S^P zmY(>#bo!2;vXrMuuQH;ylVbWUo2 zGZmRc+pU~WrjUd@)Ac2bj9>YxcvWp=L%X@UP^roJltE%M9ZP*|0zK0{QBwd9nLT88f&({VJ=Alq>gI2sv*2mLg2}US_V{`3Re`X`j9z2uFrYLB( z1T%dqeHHN4m5bKb(G1LpDBJlW5!!hTXf-GSv7oFwBz|J-eG!9(qa{wa|Cw^#Fbm;Q zaHPzQ>QYU`PM{K4vM=k zcj-HVLwd+ylf5t-fA9QC)%JT5yM&0nWv#PNf-Xg|Zk<{p@{RH4kdyQwjgPahe4e)T zeEFvEO0z|TK;C+52k9y^Bw%}ds*j^Zl?*7i#Z8%y#z(r;)mC!Z;R&cQMOc$*q^koo z#1NmhvwKph$5&24j&C%o%q_B#lfyEWhW2|th4GVIH;^c>85fc+pDZ*Vn2KAv*(Vp; zB#4q`*|h!-f2mwvzx}oKa>{Io%R43ba$P7T@LSL6hq^jdbBha1yhMXYZbOI01yQ6P zEQwq1#rXpgvPwW+=$SVtWYi7r<6I6+&~(edc(`Fg)Q(8Rl-FBuVIVGVd`y{3=0q$} zo7gzlBq|4kIm(|@fb$H64CR{?z~DE-)f-%glg$-;f6Sv~e{=gE*!7F57dR)eIrp7c zQaN7Oe}QD-vd~?N2TI(l_O#0M<2AQTYj+D$3!kA0U2&baKO~aj}QP~p#ZVG zcvJI-Cq-qItKwcK|X zr#3D0h*kIJ@6%Vid2ar0alHE{&Hn_jGAnZ(Pd99I}>~ z0sG;W>HzJ{tE7BCd>mSalTbKowO56odnWsre+hx(X(S(}>)m_u$Sv^NMGBafE&lu2 z!KCZn!lXeyH${|>f%O|GEV|T*jo}YezC15l^rpo%3Y*N*t0Y2@B+cIW1Z7q>&M=^! zg-HETVt^2A99H;5YBT)VPK)*_J5NPbk*UyU?YvYw5_V!F;eC1^y&XKA2m~bHReVx& zf4JVC!vpqEe;o3fh-p_K;PK$3Pss`7x6g)no|L@FmC^AU?cn32*v?ys#2y;`8b!^l zhR=hCXu<}x?zi8{5A#3;cm{=D?^@)xB>m@BeJ!5qIB;s-7l;g)iC%RZ^)FRVn!BO- z;KbFNK@B~#TjTPc4U>XLbiVN}=;P@;e?j%mM9!TF{xp;@5Q1|a?DtgZtNs%|tv5OP zJ?yY|HILKXD}I8mTi%uO}l2 z7NSXBk})_>W#g)n(|4S;*z&N5SW6xv5>TwTTKOjg5-F(q`M|;{_$ZsU7;0qke*$z| zHQKVo(vT14Cq-teSgIV1vFYp2N17eh>9<6s?~K80_LK?5TX6>4F_3spDw&Lp#E zQp@6${d=3%c2{-|dsWoPz@j_*f9m%>aab5P$A6sPHU=$w<3(A^kW0vg)bgG}`5?8( zx@@a!+gH%Apl0U9A@r){2vn}qo|r`ur?jCi-#+=?DSpXEXU)m&9A>5`1B~{>UW?!#l~be};-N=d$ne z#{=?7x^EgI*t=E;B!7GnifU$Ysu^yarnoUbbnKvSU9~c@3KN|Nl&TM_n)Nua>&D)p zZG%KdNxZTts}Uc`fMNB1Oqonze#6=CL_N3+>V-Lm8~N6ghRx(`nNdGYe;+UOcONSP zjw$mkSiN=kOWdhH6PwvIpW{9hbd>X%~w8pM&^ zBV0^4G}ei~(AwZqjf;o=jCL}pf6OY$zyI9e%WW=NU1cDl5i8l#>3zVdS2-J_H&xfE zGr>sl1^HDH2PcgGLhg@tV+dQpgW`jD#KlX3pd+Ac*r?Znm?Wmhe;3U;zP~5fbxpKL zS)QWpbGdh=kr9?lh0+J*kwPnu`FK1|dE-B@Es{-5A5%GoT4R**tfoEp3&gV{2A$?b zdu|TXTPM80t<3)*%Qz7IJgOKBDknHt9vc!nX}tQoNNUL~!61l4G_<;SU83@kB=Yie zlF@)nM8T|D#&+xRe`fIqTNYfE563#O8q|20u%Th^$_P}{Z5f#pj*tjyTPVXm6=i+= zXIA0IEV}KE6Qrd?{+*R}4PGYLit{O8P5B3%XE*wbSEWC3sUJTR9T6(`?Z$N-0_(}9 z9ul_264db~l#F@uUN9 z@}K6_Q$_5x&ffxPdb1;0-!$>q65cljepDNK_xA4-f312Rw}5i;$xEYhQws{!N=@x7 zPl_(xWoAF#T5BKiRJsVm?Dwu!ha(CTnRuTm5c9cg!ApBO4)-datH_I=Xwg%K)jD31 zXD~^_JZCjaSBVA{bKmMB%(9eox@SDH(MeHaDmfMUs2XTQgPC;aFPr9Savr`>E_yZS z=Oxk7e;f>U$=7^4VhU_>(YTyFKC)$zbj9fyrz)>8*aGpyM~_v5za;7d{iGJz^NMT=X6sf2MJ{tuszTW;Qt8D3|=BNG~-4pDh2a z@c8F6wm+Wou3JGKNiw#te)fEVi*|O(?M!zjr&s>-%E1$;GZzREKT ze^6R_3BHf0Cp5s!L*R$*(J_87N5h<9Aj)yxl=pTq>v}fDPr`cptvyZfSYZg5LIow; z3wY<2e7 z3tdIsi>VY1FNo&e^inz9QXsSiJrmqcTivteaA}Aw_Q(8sql8}I!x_t$zXwzU#uT58 zXbp7gB)afSQ$EK@emGdnMT%3$w5)jsm5=ha?0;);6)?a1PD^|#aN^mX3M>z z9x7jIZ9(i%;3260r==ng6e`M83*-d%e z+gZIzkuR!_oy9L9;8(h?tgigivY$4TYxVAZfXk<98?o+g>znv%#r6&41fJjkZqD!L zrC4}40_+#l{Wq09;+5sx(s%fc4EtC@kKh#rSG~|#c6%avc1?>s7(d=4_+wJMDWkp8 zhb%m@-x4wJ+=fjf@^khTfBgo7^cf%2qBzr!CUaMpI3=%-pQ&DK5UFCbfJ4Y7JqDL_ zo^&-LaRE8zG(MOqtRjd{qGX)-43Yudxfnw@1?)~C&F8yuM*J5`27j5H8Zl?9 z##<|8s@iItfu}L8%LJf09FbVSDs`gnmtUK6dYRf<+$IsSd#(Q8YV>{P(DF(Xjq>SR ze9lOI)Eb=%BF2kSE6e9XdWP}ds)=CD^m)B`X!djU9WqDd05fcoV#&SbX~=|@ye$teJ>Wi^!hThl z&THxCKuRpw^!BaUhlO(7WeGKOnp1op(ZTd|R`fg1RdAw_`HfmWXMeMQu;h&35Q(h) zV_&-f0bH_^3FBzqP?F36$(pB}>;|=`PRym{F+%cP?*}YUQUi>P#Gqvg%ovr55kJNz zWP{p%LCK^_t?3}JNL;fGFu9c6x#&;Q|JMuPbA=J7Q0D-%dX(n4KY<8*lzDTRq@d$l zkKY}iHk;{{SfI~iCx1yG0hlkh73Q#s(WR>}zg=|pQ?SpL!ji+uGINEZRocw;SmPJ! zNgKp#wL8;oDzt^}<6Cixoa=J@^{43!-mRLU;M|`5BT_o60#HvyPPjY*{peHdqsKv`y#Zp`YocQ@qO3qj@29{jSOgw^Ec^`ZJn2`*f3SAO>Ib;H7jRf+UD>>U(4CW%7NY@6w{5n_T$_BB>9U&NuIOq#<^b zVWTCmKN(vu;%XNe|78kb?n7^>BB`pr4Yec6gCq>XnSTze{ykl#LqB2LsIcT6(+K%; zIHJ^#^z5) z9$H1^)j!;j{-@UIicSeVez;`p&gwuROdpjl_YtJDnxc`^*IKasDmzJDhGjB#TCfJ~10PIitpw>AXW)U+~^=4wuBgD7kr!H(hR7L8Wlu z-12a`?rUrAA+Zg7EkDFKxKI^wK=Yk4C8HKBR7FB9x9W^8h@dfG7u?T2NlaT{$`Ix1nW{!l>+Fh z%I{@mlL_?m;i#1&1m)$(yeDFa+5AQUFW^FnF?x}c#2VY%kgm~0E8kdi!P3KNE@O$8 z%CTm)49x5isrj7s51z0L0s6o1{zugeU#4|D zYJZur>hiu5^nl(slhN$=5oL)xFFT z7iHQ^PS`n|=MLkD@{LO+Dy=GKa%0=G&QOSLBw8dcA`)c`(xBK=BHjUCF;|i145j<7#!AvS>L+d8djvDDj#A_-n0fsg%5)<6yvn9FM zg(jAT5P~r6v!NjxS?2i#wz$Aor3$Qn-PuP2=s0y8V`3E)3CKWO$|(vwV60dJKBLPv*iWV*^TvHDoxk!>_mo#AfmDH@~7ebyzVC z;DQRtyC^DrFt!9eW_JXaPF==wc%0GR2RihlM%_b|McdTobc1}v8{8WOOb5*&>q#yw z=EqfU@_oX@Fu)XwIn`*OqsaU{I+EWv($|*ED(M$L+$QQAw!ZXj{3bx@@55f<`z} zWJdpxFvNgM!v6sBEvkYSl7BOXkhDie&;HyRq+vOq#%v&RDi+WnA_R0A-&Q^q(auAj zR|qUiyfso2i2Uk>nY{v64UEDL$lk^GS%0sqhN$0`MWW1n9B}XmnP-Z5;rKmf`C(Ds zZU=nmWH>2eO0yEfod{N9^s3Ct-)P=y?^6G_dNIaLr70AbAzi?lEPpK`B3_nfjsmM+ z5|QLLq3+jZk-p3oZGYIiL3=INx9(@g^iFI{3|;4wyGLYo$tkA|y?Z6!-WoTI!KR}+ zJo}S&k=ze*ogdFCH0wY!Y;$t|GP7a4g1`vIng+RAc-OY~z7*Q)`Z^+;2sS?j4qSlH zX%zEGdJ)A3G#=2bM)yLtGz62=YvabJDC_tyQ zDn5V+&rIu#lFU*c%ZqJ}J+81Zoix*|_GGOP;`RG@sOC<>BMO#z{K1SyJnHlVxBmN7 zYDK%IVRikAX@9U$ZN5CS>#M8%&x<85xusH6^&+PsJQP+OU3I!&E?yLspGjdov>6$t zk?f_?8F}cP_bx?_XjkW@-mcy;O7yee4fp>+~kFqB&eSKdb>|@#2!TBE3F$OC~>-X{990+0K)| z>jC6gVSh(k&%jHvo+qtvJi>Rj6|d&ch{QqkZz7W!iQIp-_Kab`+hg40p+B~{6>BNu z`N-b48@FQR*sq#LhnZZKW`}m8O!bjM*P^Y#RWQ} z7a9Y3t;lr@h0WKHeKk({VLB_t2YV**5r100^nVR{yYZhES4p$Dyzi(}ZF3OB^`2bd z9uBv5o%yQ%Ddgn+?egu=SHoR#H8a#vER%JQztPC87YCQB31A23bM)bUL)nz5Q_~KF9VNn4?k6n&e zPw-gt8Qjj*enEJ?z*^DFVAb0fmOa!LI|Ej0_r)F;$qJcn+{cv}ekCBIq^1k?{W^XB z+Dr1X4@SKw1h_KNA{Fy~)7_06{uyx5O@Ff}?1h#U{kAfk8dt7#XFklDNcML7c^9X| zPm~BrL=VwW3Ts#lBhkr2%DUt=@Ov^YW=cv$w+Kl6C=Y+31%Ss(FZu4zrPHg2QsN+x z6syP;kL4}iTg$ZePCjbBX*6V;>uSjsAc(@<1F7i`QZE0(`c^QHK0$iuQho5O) zJg2CvX**-iFr76e0b&*XCV0Kg5eaU=m8xh6*02F6Pl~0|Vwvr6Kk3psRc{zfeKAujVI-sEr{8B}Q_x?e6FqqD`+3lF0C17Kz=uZT;OC_J3cqI5ouT zKVlaM`tsHC^b1v$;OanqV*?>p4c70T(%g@i4*gSd6k4UF-0EYj{>9rTVt+c`hc*7R zz(j@k-(>R6vG73}P!`_lN+Z$Q$Yb<8ODdH;?Pbz~?`FrEVzY#d7J0rLobCG|V!!Yr z`xi*6SnVZlEddf5pL{&#lYf4O6d0WF*wJSRDdSlNjo9#HX5n5%wJCN=#DHBjuDBI# zb9GOS9!zi-wgo7HwLmcg5i?Tjn+(i9>r-TW103yU_z4UG}FlH3}TvLKS>~7 z5L3(uDJ@&!g)hPG?|+k*Qe!($^MO!bcer(4Ac%QNH1;57d%5X;*oDP^;n6=a(&t8k z$7T3b4SP=x){(`+sxv>TNt2($+1`ehK`Iq!e*g6=X8ql)s2s?W92>U9wzX7=-9TIO z!_{HAoG_hgHntt3t5{%(D< z+M;6hP(}rh;@uFJVyDNeQ&c$MlSEhT)t~H1uZ4F@KQg%mUNUL8#9=fm3&8MXv;Siw z%Ktp3JxT(L-!G+ApHa1CZpkg&x7f{oQvvv+X@US&;AwFC_C)wy#*rlH%RP1dDt3N% zN}iA-n6$mYTz^MgQ`sGOD2DwX{Vm_?prp7K4L@10M$=|U20fXx?IJ+c=<=ilD8ZsX zB1dvB&6-7Wj?AnBL`kCm=j4)g;W4^~}GW@P|1^0!ox;;U^ zS$z%(Sr!kt$@=QOMh2eM3xNJ_ki!&bdJ{b7E7AWowfqNMGiMtc6J$5z9TP3I~%-6iv*N%6WGGFm?$^;n=NwPUWV?B$sX_ay>B)h=ZeSV~Eoi8hNM|=+!5`!VG8qv(nP$v8GYfp?P*ZHKzILd;adBP*hT`mzR2*VWKB){jG1zx6uYY$(van@X!pwn_Vs{`FO+X?moHNgm z!GI0;ATp*3A`z~bl%qDQUjmWkW&0C%uE^Z;I4>WL0a>#?CTma!WLfSiL2d(G+|k#}q$FKE-kp9}kY>6{y>VEN zlYgcW%O%+=4L%;_2X0Wl!G2RHNY#sI&i3W{kCLZPL`pZXwDep%aT^$Jp(Qo;6ylt8 z`(({HZPT}lhP090btEskEhr)^ZesaXPu!19{LiTz#&b252Stq$SF&DXpYW?^Wiq=B zUBp9*gLuB@{VnvJzeUy|Yxk$NBa)NNR)1rPy&(4W*5bO{s5jfTsR`5?6_auLS!{EB zzL?S)i-zq;E+vUtzgm;Z1Ogc2QEZA(TeFn=@q z5anrauEt*T0r^r|IxLz=q@*zl!kg^MS3);$0$ti82h_?p$!jDH=W+;+>*rQ-Anbtw zH9G7~1}HaS|I3{0@dfD%-A1W_S^tLNnA##HafTX$z`oK?*?;sdrAl#B z^(WX4LF1IZr{XX!ZoJ7mtrt-k@jVz#BoG8_U?eL+B9qbOAj;*CWKYuYfpA040Gqr* z%X%f?pof3!?r?;1xEQBDA%k97xW`>3l^1t++kgaih_Y zAApGE1|3(EX;d&&0jN8KsEu#cCb%W8`+3SPEf9@O6~yKf zd1zf$oe8WWC~IJ$K(FtHLoV*Z%hlI!M(BQ*ARw^Cb0Wpb4hEb_Opi}uhGl4Dwe@JL z*wvkM?5_C^?}>lDbx=rN*OjBr!ds;B0z7EKCQ0dmoAThXvm!arkALa2s*hH_nWz1| zcZYA8?SR_N3pb=ps%SJm)ih)Av2QjYqnXMgmkfqPGR;Id-nF_x&4<6Ej)AlZUjp5J zHJ2%wXm_g9;wI(d%SSGmWPMM)k%tQ;tlS$_po7L%!nJqCtCu*m-5;|%%QoxI&h({yT zPl|Sh(-$F~Kn~9`5Z|V`Q^#?#+*XY*c3KxUzRcg|u6~0@@}diR^Nr;y%68r`;y=>A z2`gbfHEQl2I@+u&;gl*pTNsT53~RoC_8$#3_G}*{$0D1j)1?#aH*Ft((2^-L+826T zYYvy&048Lom4D#rzUZw{7%2eTs8-V$FNJt)+nl4%wO5K{tpacUP<-QieK@`DtI5RZ zLs4hZtf7nOyE%_H3SW_XL2}#)wXH;P#jkw}(Qdh8YN0}a4i=2~JW>#JAWL*((M>C; zqz^DfkE~C8tMRsQRCW{e@YZAp>Q52MIRst$!oSw>F`9xXP6geHnBevg@Wr zu~e}00KUd_1(7405GAuAaj{Iq!vZ2*sxy&HN2*b5R&0HH)=(OF0(6}_!TTi72`|rT zRZ-)ZlYr}3#TS>v!;o=*DHVgPe}!(|YnE%F0s}`JEANs%)6%C|SJ|rcpag4jmCv^j zYfKOs5P#Q0aw%HMK5EN;50uL!)XteyM9%{c_a~OK{<{N9P_w}DSg+An=)ta2r|AFQ zqd&Flhd_nb`Tt+FycJLFzwqHJ9iCmSw}luLxvrRt@^IlzYYLyG?@WKGlQ_*1P|I#$ zajcKeW;LrHobtd(-;6E9Kcym}XjrD_88p!uiGQ<-OG@BiDJ{o~-%6L+Q4wdcucuLY zptidC<*2R&s2Jq>Yxps?{AhMH9U*f)H5L=Q^LM3M_BbwvAgtWkS@2#H$LXCO#+!}3 zO&aviQ!D}1g0gZ8*eGR5??e3$yv#5YAVJLT*MTOnwZWXx`NjYBdA?gWhUc@rNwBe< zqJO8+j+bD#c+0Goq+%hjLkX*{V^t>uc;)$h@W#Q}x`<09j(SLO7Ti6F zw0C!ai*k#3KQ*({58?5}G^uV1=AtXI@PGeu(4t7g;V@GRup-g`Zb{(^2jig9gwYvKPex7ejG#eW{@ z4Axq>#wR_)wl`rfU4tURQ(6DnR?lK_j&QtAv+OU_`A^4^t$jJ3*lcrypziGQ;HxCV z3wQZ)0xxtErn~nF=e{^`3V$gif_0D9I4V<@@8EhsL&BaiR(tL5ToB`Z0@XG_OwQL? z=X;JF(=S`v=Pa7Nq}VW&Zv<%clYj4q;gPOrF*U6eHS?FoI=M%6b+Ico+cv0+N$OndI3ACd>7vAvA=(vdW;KCQA z(R7R;DcLslp#X$cyDAf7ibF@@SZ`UPnRyBwmTu*Nb0rb4NMKMwCwzLLR5X@ZJSWgZ zWqUQ(6qXWFpSs@wGT2iwC{;eZf zVb*ESg>+VnQgImJ$Co#!?i6Tc%k$xJfpDq&#AZ3DZ_u%CpP05XfY>pPa5) z>AKB8Qv~!T)BhKc&;aj8DiQ3H${!v%EGFCoKFn{=D{4`()wKr4+#Df8yLZPgct8&& zG~&X!d3aOAcwvb2_Hg)4o_1pyvqW(>2r$4Z+}KFw8n*j9knp3K()9? zy|Cw8UA!Tglg^x$pV&yWk`g2zQMmAPs-LF!Ad%+`I6&o5O`!28zNfX(DEOosUlk*+woT`YV+cB!tpnZm;wB(UbLY%tsBIxve+w8srMJn}ioRsr0LM$LMYE_e; zfI&oLD93>Do__~}Z3Pj5rkq9Ci9)jhe&)ut^~+br#o?f;_L}6f!!H~~wDu4*cUYm_ z19C{vpUD-D@_i(2hwz|Xp+ZN%%;~ARx4ZAleyiT(yd@Uk*LlPJ*i!Q*JN?k|(I<64 zVS{{sIfGI{C&!0<=SNiEs;;X6_AHl?n{Rj5~uW&>E%h56(y+ z8qXwxLJ(4^YsP;$kHZr7B1gN~jYn^;&bpXBe(fq);cUZlZcYAQ{psD;X*CV0Z0WTy z#NCh%F1NR+zMV5jw6T|f!o6vw!oY>w)Bkev#(x7fy{w;Ao7W~9p=a32W+G(NzZn4$ zu@s-v4$QduCa2SH>C!?K!Ynedezb%3aL91PBTyjyS{-GiS`Nkf|yHN zR{IW>EDzKbobi&BoU==Pniy;HfPdv^kuLe&dnx_nymTMnnY`IJzvKT*eN3gZ{{F9> zpRxwW0%|q-ir~O$qmQoc4s}M2!5W6$Cu|M+eLwC|i$_KC#Tj)b%n*dNLE!h_pI_yt z1hLP*KOD)xY&@;`w&Y@11j!Ts`%GT;PZUG$BuCDBh|=JNZjTam{=PX3t$!rmxO7nh zIPLOvHb#zy>?j6JgUaH~eoXL5hWvdxz30KKF6BJJ+$u|F zAq)2)DfLP&uI;u_F+my23xAS|*J>ZHO47Ce0&-b2WWR%&4z>AuW*0X+VUnh=+Df}vo;KA?eD|psJ80A^dv6;SdlA%3 zvR$OqK95TQC*?CI^9ViqqxF|*gVLv`_=8-^-e^W+lk7-`OMhEzu|FZc(`rJsucmb6 zE?QwG<#o{P>WZvZgYQmdo#ZvHZ57)^R*X5*rcb&|aaBQCE^*yaV85^I7HE_Z5VsAq7mrVUFbTJ86nYT2UaA4j3_6X;EIVa~6iPOdSaVAFBo$i`h;+#h zR&LgrO}zLs&n1~7$)w-`otxs3m=}F`Y?Zom|LFkZ?SFs5v|S}VKZ^w4I~96klck!| zmDtx3jIbTW>lFYMc*!y6V+`V`z>t#?g(beQ`o1kI=FAeR$^r)W+qaUbGXE}PW+$sJ zaVP$&f)9q*crWyti+h_oKUpT}L#5wv#uufAU7N62ENqevZ(=t5#QxT&(0UhK;S>CA zseQ(4`+s?9GUw^D@=s0Qt%I| zZOj;Ct3qwRUZEje!Dcrm8YAJk6rK|Gfn|TV03FhQcGsBf`m+l!)S#;KN(vLx3nMAO z2`h-XTa?L+UBB#TJE-yYFZWYxoezpfIv+~*et#W{Wy`ruG=pZOK-)|%zFEcLQ=tS5 zw>?ozl|(R?r~a;CxpEQ{UDDG7$Be0X+LQUs1^za79f5|n?hdsp8R&VQP(*OWaI&O& z#vL0rZ2kf1HFgH|cl3nM z%YQs|bp}^)d8Is==xqs2` zk8sTc59MqJOWj#9zp7VYWDaW*RI>YbS~?z0SJkA0jt$R)OFks3%&C-@a28Oz4l-`Y zD)+VK(m2>HeVd6!tOs^Mss_dH+;()?uJFtfo;UwX|EI(0uoq6*I7Cgz>pHy)(t?Ah zp$sdB(=|sfce)g8RReNBj&_Fw_E+P zB_n&FI4;%IC*!vEfbTgQkxfyXqs97@_!8mgj}{V zC4coBw_T*WK8gh#d?j?KE142SeK4ve!irHVi|M=O@x!{>Ti8cqkdw4BaTC+VGj$u% z**15^tt2p4j;w^&M8drmUVo{+c#%ywR9ChJ^-py~o0l>JX>T%$Yh1sO8O~dtn3#%U zF5ZdvJry;N)3cr&J>2Hg2rH%vJ61W!Z?x{I+1;Z~wbOBS2hXeW#Sx!89_|@p-|UmV zl^kU5#p2g7ED{|I0nM;E(2(F)vwTl7iVT^_;3?o{D}7mt-G>F*@gcLL;~PYA^CcAHWiFC&!s* zd!FY3djcH$k@X%i@mhi;*fNY^+Vhazrg9HWdDCt+^s1rvU1TS%AC6(PLhWN^H~KdZ z!{+cwB&S04xB`bU7Jt{h56>x^?xIq2Oi8gra<)fnSSvTNSB2v78}9T1wT|JvnGv(_ z%lwDVXtovUd(ImEX4(z9h$5uZmTRv(7v0!+jD>Ynn~!dYDk=LHWkMm3q*v9m8AGGi zL_K2dU&KeMN6fj(P8WGZx=eTWD!b4>gE$H7|C;3(U#xpsrD^c)y}SI+iuH98|_nvc8?!UK?Wy->D^94;4sp1f8L z+`hp@&m4PQ?FW+VO`M5f+u-kv@bHR)P4?*a zPmk_W5103ZKY#wcG-@DleY95eppnXr)OfWfs_Svt?X51}VPNwr}t`kf1WQem8}s<1Al*%v;N#pZu#$d%?;XRNkp=| z6BXkE|C+c`kK4lr9HOVuI0Hs#@iQ0c%`3;f2F}Ze_DKpxR!L->Mg?BKD9*YOsvt;V z4fT`Nm|(Y=h+D%~#)X|?$>kyBQux-&(B?ZV?vLcQR)_E^gf|tG4QY_n-4vFgT~WPfm2EIp=y5} zw(X1`g0Iaa-GiR0*nVe?)Y@&Cxvf=MkdWOK$IXm@u-+ZZIo@c+Ffw{dR zZM7Dmtf3%2!fHFzq0*!QPdO);Bv|++9t$8JgObypihVJ@g|+wav5FN#E)(|dvI~)g%bA_g!oe`pf;T+E47IhphuF_3kTsbfw_)25Fx%0dl zas7Ms&{{U96jr?U^aTA}49^z3Tod5o{=9z?)+0yx0=ps6t=xE8%FImIpUG}hUVn$O z(kr7Fl@b;_YNO@IoRraE(NxaE)pql$KC>3Li#N_{Do*LFxcSn+yuf+~IdXb$oX`A% zqyP<_NjhVwCVG^A0jABj=fCLyhgdY7@9A>cR_LZ6slbx%biCnWN>6qiFyQDUJ&XWE z#muSCcg*nel+{?h#9O)1eHnALM}M8h_m`(jL7d8%TeY@FLB$&D_Gh4c`1ZjycSt7; zI@)AnpPk;A9=RUo5}2KWhmtVv^h2T4;+3Q9RmmkZO#EZYf1G8>5EJ)HFFoLsFcR*y zYWPODQ6fHGMd})PGS|rcvULg?n#OtVXIW|nwoyc}4=wG_N1Mnr``3RdB!B*4r01JL zSA9Y6%f^Kkd3|A|RipDm`u_6an9yoAgpQMWrI{ioy~meC$C|y;^4H`O1t|o~cv0R| zq4v10nrqrhy0hXSSD6hr;u_YNIdlX;)EU1622GV5yK~Z^&2GBn9v}*ST}*1#BogP& z=%_K};Hgrb*x7B0w^J<&jDJD(fYK?$C2HFloe_|I;rU_P|8JuTSH&^s@JhQTnyf5M z?Y9@Rx>~dym2myiGX0oD%eix7L$Il46GgoQ%$JE^ME_Y*eoPOz;EFZJDgtd(tdS9E z^JEUhPhoX7r%S~iZC?5@C>rYsZrFH$83wOoOf8r`D@-gca+jnBiht6-7-SYM#m*$5 z9gcrm0W|Q5J&?~cm}HbC^T^zKjLX;F9bI|evlqh( zx*c$Uzg=xV@y=Rtlz);3@5fA`YzGmSw)>E732vW7I%XOTCV@$1iJ<$7`C>fdjS`ha zTAb&zecr2XX1RkL58VAlP^k)`NM{gGV-mZL#X#CNmnIFz_ZPbeJe{9LGfsO?eSK5) z8H;lS!L~G?xZS4!FY1vFser#vxv_5*fK27|Gi1CZLuE;{j(>r(B}-*Q_o`VxI#Y8K zzI0&yM>q}6$~a<34MMpGbvbZnZqsX~8q3%3oE>5tLOJPFqK35{CqLpW=nz=af9x$# z$#7FA2L+M@t0$6@_4o1kmZk+amSP*up(6aThVdC{qf3-I?^6R_QM6(yB2dZudzFSQ zxbne4FZaAS_HwKwSPCClCO8(jWbaWJrmp|&Jj-jW)pu$kx$J}f!oXQ=%$>F&)n}4lNk&KWXuM=aGPeam23FRfhLAh^ zHiFO4KV=$cJp`BP!Goj-bU;~UmQdyxsKTlC`iYe41nqoJJ>D!Y&e3+##uxAZ_5pY% zulLMK)ipE&yUu94aw8Y^%RaBZGxPC{S${vb9#*If=00Q5sQ>mI!~l(*&QN&u6@B<* zpQIC(?!Dk6sUV1bnmP$D191hiV9;F8iM0}^am1#F<g`@<-bGh5_PBQ`_?x>u%{_f&GOGS82Y_3g_z~a znK(~d6AVHn=kZK{Ks&Wa3Aq#0p4@VwUcIzxR;Z6cJRhfI&dpI0rkO-Fmq=Gh_st(} zEZ5_nE13GuqyG$k2daQ<(;RE?y?>eI0=8L^`xS+j1K8f6f|mkq6K}_@J}iS|)*&I^ zI!4dt7Z?VCPkNLMedgvg>T)nH=K}RAvAkBD#2E##pDxuGpR0jO&4TI`wrHJ;e>S1y zm=p+@L`PzEJKd3?xILwM!A z#wc5HNn8{4KyLyIz@7oS<|tj|jS?ozr`t@aSDxDYuIdV^Nm9;D2qc%%ci1<7h53&{ z$t3@I-f~Va-@jhd(=$yZZ|q~(tiU(>UVNuft@tOM$&E@SS{gr^xpA)=YBX-DmEyoP zAT=VApj|La?I8i`Ue)f6?&rK%~> zE`%EFR)v%&(JH1Ge4|HA_UhhtSCxP3XqSagYIogyE0Ae=x^t87lYa_y%|1Aw)dFeR zULi0XPE%F5nnARlefX5(5=X$F%t(Bl5MJCDWUiCV4#1xKNj@wBLgJ9ZF%)YaX+t+j zIoN-mC^Fh-@OCU+%HvZ9`@V{-?Qr$$`IvMD8mQMOQv@|pE3;)aF)aeA#7VMqem}GD zgq7GUw!$r-k}v2qIe$vkC&mERHat$W`gYd-y`?t%7lIh=wSLKG~YO32aFrN+#E5P!t}bxwXOR@;0P|Mocs z!=dxxt1R&0Rv*-QRlwF9UcUUF+2BV!Y8&POIr&Bqsmi>@2Ch~r(oJ$3CJ*}LF?FVT zKi7ZEkoCdZ?6sAm-8wJYkUz{`@2EwPJ7S^9FJ)m4&q_c@xkjc(vK0~=TrKsvc<3z3 zH%U)&S<5SQgnvm{1x|L_c@s#Z3Qx&jBq+u%5KR~Bp9$*}_C$_Sn16g_D@6Z4eL?mR`PDc0r$&8N zasQ**D6Cdl_onjFT(2bdL}y5L1?jAo&j=cncX|Do^*!yms_G}|D~XYPdpeAeW>UBI z**~jnLcVQL8BVod!r@O!5}_{0rmU;nb08O2`VU54WXW)IO@Z#jjPWyJqBqLQJ8)rT zXZ>y-pMT8h=NOgMrJDOQG}fJhr*?*mnaa6ju7VtQxiS3nO{;tyYpKLFVlV!-KtY6% ztqAauUAuFXvj6A?i-tYYY}mYvv%ps)(;O(maJvLZWM(G&wtnYk06b}M$4omZgQc0) z3btsFOZGg*M0Zjj&#m^a`++*sho)na|iTFQ=`9?o{Y( zpp3txN*mhSqwS}Yc{J*mu*{=5Db9Un7OL8ovJsvxswG9O0$wB~O7fi@(a4dZ`w^ve za)0%O2=z>&;$h61l{{Y$R!%RxWekvq|Mv@{0n=JJJKJA-H-N}~4XO+?-`GBD00JNN z7tyc4rD>%w6+4i5VUzHmRDdB|#ArbR`)ntIE*Ajy{bo>YDhB6P_}Pw*c1wm@Zd9BA z$tNH2n|OZkfiTKYUYqGfZxSyD0jmu$I~!L>?&c(KqwQ>tqCH0Vb*AMkn(Bd9p4&f1^v zi+@T_N<&D2B3jM^FDE`1YLow#EPqa~X7ab4plrne5DgSchSmo4Ufhh0o}YKX=8p%2 z0a?3#u&p&D`I+z4XR}l`K?Hc~i|(EdqkFr;zMb2fT`9zmSNP8(7=}f$2=>p5tRfr& z5{6{~1Q`)Xx$o8jd-#QgR<3x1v8qIvp+`AX=c3H^?0CPT(C);DUaBkDuYdCEWg3KQ zJZ6(Qw_@6JD2=&LwMR@Ov#l%t<0$o=mr(9IDr*Y_*}{t*)Zr>6XDbQGT+Bf^l>ds& z>MD(V>O_wBx3A%swOn!2v)X(hwGDn1aL-$8us>t?`I$+~w0W$I{Q0^AXvYn6=c797 zYh`2Rl3CsjKgK_`>@9Bux_^}a%F`xX9BX1cn>D`<+1lD$&{3Sn@x?kJq^^?i9JZh2 zx|SK|>^l*CfBVwXy-9@vq(Q;+N_^c@ysstzH{*pX5?lLL?&f-zlk+vreXu-dB#0lg zvrj)qeNyLp_@xDXiFABwp}^?Tf|9mZhsI6h(VE@rgdd^W*>2C9(tj0aT@EG8bwI|8 zqa@8vi7~4S_nZXgSLU!A)oIbdm7_=x5riC3BvVaA7vIG`znK@*6%c0-w z|Mt{8F6$#dn2`M;gi{aJ`S$B{eCIlwQ+95z?ysctc7E@L%tYK#u&hL*x?gUp?$5@2 zj5P#-sC}cFu5g>dZhyY=qVF^oY;~54{xpObMA(4A^|Pe4VyokwQ*w2#*+~r83_LSMKEC*ova!SR)mdU4y4DG*9+42makF#&b;+u(`I73k!WpwxVj|o zT<~Yl=f?6x=v*3x7g(f)f(l8Hp%9VHoQv75-2gC#pkTYQn<HDs6f~!ib#iSBc>Ph2+`rbo z5+{)r?hN79)t7J^&*uBi3iaQn%ruyOY5e4|+u@db?Z2^kgYW;33}cO?sX$8fm{B>@ zHtldS<2T-@(&a4`pQl7Tk3=;5Tw$k?ey_u8J;qBN4}Zt;C<2uzAap6=@_Q&|Rw!p= znA^o8%TYfsqozBCvP<)}cy=2w)kIGss!VQ!Xv5+*E7P(J#hM}LRoBKxErhJwj!Dy` z9fD9|NXCWp3cTT^XlCM|?TYDSvtaYkj6_Fw{l{YPaYRbHH$B18O;MU;tc7E@I+|i_ z>le_C_J0$997U4^DY|g;^Zlt-CXgd76e$vtk67pxP#N?^zZxFmw{02X6zW|1|#DfAemraJ-Ze^)BA4_lA-v5|6R#vhlU(M%+p^~k5; zqgBc1F1X~Xl`QZ1_Jbz|7fwHvWh+6h|Ni;KJ%9Axw>R5T*RT^VHKrY%^HbMkh|I7? z)HY0kaYki|`ze_#Yg;v!(F}8tZ4T2<&Ot7k-lP1Ya+*M>l6~yTU+0Y4uxvC7r}syl z7h#OpeWR&vVsIkHAf@PFx)yTBfg*d;%Zx56&XEx-LXimibxYBXVQ5(LzCh*%o+V)_-336lst61V1;*a6--;GT5L%e8OY;BT~SV z=1ww+8T*LUT>v`laqYcT&hLZv9S_G5f%&GmQn`@DqyF+#d|*a6vM!V0X?QfS8Zv=f zf-j8RutbN7I`L&3Nuj&%#Zhl^4JChMb5VM)FzkD*6ze0;wLfOW04+e$zp%l>uMekS zgB^eHcIoh&_$TUd<^%ZXFI6pcm+|MalQLYZmO>`iB)>yH=P2_`GK zx(pI8d-jYtG}+Ku2ctE+CglKngm}O-?61cQaQ}$mky)=m(5cyKw9muE1Ts3^H=ww` zR{%;TM_ga%}iCX>q*G7HRZj>Ugk zjq6vouBLv=L(E={eZ=FjQdW%OQ;iZd6J-i+FkQ;F?^!Y8$N?JbHa*nXtLZOl$^BWd z%N4R7C9k_%U;@_QWU6-`=bBM+{j}6fFnj0Xn8nSs>NVZ?ft#b3obT;^?Kx@+pWj#S zpKC0^3*ShW$r)hBD?*C_ZXa<=zj z1j16tVx4WOL5R(7b{uu}U>A*Zj@bWyy#S{4$bB`!6=aZj2OrXX1Hk=<)D5>KQX%W( z9_e1y6e#-F8<;>kBFraK5OfxaDcE(gOvzSnE$0>?>4cVkOu@dl@%6`864igWRN%J< z3jD7a=7rC>ZZc?n%`-#iEdB4 zoVi3`17;Zfg7&=&dPD@rg`$72-;>SAVY)Ph9>peFe^AB&j%B$F+lPLz7kIx>md-2; zim(WwF*pH7R%|3EIT8Wn(lVFUOp7-wpMP9!6@7iso(vN-H?NxGD{R%_o#q$TKc?L^ z*-uKT!5$wI`9nHyB^-g9mvW=f&)1%3BsK2e{Aj{t@e8eB?MT#Mng)MQf~|8M-)pM0op1rU= zGn7$+u%g$eRR_D5KtCpk%WY>Tv2fTmB7&ewqeoY*+AO<4upOm3S&<^y?^?av-CB`{ z64G~vdxl);zH&uL)P8?TOk{_@BJfXFU8KaLXjVFJjY+mxpxvtB{nF|@u7;f9Gc(0q zzl^HhqUCu-JKO9)#j{=U;#CitFhO?HQ!x8mbg={()jbY7CH%n%C#-?j-@kt~%2rP> zJSNPBZtV+U^nILat1qIlOQ6cfZ=uDrVd&$a9#jEYCyhNGPSXovanT>GIeT>&MsDa#Va*J?~@5Wd1NS3r-QTPH1DNV+SZC zpL7-sF?K{nNoIc{gun~OjU+QPnE;NjNDdb?IESRKA4HyDzjK{`YAh8>URuYMPXx>Gn4wDk{R$( zp=8zA%JK=smG<8D*E>oerjs#w-V0GKke38{3^MLe*1h(aqdFFK~Z>|L!+LjFqJy zd@Bqf(w%QNcxN$wFDii@E4xO@)*~8*#cCqMrmET~AMAq3&&B^Pt47jD7-GOa=@`VN zcU&L5EWUpds{~tea&guD`1D}V7BsfEoMW0@=cQKqA}z0hx3+9UH+vjWuHsZ$;nRV~ z*zsc+JK39(O9+k%S1Y{Z1^Cu&8-~m7pp3tTyjJ=NW0$$<2$Xrt@&3MG)= z#WU5nk~ohwD9Y98jPcYBESwN2R`ihw{D}QRW~+bhuwOssIF>p+zg&DLcNeTF%lp;N zJaH`M3vT>SQ%8EnFo-sbd9Cunn95xE2V~USiY>n@$x0SKFUal_=K4t$oKEAzr6~3| ze~pNSa4;DSwfZnxF}mz|d!?l#l{Fh7a6uhgu*W_EFV>!Dyrvaj6XV`6vL)u`=k>0P z*wcS;dB*S1u#bjOWZt(9v9tRfOg?i@Y@-r0tW%Csf!zs&k?AVqKwg{AXO_Pq<(J4r z@mzh!8+F}HYb3}HJWXOV7SMA-1e8+i%a`V~0}gn^Un?B|Kf43J{+@2?;l&pMI#&u@kWB*Dniyr}#k) z?9a|cQOdFyyAo@zA7^;{4j!bgG(Mx|AcyQT6Rj$AzTqQGwXEMsn^b{$n>G>sFpLmT8~hOlvga^ zHpugqAsTU@CNG{B`Eo=7R79Naq+eLI0LpE=}slNrrj- z-ERA@_9G4^93uLgbWLjOn#lz%MhjZbIj<-uxgCy)9s)6RNq@;^T+~o><)wcu=wp=g zxYE1ssJP}Jwq{#=m|yG6v#CDiuE&DoxaD16c_Nz`+ZWmh`*H)<89cnX-Z2!ukv{vN zqz$b(X0rDT{qI3wiXiC^88**9?!(n~NGq|_A0WNSq6WaU_jSgkGSRhyhNU+N2lYs& zA4H(F#c3ztK3*{+^bm~g7l40I@$W%!zV<=2CrQgrtw+Ix16o)%n(f^axFfCSNyq4g zhLH;rr1}lRaET(UTx?_~SwzmJc?3FJ7n6i1Uk1mCb?28fYxA6Sq>Bh5#UCMe@HN0`T$RVkSD0zJb!3}vIxkG+e6T0nzB47m8nfChu>jX+p6Hfeps}{&EBv+{~>9{ zejPb7&f-kr!lsD%n$t(;nB{t-?94uDpqM)plCpZ-qlsk3!wu{ydOs!fUkFL2iV(dW z;Aag>s`*iof0?_BY@L5e78tU(gmZ-%#OrdEx^doh&$d+*r0f57l=RPf+0tsIS?_z| z%(Q21rw`SeX}T*Jif;U1u#{*%;MFdtn_1?y5zH-C<(7dLEhVC_xVLy|yU8EmauQ?2 z5|Coym*0X#AiDi@`hA8E?eDiSZnQtceUX+UIZ%h0h=PFqI7NR|cV;_mAB#bOro$ZE zo!cUO$#_ecgzO)kOn~9FQIRh4%u{~|cI1cBs;Q#W_c?YU8Wmj%mYg6AtxKZB>7! zFHj)vpR7TyQNOzkiLLV^rk6dhm4chysNPnJlr^-D=?ywJyJDlgr~j*ou$sJu<$VnK zx#{MP?|3sSk33>c#Qi-3qufYTuQ9e+L)M>>FsWy|LcB^;-T7-25xE!X|(4G?IdhU*r8@73GCk7IJLK;M(8 zpE|8UXuT(Hi3IM0J^U`@OaHyP{aPmE$E0R9IL)ELRfqV_j3>ipN%MWiSAUv3S0++E zEV#O0fu?k6@?k)6SbkroYThuK0j1agxCOo|g62IiE<-D3k5j_YNS z&3t{!bqIphZVJ)3$P{`7-tq?O_|{Mopys*4p7$~VyBD%FJv=|iJ|Rt9WKY&9(q=Nk zbauV$>xP>;JT#agi!NMnly!F`M1szj{oa2_n>>EEfQ)J2m_wv24bw6(XYwsNG}Ou~dVFGS&N+A~~W0$!_t(|96F5Nt3pRk2WAO;iO!tKf=Yj1TfBoW}6aGX*<~ zvn7Q>e^8HnX?kAVs3jG_o=I7pBaOrRE!6@mi1NahP1{uyPBkH>DE-?n5!kqcT&jPA z5gGvBNS*tBwV(L=wyHZy0Gq1xG+h99u9?G`=$D@P!bEMWk8dVP?4kGtpMFP~w{Bp` zh3dM^A}|b2?7AO1r_ig!ida2V7Dd3*Zid&%?8Ih%*{NY?9 zL_qO*uHvZArgutleAEdrfjIY*y$;?Iwq38yh7B(A8-Yr4FqSd%WE!hjZs zSZG)zAHfYUB!~X=Rrqh~Z>#l2KO|dz=M?@Vmci$s#hW$vs@tFDZ;WG{?yw8^xD5j` zdUX2YVAD-G6aKX(7VcxxN*jMyh^CbT4yO3CT&<#CL$2Ye-2Z5?XVp=qnT|SxV$zo8 zt}>3Jq%G7DbCri)CMRAbU8$i@Bi3Ng3}{3i)E#8>Xs=_w{VbcH*)v2rcW_|%7`nw=(rWY(MWyi{7@815 z*jNC3=$HP?=-euW{EV`LRoiUoP)90u_4JC-*P@$A=y%1*f8Z6bP2%C!fGlC0>S%gR zI8pO!(G@0|U~}WLWe$G<Of(^- z&^fX}3J)I;#>0PBnV;kam+vQ+j>cU&e#x{je3ij;YEsvzY!8 z#W-ZP)@Qy9qIU+ut4bliv!amj#2MyQ_NQcnqN96aQ~xS%BV29=II>#4R!Y-dN6k;w zEw{z9OqH-kml$bD!}AJ~`cgR~h%bWT$wQ9Mz%tC)&?2$Ww5JK`p7m3Xn+`zC9_!>8!J5v{K) z_OrE|udZt@9$&&sQyz>VCs^+nzw-X8*cKZCM3VJEb zR1YoU%Lk0PlNKlJdp1RMH1Q4{r1Rp+f+B_EHc0G!TC;y`Z}_N{83N-q;>%L`HT9Xf zqTZ-SHRecu$6=%!)R5zV%A+%LsM!p2xFm0yUCl@7EKjXe%Qnguei=cEZv)kV)Rqkq zXwmqq51)jE9i2*oBdHvC;dHOWNtD0cW7!4GndmUF@*GiMZy#8h1A#TPLlp`X45wCB zPYajgw+VkZ_e3sOXD=${Gx`NA#kg?*XJv)h54OaNr3m?a2|btlDmUEKWT_GHGo0uSsf?=?-)L118Aa`Z0`~DA1-mJ%@WzY|xX8lgIcc18Ot<3@peio( zSV8y+Xs`g(HpAzU_Tp84(0$c_o)$Lq-%`l|7x{nWKrdD3>?DiCdpz^m9-!PX{ZAdf zr&3#5x;B69ruJ=92PoMh)?~9bt0vnHEw#H81uV(3x>9zt&>@jLR-YJX*+8^QTE#unW%wtFL|4EgG#1Ong z62AMfG;a0IuAj-g)57v*EYfCNm?tgWF8Rgflr9EohIHSLV-0!bBDB0wVf4|&sNbZ) z4+n%6)Po7ls!$P76aDP6z;l0Fhmn6nkc;DFkQM>s`Tkvw`)dhSN@zNTAQM}f$G$L$ z=v`TPLt$25=J@bj8GB~y49a2(t;gN_Ofu7%MEo2Fr3Ic8tjmwz;HF<>*|FIDi7HI_(f?PL-uj~ zvr=EkIyAxpS71RJVz}Z1yV8rX@9*YRNTPXnFKU4u`^^@jbfKbW!YQy?m!<2jt4jH~ zZ3S+jBxBZi7 zL^@PnbJPgNzN`4A)F_0_Bs3zL%hygCFdLslodDEtXU>%1UmkHA&Jy3TZewtS3{tBV zBtHWpp#ABQs-0eu7W;oWbj_tv&`eeV$Gs;kj~zHR^I$UCExD2T2%XdYnsAx%O$I8I zX+sFSFsaXFp2LVF5q?x)s52Sr5k~fLKub$0uYMdTgIL7INmPunO&!+O3CbC-lWhjM zZ44)2Zpd>y?JAlA1cEs(uSI(k%FL5Yi^k+-&Qz{+>HqNTXC8kflJTi8pl2*XzdeR8 z|0#+6-aL9PGX-8hi>@?aZa|f&c)+D3fnoWSmLA`_I3_h+oBi9`*}OHCz|no5$tFEL z+Nn!ja1O775sUp+763 z!O{BE4n4dgIiW~nN>$lB4${hoS#X+3LP3O9$BMUYE3`6_J9{=!OO@>xb%-2J`y=Y88QPa#wM zdCCp*J5hgcrOEA9Jmn+0TnRjsb_-Zx#&+f{vQ@w3D)|gV7n~KuslZl7nx^`yKE~(0 z^t2Q=7CL{2c&UlciKJI2YTDgh+NM!U)BBMQ7MN{q#N;^w=FA`^+CX~uA4qa%KP>Q{ zW8_t6f-#c+uWmdnc;{n?Q|@l&9j4sAvp}=WJ>)9nja`}{O1{W0BG7!0Bm4-Y+A|(_ zB<`ZX4JS8&M057qM_mPw!o+uu=%7bEA6eKf_%?s|B~QYT-r73fkj#dwsZ7X;YMNeS z<`EWs!!OhI#Vwf7i~Q=jzAY$mG`eq@5-!@&)F4Ll@)x#cM__liK)z*GOvCW40?U2K zb~_gC(Vv>A&3Wt9QkIo0fh`NRKWS*i3?K8O6_N!W=uq|y?+C`|aBQk5)##6UX_#Wl zF=Kz_Me|O(;TZ2a=_(?t-MXpXZ~n)N6FDh5t`Q?Ss1izd^x+;<>zD(eebN1W|Iuge z{mD<5=qh{UR@rJWEzpe{X(djtZKB+(mr@v@4(-hlU zh~Uc{nI$7373aLhK8og}Of!gX)U>I`q=SFK^o6qHtW=qO-Q9w?imFMB$KGPMYsPV2 z=D}StvkbI{R?SZ>m1eF8o5B{~W0h_B$8<=33c8-%=I9cOa^ZvLN8^yj(z!AG*WA)k z8h_|&$XrV+CDQf+)k?XKxzOo0mgWol1B6^<+0A3ql}jYM9%%0*b3M-zhR&N_*uZ~s zf3DUf6+ASbWdMv2wYKvS7KrFM2I+L~yf{pEJFN$m|NIL0Dhd&ekWr5)RZhn#z(z`T z2cSvU1hWVUuh$o#8p6Eh_#a7Cs8>Z$rRa=ZkRiT5o`eXchdeJeI_Tw{oZ}v}yxy*W z`naZ~kkK2FS0Fed2e#S5`qG6@0uq0mq7($DWH`=-(E_za@6<5Se{d<)kU3+RN6s;{ z{~`wpBef@I=~OKC<*0}x)RNJ1X36-;vWSOo&&mF&CUCc-a_!D29PBqKBF_NPP_T8n z%fn113+JB|qF|56Ox$K3blklJz5b_p6O^PjbH;1TBebBr7h;=*+mJ%$;T3SlT>Q{<}hO6sOiHducZwjK#$H{v|}wyy7OnO%~!0Q?wc;#*h0B^3WxB6m<1 z;ZihV|HRe~ujR@%C=X&U1ytrMod-1UhPy2w{c%vTr3z5JyvX2 zhqLuqc)GB{EZ=iwOTE%(n&bYDqkgg_48dM4)26c@A92Pk>|6#%HYb1aQF-{&OkT00 zmA<$yL|CiW#qfY z1BKGNHGyp!GuttxZ-FZH6u z&XO*2r0!V3vrX@wGe^^2Ux(?PH5Q2(U}Ff*V0x)> ze3h7&Od8*lkMV!1TFw8P9zoFcg}WLkcogT|ZJWzlDRhh~U3N$)$cey-kcNAc%Epod z;TQouOzIDr*AlUP3(*sWgZo2#@Z5`>rw3Gfj8EM<2y06RM?#Rg*$9xH^>l+a$U-yC zr{j#)d>g8f^}njYIZLTSDMD`$WTcm4wwb8O{L!8QUAceC4sK8{6qm!B+nN|xu_7X% zVWImunXlD~U-#g>75yNj+n(Ls0BciCY5b>Ty`a9eqHO}B8lrS5&6WM3-txG@8ps0z z&T&#VkD1-BA5h2#ov98M*eJ$S?1mDrF#_8K`4Nd0C!G6SZwP1>UaPmhB^#+&BdYwG zvMmrQf9!t-Lwo$%5Q8He&@xkl?UbNHB{YzJiSzGo{}_jrAC1*3+nwuP-5F&%e>qDS zR)VaFSG*+h>5nJA6!95)b?JRVA!prPQyaIZXQkn&}N8rem=NRVG6P zk<@t{>KJ0y)-!yvCRqf`rI^&3Ej*!^DwGOSFkFA3%o0Gfi2IF7v3Mehn}C_0?l2TwET4E(txq~|LR&_Eh+lxXa3^nlBJ*Otw>1qMGObR3*JGGVIn=-uB z{_}qXU!h7vL%MYp;Xk~NF$L+5fCPyNMqjq&ajQJ|&JeFhvdzLv+0e%luh9BS(JwF1 zRWUd|&N|UjEBBV&%n7?wr>oW2&2x}}Z_yHHBR@+J#?sr7DmKip-xoK#=*42{qpRG# z)8n@luimI&(_aDipizHyjf1Z0NN6j9m>++8)h2wOsz0`=qdB0aO*?##@@_kQH zqDGV?bn_S@hjl#Kt%StwQs4Rp!AQ{B&E@1LZ*is?WPfEN+?264Oz>I;TWs(2tIt|) z+21RNn7W&zN*e!Tg7l#AR@FZ>^j!R>q0@?7P4X&wc4{D_rY`Pm|I;7bf@(`2|3ZHY zy!nW+^d&H)g*Yud;+qe=ofjLJDm&s#RO$#5ngn^z6C|+;^||zISC*=(S46(EBK0%$ zp?I-Abq{)Rad&82pmNt8Md2ea+Gc!gp*lbM_q2Z%=9Z)RCU4#RQtgQ;trxTiq$@RX zRnTJSgq#0gFF^O64N$QDvTSiHf#!dNys@deT25t9i8At~W04@t5y-0dQ$eczyZA8X zC}$m3%#0z{a71592SI?Sq4yA-w0ZeEy~{*=niX_nV(Qz=OjMN;GyL8VcWa(LC=;-0 z*-6lDR18VveBOv!Fjh|y)ktk~X06F`?mnnI)|say^khzhSvpsJ7pL18lm37I5cL;q zZFbStHk=^AX$Y<*kl+%ucyS2sF2S7w#i;~$2*ITkcXw+E?i9CDiWg{+B6ZsL-urv@ z@%@GCnAce6m~*VT9A17nbV=KA7f$Il!Pu+Df4oV`QXv*DG9u29#@ZinjcdgCv8=}K z^ep3XyPoY%=F+x}<>)zT!7P8EU;%4Qt!u4BTP39cXgmEB*Qql-Lpqx4NN|qpypykC zX~T_?ux^Rk_$^{@FS{jEy{-ptY^tUFozUxNzzpULz z<+0Dp6!=*VcsQKY?lTZ;+gPfO z-x93I;2IohVw=@NQ|GV$+4)x0TAZF@sZ z1S*!c+Oq6LS&M&~Bys{_24h8_q^B1>21<}UJ%zRB5m2HM4om6^-Q5^Fv#a&jzYD)& z!Ir1BK|qpZ>s2B)36 zu=kd^HGd$&ExJoi{XJRc0(jnW6{`CJdz2=>GOoTJX#BftPwfx6RPf)Ad2O+%7&owN zQp{r=HvD{oJB;Al)n2uxGk7@Wyu|^Bz7&a`9cY0)*3H?w<%~}p`}y`;Nc#p3;wJwp zkK3D!UP^zhbas>+*dL?wQ$@&QYz%t|z|3|K_rcfH6+{W}krRkNORE_=)guh%fdxv$ z!Zf^aiva$%Z$`ds5HYl2G6g_0AV#vFc2#HAi(bc?ko?7Kij+@YR{t}!*^&1DeqmeN z6?WtLQ!w8or>^ zChA)$imYvzBt)8*S<+e>N!M8oEm!@W>&ad|vw!u2?HvR*DkFE|uoXNlJ8asiRh~-Q zS%J@I65jFHrTl7TAZ#*7JRG-Mg1sp?X?`Lht34fbx$`Dh*#29W(gO_3S7fm=An+j_ z>!*LTmk)q1UYha_C$hw|)D)Ckqrk&dfnmRI$1f{KwFlIX17H6A)BA||S0kRvj(Kjw zcO7HdXqFKkyu{yJ4hs&Ei9l8s$xv}B;a|swF<^uaXd}h0p}bWYpgH`D_e#0^wM@RI zjK&e*Y*ejcBf!vw3_EwlYJ%;$(M~zjAeetWu`HWSiWhvW4^Jlwrm%o2GI+ENb8p0i zxd~Xejmen0`%C?7t>+v%&l7I(zo5yDcRwsin1R2ZG{-ZF1%RAiEpXc8)X6TUAej&z zI{0;l4*g`d-yp$!2@1ZtLhrm8IjmK|@t$;VbW8}Z<10)zg*?A{vy*5;ra1k+6*zzB zY2g42vpK3C1~8D*c&R_hyn3-&(${Vmd`KdS~~ z`r1tc<=jwIF=`?6=EZ%1*WY~UU|thy!Axb3;|Dq+#Ti050tOf(VQ<() z3uQE8dZ~_aQ|aF5AoUol_N!M6(FT7X(HL?h{(Im8zxy~J11f@nFk0?xcLJtjMiNay z(urWUhI+@pL-L(5}D#+2K^??fSOE6=H7_PqN7{ z&EW!-w8d1sJSe6pA7j?Y;xrSSWu(NrgMWT_Phc62ZG|Gbi{s|jY z=lj*Q%;j^En{zgdruEmL@rk0W3&?z2T*rHukO~VM(hUrAJZ@`KqfwcuCZL^@@&4f! z)nY58B$6{FWQuHmv(Q%P@t0#ln9c%1NScut{6Iu8{HK{a*H?diANd7E2R^XUZ5mLr zhzU zE*>tN2AQOv$LfEZHwPN`vCs@as5V8GKF_9-5*sSg!+RT}#KGX|T@ z^SWnLM)s+ejgWr^KE9xu#S^A)S|NC}Ae66{zSfLjSa9T*U7${-2laO8kovF0$hz6Q zn>NbEw~Vf1wc&5*uRl=J6}_#c3gs~cbbSiO1*rf!CkLJ+ zZ65rhJcg;b<2l~5SYZA1cP>se(lBhs366{ zXM}%mG1a{#I0138U!T$wMOuJ^4}?7qi#l?iwONLpth*b(_jM`W#+J~oiaxI_wW zGFEFdtAecECNfSMB5nGs?f2I{(h5e}@%!XXT$`@Re0Wve$ID$8jc$7el|Onn2wgFW=#i_!oRTl$M=^hUxh zM~z=YJG`Kx-yYcEr|VOFssi{+>t~=)J2;5z4=>Xa!x#cFwe7}k{d8h3LMwwW5O(jY zhft1vph>Z&xsrnkd(pN<&=gNNj|hJ!KBtZ1{r1GyFCtN(deJ0Fyfl&PwwZbac^&?I zu%TW9vVVK&fx15daxPqz698*|KE`2w#C)ic&URPBN79RAR`~`w5Wa64%j9R621?Sy zkHbbS-`}efhGn)Hj%&%)zIB?Q>@`nYL|XUrd}=uF0+*y>A*K_EL=K60}3> zl+)gQ!Ea0+bc!^D=a6dtTv;J@JZpA6kddJ;d5WQyvmKtfWJInI;hViI)4*i#&a5)1 zldsgrP)*^e%u%d)va$+!uNi+vjD|B=Nz~SOcQ`j>Yr2@0W={sK`E;A#^E`MrT<~_k zLv>b>tRzW}VH%)J??CtAmkFRw4G1;}8gkmIRNXY?KBJ3UT{V5_bz!X(I}y@sCPX+c zdwJ3UbV@ETxoJ2l&Dx-pl-~eE3vMK|k`>!Z*PET1KV4XdKZIb=d1P$0$zk+$J~94FXZs zLen)%k$L}TNeT|9R4IShOkAF@NdniSpYytTteU>r5C}&2p+O9(&=Z5WLNY!be9Zj@sgHtfX~JJuMYgDNyesnCWr1zk z7d5H$nqy3{gSHmu4P8ad__qU%Ks~SpAbt9|8u12Cfy{* zCt^t1o`x(|&&4eMX9lC^x1@Mk{=mQVhgUTYj|*!l;^7B@W}!(lzNR833VZR9_N!DV zuE?+Lkbw;I#bJL3@cVB@n!QVO{>&LR9vTJjKn?HK4;dJK*`%}Q3%>uQpc}VZT#-A^ z-&ol|la=e7;!?~JSg+tx{HL8S@xvLD^GQPotgOwP`P%eXU(gk1oiZz5(9YSVE6O3( z@JI_PKaH#8oD7=waW-kDqUp`n!C%~8fLodC`4tKlp(Mwm@yo;0SCc|Bc=hXWnE$L25t13}h{JdA@3H^h1-sd|-bE`0}@c3331mF~Pc+$g-7(W7`qf{G5r9m#WBQsCNEsMgI3! zvWFPREKI{3@F=lc?1gCxaM;3oH9MYI{#ar|p9IbqP)JZc0W%4+X82aPcX!>7 z%{FsBZTI1Vo^!}6wk;a`{{L7=gm*rPaagP4+u(~DM<{}qCb9ZCF{n} z)3Edf`|~@fT-WoI!&7VW%vG6sBK>r(#k^E&P9}oU~QFm4rnA35HR@!^ODC-_&-44!%Jh^c#6u zfVY;wrDhkDdUzgP7sfqM=uvCwB+cc_? z0Wc?ZcbSeDvYxA6_*!UfDuL+;VR7c3q4}l2g!tHn#-XJ#U}B8!)jnP+d@+A(15+;m zJ>bIZe@@?wNtAr4()#k>i$qfNo3_}2hIZA*oiVFfsfyuwk}B=Vh(EX59$4p+{bV2m z05y(%*)wi_-%ygF!NR+#81Ss%)+a`!JchTM?4OVm-B48yl(}^xq>Grjd|mxmvyB*f z|BN0_pByBpq#Rw*NiUasZWe#UEOwR5d$e7>*?3+H_Za6!m4UEsW?kOSA82m?Gt}Aj z;(;KSi?4doj=5|#U}6iW?i&d~kmRvVu5)pM#B)oy?rNg&=Zf;_jzga8;Iqx@QEWL@ zXN->lY3XJtU1zeU<$K4;+W7bH{d>iu3azF8c`gniLa0(KDVoE;QDuK+LT^o;K_!Rp zNdB`U7qRSX${Lnk;=}s@*<7>{H3$35;$QZ=_4Plc7*0w}d&l4LF3+q>_5mNG(FujmhU($bLT~Ypr@=>) zLtTQ1_e~lWj+(y_NN#@=xWIWbR_1xCq@D-3i|2(2z@s_rKB}elQADQ65V9~X%5ST~ z7FWb_yy#La%*21>&aI!A$&g>;=N~C4e$5e12PIvj4(c8F8}@gGD80@nfEU#4ggC7 z)LM*gtpi#%$!LG&Ju&MYNRZ{I?5Zk2TKs?%b=YEe4CYFtxF<6Aq^^YYXm!K_VA~Gs z)gqs}mc8Q)byJ{+SM>jks2F1MvaI|>f~}yo5q9tiF5Hlu62Oz&WzLP=PuDTFIW?cskvuiOO{|GvW{Z4?2Bpgw#1WM6+PNT z*Tfg^;UcdT>L2P~a1ka-;|0Svn`APq0%mH$OSEFW2!eUZkfrl51?sBlN~CYp_%_)eyLqXdj5jxUmo@BqY-spWrrI7+3+;Ml8kf@n(do+u}pigrM? zJ{>s;_0Up%l4oF9%wXKll{(X~Vy;uFG=AtjiH0IbMIe*?JkZm%F(I>`GhV~)A;1Sq zdBS#p(@Za$UCq{G;=0}x_(~~F(Dih+MqkYhPaLo#nW-6GNW7#D$_&J6sC_Zq&(SN* zVmp6vQC8L5`fQLJuk5X!MWRVgFwCi@2JCjPXxxs=Y4I$h$P*=cG1NxpjkAJ3;pERD zZioN+E3~rdG&LxFP%muej5iTmi~tPtQ8UC6y?E=+lw!0$i(h^i50s>v0_Ox^Q`5Vw z_wh7+@1x}9i#eNZ`;Qri|NX4$A?_cjUEY87f@rZ6h3i4l6ej3R<+s>J58_5$qa-tt zd=I-PP2#xrs?CV&(qfQW0Y&Zm%C*hlt2iDuAUae0X4vlL3cuEMh}~&iy}=OzYsz=a zl5;x`N~Q+j47383kJ@tOOh5{sypqVt@81fUS2RQ~d<>szy!rI5UMHXXJ*=a`gv5U; zt}S<2riVP!&nkUD+ynWw(Bv^+ojRv(HpjO&FR0eKY?x97ayMr;wWERe3PHeW+Tzr{ z=s#wa(?*2`R)I^+Ush?Y(Nix@n`jF}%wn>rzsd5x;GTbcwtw9y`${j+{=u(q7aH2Z zXQmh0p<6T$P|vzwt#3uzsQ^%R%ME{AVH%GaA3Pl2B7*ZVLcKQ$A?e$YF55y*WTM!P zOY;6DZ4!1qK;Wxk#8P9;J|WSK^33v&TVEXegwCzeJownw`I)DROwakJ`B%#a?5)WM zR*jz+4&I)W6X{vwz6J3Q_mU)zjL0p|dut!-k^+mNN?fsEJeyGx;@5VZMk#-IuJqpI z{zUi$+m5tBaI`*UfkTw5$QU*)hirdF2FQd5s8BRe%k#)Y{dlA@8A{Lc^ZQj%_Ug0S z88C5HpJNi-w=d?M3mdHn`=g51Jgpy^ipi_RNmsk_8^%lya(P*)C)xS535$V0zuE34FQQFeKiueg+M25|UWZjKChZ^qU{gdWY*fe`#JVyU<^Pn~1UE)G6qB9B zLP(l>FgV#zmNFVqC6Yg)6R$Ur5f^#!ERuqg5bCUm{pwM{&oo;+pG1G+NGT$1eG6(2 zHie>y#Z{_pS*kH0qOKh^o!VcjG=H+#jZ-ZMA!0cOZk#G5-xlIju(v0$Y!$PbF}5OH zCeZ_g)}Oag)r@txmSjcz|GgHf^7=C|c3G?MrH0wsuY#?;if?D^TH48rjfZ9XhMK;e zg7rqdVL@;Wc+)^ul|p}zOs#%nCa%;mPR{xp)At4T%e#CRJGxhW=k7(SUf2MzIe;lk%BomKO@yZGh6%tIblQ$F6gyMTtZgQ{J)2Eb-xA~ih9l`BrZ}q^ zj})WHX&mbz<$_#>=WDp-IH#$6XjGOatRacL29;0?7UO@`QReL_Vd`FwW)~6dvNm%0 zd&l=+&fB&(VC*qi8yi3}qKh1>F_?CHi^4?{hm2;~hG}wtmj{FmYB141Tbi|ZED{Cv z*i;IF+^bUcdK-HVTSg_1>8*86pa_(rW$8?wWL=9Ew_~YM=BYsd3ie_c*MdfKl=$~tfJ;A;>STq|V|MHP>Bk!qgvHbI2E6_8*Qvp-*X?2Nd zxruC;*;SpUaZYTKDrZic*-;r&mD0DFCsW*HM@?bjJQ*2(uHnNHW>#E2;-^yP%rM&M zFYDFfveVhE#%6m|RRl0m*NT4l-LA2`d)15JzgK%Ig99pxbHBg-ES8U0ajw+V397ZW z-Y|kT_?2RfC8VUw|3rKwt&okk6$bmhK;u>QJ)m`Nx0~g1p#&NG7Nzt~q#VAHP{iAh*F7x}==2 z5Uxq zBMlrVoz^5&{I~dERA#LdEu68e4+8$aiCO~jZ`G;qEiw$CE z;p2tX|H}d-G2;0xU786@`gO&74`=xSyBhF+6&YOL2Qj}71IB?FTGIS5+xrW+ZbD_t z0X}|Ipd>*6pRkm2u}ALE|2EZMzD;8ft1Yhdmi~Y&xe6peHb0kbx83>VTqkPm1Thh+ zlXvRnnVES!b&h@37ah}8XT|e9C}(icQS-$zQoTy1D{-@a)~L)(FrP@>hes~hH0`E; z&8qE#`dvxIz3fsr1rk?uRDjoi>#jl?ZB_ThW!TQqDxHY_Z-I>$Dmg^eHvp_>XU#Fi z17Hz1s3FxakI5e>&kAxDDphVZdd3Z&6@A`r)s5h- z$xNjT>fxs{6zpG>3ri;Kj(1^~j+B~z$5JlH_k09gyn8hLcDbFJkI|O{L(wnsW*>0< z&~y+fE2`G{-R>lui+(RniE99lCDlfF8^Q>lCJ6(@+tW_NF}yHabc_q@I* zJ2MAmW;`3j__R76!bF}2mY@LM_(i!T(=;NcIF||K&J0KsP3e3l>hweXl8L&_zQ)n* zDH5;uyc5qgbeANNE{1)z9mZnhFpOX!J38MROP@2I%3SLi7`Ip7OM1X?$=eM@74)IC2rKYHNyrSO9#w5TTJphpb8zskjO)%?krU7(HpFg$*W*SG6tlTuVzanWNsuHG_5=>qg8Fo-(xi_B>^uVDB#>RCoC`BIRF1C|eldj(v>Y zJ|vmG%;p-*%%KO!q!e_j?qqi?*V^k5@r`X5!42e>p{=zglTbQKinK?E`P5_$b*dyO zPrty6485(dN!WmY_$GyhUg8IqET^S5>^fb1V9Ww%Lkelk>n{l<|HRfSB}tYqEinv$ zoD<*_&Iorx5XUFBy(g;A8t}(aGao$Pq_3c56~>baAA|>g1=P*doof}t=vR1wfMKz=5dMsslucJ9j-2)k zM4H!QTJp%o#mgyEj>P0U=ln32SqL8xf;skGwZWEG3Xthpc-^4P-ih0QSJYDk3F=Bb7?l02TUdr~Z;c zHZ~D7PZ#hE=$&TPVTcl%RSwO;M<8dJU6Ci*l7|PISap>Ywd0zoeEI>`SaPJDle&W9 zNlry7i?beHLYAo$vl7QFIKZM=n#m$+S{n;4Nz(`|{|KWer7Qn-y<)VoDRE4uM~`zP zLI{(8U&Z--RjYMk)1GWSymsUxLZq-PDp5Kd?vAPtZmyQr^=pG zoo8taW@aTv>GvPjiKuXBm!{IR?PImOMg%-L_@@@N8|nRnfnBzKbHt;m%#Q}Bmk&}h zJ{?y!9kdLWveaFJLtEQFG$s#T7a4Nx=8COm1{ z&H+8JD0D%bF>`0$;rFk*`j6ulmX=@fe>9*cc;`Kd#}$`Stj*ky2{p+bNW859RbX0J zDMy39zmj``hneoMK3XrFk0rbZKd=6;VquxWn|U8QBMz1QqKkd80$rLat=*A-VPaCi{+Top0SJV&YYif!3p|8)B(Gnr##-6o zM-$+E+j39T+sXI$nq_sor9Pm7PqRIc>L8_+N1Tw!5D)+K-Kj<*h?hOSRC}=&z3IP- zN@3InHTdO|sOttSRIuqvzslh`MJB6h`?Bu6eNT^PKl8h9>Cp|Ptww)w6v4B9D2L=o z!4*#t&6}>dGK&aGgo+sKSSbj}e3Lf;nu{VvhjkwrHBJYkPl@sb`=5ogv}%fw`4JOh%j*^{e&BynKREvk~sHr%FdE`95~t%p22X^Ijzx9pvo>E z9LC;acuTT7BsllOUzLQw^mc}SZZFeHbk1%z`PINMH+F8>RozkBkeAzZR)BLd$riKh zv16#JK1x{TiH)I@d~(+Hn^rn~Q9N0|!A|jLs==G;dCd>6MA?;Kv#&FDY^_GLF~ESD z4M$D<$Rb%GfMx()d^jcbQk>+kS4T?{-=8~i*MD{5v`S-<9_|=?`SlZj!rRa{B36a% z9YTe&&NTmctxnrufsg@yvM;p*7J4>3L=f@?iwnfV7mFqEc8+qjo;aF$!Mm{xOv6X-#XAWPdt)M#)^Z6#RxM#2yjM_Ig*v5Zwe*MUi6o&zlW@m(2%(@V}1lm6Gj5dq~lY!wf2E$$}fCX11cS;BaU&>_yDjTe6ypUL#Y&R(BW7C;w@L^s4!=;%_>%o8G!tfqWQwr(#2(`9Hjf*L z43i(qtRGDHYWpT^Q0{XzlqJKw1=`Cq%9s09;5D!uNbYSw+-NO+O$>-&Y`h>wQzZ6r zf*F`=IZ*U}*1nB+Dh%3P?e#1I(0C8ni0e`#4*IatB+OZ$3b=6LDmgs@BP`AO{ z|BR4-efoTDx)~aAqp!@z{K}StZ?H{^qL++=A)kqh%w14?A9;vC0HaHW!$mOB#7Km(?*b zmH|QCv!`4Od~C-yIeAVA#^aK~Jl7x4a?}83@D&ngcT}xfyH5$vnS4J_bq%<(`cPm# zvfvrjm-wrKR5{362~q_#oGxbbJSTj|s|oc9Bn2kpHj;rb^F7#U_p1~|j1m=v+0<@h zCR!4IufzW#$!6s;dF(T{b+jC=FEJ#f}*S`R9J6IxLi0lJn; zqIRDfEd@SQ8%299O%1rQJE%Dcd3`T)wL`am>`^SS7(wJdr*`0LJ4@k_b5IlU&_lvPF>yq4zb6Q#Jv1FMDG;k^`$H( zj#8V8AU5EqrCI+uaiAGe49@8KF23l;y!4>YyORFgELSB%o_Wwf*<*-$Qj z)PJulI!aam=l0e@O7D)6!@PS>N(oS}al5b6ZP<|{owuX3l2SYBVuyl@XgaNifCU$% z_=jJCAYC*|8BKVf7-)fD(NALoi^|Cb{6fkgbx%68YB38<*rz26yXVxWa_EK3le{S3ocQu z1dfoIW5s`10)X$&msHU}#a`^5L^97b2V2%dQysrd;|+tUV_gm){w>CT(Nz@E;hjcA z?!CbRxQ(tLlv+6t$T$Bs8cOQPpyMgdzPIK==1Vmuew3xiLwf5)SF|r7`UdxtD*7Yl z`&LFQzGfFN6T;$iGHHS)xN;7&kmFn;?fpn2Mdz(DnlZ@0gsF zDV)KKKUUEZq(?_cg?Rg3Q;`dCn4!ny=hH#&W_acWd7us<302^rj?lt?>^r926UH4? zhCw6oVLt*Lkh?X*(13*~g4z?E;Y1TErXj5BXp4h(RjrzU0~9BwLK(4tXz6~RPNd6q zSS|Mmzt~zzq}k4!CKqPB|K0pgS&_w$PY?e@>nZDqA=jX}e;_(zN?yD5PZ(B&%S8zg zVT6L3-~a=&LYPOn;J}UYJIo)EkC8+V;6hqbLgq&dFQEh}Y;gRp!8Xp*Ve(`PEL%>B zwB3vSA_x{sq-h9cFT}S;bqWhnf zc-l&zPF~4|h_g12{biqvtcVK&OY92fql?T&d|f_?4!RVQe@kkA_HtJoJ*?NsZl>Xr z>n5n^Z_>rt(Q39Y>nZU`6RIa({5yaD=;QC7Q~81GO!Gz3PrvS~**}nqr%B;bo3)#M zLu*Kx&9V5%!+@b-GL%rgG4wN~R)HFAS+)UjdycxZ5o4r@fZeP5JZ3%9@&nee?flAtNL69>jA=-hUJ6ew z8kFaSO!71+zwyK~I^l3BL^76cl=;pza6rpj4^wsl=%~8Xhw!J<_P&lP?j>r(4si*K zUk(?*_XlR6k~7}7@BUovMJGHha<$_o5uE+9H7~xteWqo9_EVeo+o&yve|*a8#B2K2 zVznRcoQ&9Kt*mmvy|YT!<2GU*Q$H5VHA;T{zRP(1`Oi^jLWJnr$$by~UQJGuyT1eT zD&!pl{;}a+KhLS){!$@`FiIRc5)H=CkZmQs4eQ2Mcc^l~MI-ax7(F^Zs{SOlhoZ`~ zAk?9m{qcH#ZR3o0yN-;_W2EL>e59e_&v}j9_r~8-ncVVVV)^ALcr8!l+*lK5eBQ_E zo1!5C`XWp+xY89GLh~Itm{>Qw(7UTJhhkgT<@bEjn@TFjS`M(G%@m{xQ}v znL@q*qLH|TvaF4L3HVIw9`x z0KOE>H}&AAt%10Q`2R&@a!s*Dsn362t8x8|&o%A;65@zd<%K`b&JoCJ!0IHP4KTgA zWUefKF+CD|KBeg*pZ{n!w;^dmT;O<8}tkmSUmX1_BDOlTsW&ua?*ukv=-bf9J! zE~($o9+80nPK0_}v((28t-{^|91-4S%LlpLkA%M_sIgnW+Rs9}nNQ%u5Sc^_n%#1L zORuEW-e!Smq@6g4=6+WU1!H&Isrccjamg(S%hZi_!U=h9hio#Zw^y@dgYM(JUlP;2 zRdcnMNXx9lW(XHG2#-@qZp`_9W#w##s8Wr?lt&ZT3bYyOPwu|(KOHq6nA|n4WY4F? zd-Zl)c_ik1vf8-el!gi6F6R0{y}OQo;RZ70aA04g`qs@@!o69i+<1k+d>~0U*&{g5 zkhqH&kN5pet`!~Jy1L=b_;q{=qoryiLCdRkQX)aXh8{$WUAi|6mKx^pB+<>TD^Gkm zXItcQV1ndhDxBQZca`f9Gs!V2Uyho^@g3E0=4-6<)r=J~1uhC_H7t+#r}*c8+Y1d) zsn8#RYK^!;ImzvGqm_q!Eo;d;>080Z>0dOBy?lQr%ZtKDP*w5V9W~*lUmp>pEY2K1 z;QsH9P9n$qij_v|ZkAa#ZrY8uq>8t#*Evzs`tq8pNM0|~9wgk8c7}9ZM^MpW(z|=5 z?$IyW()yd#lmm^sU++r(xOp*u<*R2S$t^IE&cdNea4Qe`33w_-<*pPe z6+X*QnZi=vESxa4)Ed!hf?zj@69t*r)K0Zb8A^V>=^Ycsdgn|^ZszP(F=ovVN^pK# zggg7JJ*_6bRgt<(CuH?yZEVW~-tczhkUFhbv0j~&CNoCi)vw^lLxT!`Go%-h-!;wo zew61IXk>a8XQUzCp|tO+5SmbXu*DfGEn`?G0^P>0MT50EAYHTl;9+{t-YIZLSLTY4 zyj7Sv2+jGn5RS^Vpspg2-1>1u_dch^LHOH-Xu3)yJC{lcUSSHH98n;cIiA-|h3eN- zj^(&a)AVbKm}Gd$n5&(C=7!`T-MM;(=Upt^EAaJ40^=sfc4(&6s6o8=-a(Jx0G&a- z0%7iNNuwyAA-H9orkKs9Hd{9~9ueC^%iF4r3s(QYr_Nn3Qs-fiy<{4<;VXRHY(IE0 zm#z0NqWEErb`Z)!pw=RU-%eDiBvyY(*@g2nWLzDf2& z`KMSYrHL5;#O8E8M7KJ`%3Ql&^(LVC7LdnjlJB-9RP)#2($1{0rwfsmsUhme#BmnP zS+-9op`N%NSCaUE{cU8hcPvVSm}yMgpj+K!n~Pa_sT~@YG@vRq*!kDl|4OkSo3F;x z#C4A8Y08sl2cq?VYgQKvIL@t>#x*UdBP8!|d_2xND=#EYt7TFpiV;(TSIB2~*p~a` za5oasvAd}L7NSz_xMG1JVE{7NI3|M3cm#wx@&)Pzzy1V%6PMYta4wMRBsU!P|7CgD zDfg8Dc5}*0H|fvtZi41N)A0Q&$@t7kD}2?)Ir|zj?b-o<3On}wskMsi+jwwM2Ph?W1=xGW{n z(tQUafeh0hy%;{0-`Ny&mk=&|cyE;wtK;?|z&6o~3#qII0mY$=|9$Zk5;&73-OzXz z=%~nBaLe9*eAuwcBcF95nscQWQ8qo2bmp>RF;reAbYK)w83W3+Ql!9x2@7#~l*BXm zmg1q;VWkpI&}7PM34g8*h_>eStDxZ1MX;cVq&~KKe6D1sBAQK1C<7-Xs>>v%I*74! zgdQ?nMJ6$FVQ%(Di2Ox9wkKQcPAJbfbZNO&n9=xusqHYDOOl_PR*=Soy|sp`Qx-@p z82C>>NE8!IImoynJ&%u7!g2PXt%$=G9(L*{#2I>%hx9=FiyQ5@8*S1(;A_W5x-z^7 z&|S!4t3gA)V)Jk*dJemPX!0zZwo+=PP)Re|!_oRMfJL7{t_o=j z)GR-P3Ag-|d;3pflMG4KfB`T+U1tZ(w|rDCc`T)u`P9FuBhMFXDX$|-zXyeJ=I8Ks z{9sM`W6Vscb4rZ0wwxAItG@&1ECkbp2^7+%*R`xY?MpKCwrY=NqjgljfZb$BY3yzZ(D^JNd$-*@klL zTGdXI^sek4@?gF%TlocUlOMu!DA2}#q->yHcVyi>4I$P?O)7;~cJ5e)Ee8;TAf?pY z!U%83W7Cmyxf()q#>&0q-56;yT_)MzENSg|P!-zGQcAVlfa%&Of_F4B0WBoA&x}{s@1U~qrUp}5rVjN3PA*fyUfVOvwWUo^ z116!9g2BKYN&$J(A-OitV8oDhqV$&1z>sfKkfB3uxHye>rM;m{>FaV;Ows$P4nZdL zO7`q~%xr&shbNFL=%E;YtIe)QV@^odqefV)$gU0qAx!$#c%4ZqA@x^-*wQ3!%2Fz9 z8Ux>T(6RQP;t+OcFY$UmyBp&D@$Cn_s>w#e!hy)xKuw(8o1l@j#LA;m~q*N!=VYexNnFMJySF_@UO_O?|F&>rhjFtvE(jZ^n!~XXwtd zRue;nq9{%B?zhlE!0R|w#qbs*gX>t5cy!+kYr`=f19l;@UOA2~(@CKRC;OK)HBwub z5rr>Sd|o87Yczb7JowE@s5`7A7yS%@iTIJ|Cl(_}vn)x=J4AZKp_dq#4UytT^PBRr zeB<649X5+}2;*RXah|o%bSn+vQXd4GP?Dy`k^^>48SMvT4qgXjlv(y^i9L+&g}*ix zkB#Atx9r00VqMcTNj`xgy9(56SQ>jT#?BW=YwlmZ)udqtK@hU0wR8U4z5LKlcMJSYi1 zHe(tC^rD_v8L@;IQUb{PS72q4yactZ7*`)g8E zn3BkU;7URK|78K#ZXz8nk`)x>_h~qVN+>gJ)Dyx&bgyOR{ZE!EU>!Mmu^Sjc->*#Z zFzS+z=oH{LRTjg*GQuZq1teX5P0p~q_D|lWF}j{q?JCP3-JT#4qD|4_FKe3tNv$=q zR!{tM-EjQU+tA*8PhZJu}7F)V%$Qctq%b**1e*G-({I`uVFQjIns8^Dv*T>OH^aR-igV zR%>TC-NR+Y#}6H@cBVAaS}v>s8mg-+4Wjzk!sGm4cHKdg`OwWPl8)P+5?|A1U6W5y z(~n^{a)(WQA!xYa@HuS!^af53v7C9{cH_t9lSObAs^E~o3)oc)zB{^dbU*iF3qTJDb& zjjqfa1c?mZ{iyk{#f1mx<_|ov)vql1;AEe5d6;4e#%D<>bu|*Zv;o(XDX0AB6KTU4 zO%2^GFX@Q|4)33|RY>5ft$%2L;5AiH_r)+rfQFOY@EG9-nGTyrD)jm4i64foK6+B+ z7}6yvbh78WS;-i}#j|7j(F6-vuIE>v~g%9E4G2|{ba=v(^f%j3U)KUAJ-_UKb- zF6~-c3O>aQ61%0bIjN2McU^hwIC$6CcODoNZi^d`z0fMl<|RPR2n#IY=$4^wRBS;? zgQhFP>W{5;v^_2u3LA7C)R_vM*OzILD^y_0o6)?Mq(KwQC?FnXu&&H(!aU5=0rc}9 zIr)7=C?lu;9n;I$#hfpHM6KT#reMGCs0eq_ORvKh5>46$vR-+IkOS`Nlo_x z^o3jSZ*~?-_DidFET$Z5cQ$h;L);2IG){|E+jDFDN7=g<0uhqQ)YbnC007X`DL>3 z+bhNKntL2|iXagm-W5JF{mK2$8QmK^;A4s+$N8P~hpm~I7Xf=~?hj}Qm@ic`4~%k! zzcDx|?KN!dC8cO0$@3HW<$CxZ`1Bq3rr6% z1JZFJAD?qS6qxw5^CsfH-mvpaJverX<7pIp+FOZ7tWtg$o=%}daB7&nLP`PLu<3)t z13^qbhLgy%5Qw}E8=1%n_lt#hRF3mHIOJowTWeo~Q-*FmlIM zK`Zo>&u9C8uH__uwWwRSI3}=#JdcX?*^yR_{2eoQgBMxG`FQFnFcnP_*?LqHty^;HoIvJhbphcfjeIet zhmQ#ix52efQ03xjEtP|?dtaMl7NYFZCV9de3etIhMG?1eg<5GURyvxsm0p^v_#)lK zjI^?+`EmmctrtsN>cSpNe|=!riTYi1nRu^!cJuDBxg^$_Leu`uERmzhloO)|K4z`$ zwO}1XP}gz|P&7$benGgj(eypv-0=kFUIkwG{m>!XdKv=Lris=vc+5mlUbiwJ0z{Z3 zvrTk=OmmO0y15|HY`JS~^Q;DM6!Aa$p0OTHWpbNVO=LZJ`%`_YwQ}&sA%z;)ioaWD zKc2oWjqk4c3bo5w_QNaAxPTX!?Y%1m0qnlgrAdX!!+NbZy(mDp)at^*;u4ufQO5cr z{~f%1yR}h73_?#M5yF84GLegDguzphXt>aSO5tRL+0B>XkhFvnB6_9UXX=julkr-g z0(gNIRJ`$1$~x-Wos2!&jR|?5`p2C~_`3-F<2N0Q&>Nzc6xfOp3j_ARtAuvDVX2F& ztHAFUw)Me+|JJ_e@mu<3aH^d@k{iSC$lL4xkQ{BpxhwFADnaP4mi9ZLHON!mU^A$H zs=zEiQ6!z{rgC%xHKkLg%-a%cc!LR);uF`Ck8cI(Vths>(pafA$d`4p|CCw|n@^2FIV_*S)i|yFQJy2^we#oBIncBe9+cP zcIT}D9tdf6OO*|(Ff)2gm~tt9G^EY#_7zpX43}X27qDgK27O9!ONm{pd)f#zYzW=j zC7e?f{e+HW0EyF7Meg;ldBhc7w2_H*hJqCFJI%OFueMuN%OgpD`q#)xoxtLZysh^? z5b`-bTW6m|Me8*v7u$=20gBWFv$k@$C+jOKe~W%=m=3k8Ai=G?AbpL`C7d51{v8D1qd8YJ~=)Ttsa)30f(Naf897pm2LJ zBmYV-&cW~s^XbC*zEKMCksom8Isc76a_wQ~4AX zl?@4!zB->!3{a9_#N*8m`JxD2vxFkohF@|P|+cO2QWekf}pt$BYB?^ z&t}RK10~d(#iKP={fM|5mi3L$74RLoW$h>I8R|RH+83CK^udj!Ho1vL$OnC%^} z*8K{sN>UR|!nopruI0uO?lYvNDm5q(*OQ379?CQoY0#>o^>z)AfR8c;vtE zF{tUiWinHPW!HCNT9`F);!-c5rH>6(xxqBo^XeDND7Hm^9YLfS%K)8r#U@S%FGWO< z#EMG?;u;&&P_W{eA3Y6gR*H&uy|Dq1L`cf*`gk)L>v<>^lt*=|(gXrMJEglUU{0mh zflIS8ITlJ>4mBHu=#)H9>x84u^p9_D7ZP{mBfkA8TAPXN4^Kt-Qy@?Prvi|iU#4wb z9%?=BcVA0?)iL{%YxMDa*Bn^QI-{J5F$XA;s%VQGiIm@BRi=oszR_$2w~fh zqyF=B?oWRR6(Ka4z{aHrA$S5{CySnZEmgWhM}QELjb}%MYDg6cw)_+ zySkBC=Y}S%biHjEF-(DxO*$rj;joey-e%vHvoMW>PkQ&(f8>SD6BRs_H$U`?jD*OTRIO zW^)$o^p2bZ_Y>r#`hKmqW%_e&m%0Q=r`kVRR`Z#6qa8)H6dC7`#guRkS(){qWtdK! zwA@(^3L$}?2qJhvwRbwK!kEFM~JnM1RX{hBb~Z_R!q-f@u7EPQwmoE(3iQMo5HQJ5N!&ogU(WEKT`)2yc$#C?n9q@|5CnpfLUHG4bw zk$wgsl0gy0>z3Vhf#^s#)`;7y4BNOAAT?p0OTWm|BW9HgrV)?q zpTDwWljf~zT4J7cJ9CPp0Kd?GamBtzLw6GKfF{P1!sLD*m8U(PT4s@y(?GC>O4d&P zUr|a7ASZt%yoa<^>}B+zn|Vsau~Ps!`I}}=O^`O{!^V1kTVzh53AvG00TVxSn1JP* z#qb5Q)gAJ~B9$;OCIf4|HjPU3txC!5S!yLUH|JAgs}H98Fpa5lQr|3pbk>82=_Zzm zs_a-oe}Z!P8jXh#(}C9X{Yk2Q{efhfu@z-Co*@pgl5Z{4W_P}{q64;WqmnE&7DWFH zE8_3Jdj6`{ifz57ZA3&>47o*vD1TNFDfxE^pZj~S3Ual^tkOs z9X;JTsY6|tyjl+3>>CoO;5ujx25(jt*lSY;G1aA#9)lSfQ}LSwlBx^<1H_$+q`A4daNP%5-Bt5-9p>{b$m{$w6N|ligh2SY+v}fyUshD0FV9IC5YZ~n z_A&HYitMU`C7hd)U?OBU3oJtsAU&Stw<#w-@80^(!F0dXF})A|Wv zKE4jZ{j|hg&~A*PkW{_sn*W#9y4gs|g;ywvaZoNM9DpUy$!4-|~JVG_|tp zUeh%BKJSBnD5?OxRHo#^j1d_r^Azuz4q#w^_WPUQ(b}&9%i8z#9fB5I%qzo!G?G;B+5V<(T zBLN4Zr>;e{jpkNfY)&cHczRy)Tmkk(hXTksGAmMBM>K;%5RwWyE<}_c%pmpR{?44F zBr*NZb6Zu!i0*16k)HqB5TS>`#3zXtKiol?qQ=+*($sAYS>TP(oVMgjzG?9v1tT`fVy{P4;Mk#LGa#5G;srM1%KD-tUmEK= z+h38yhCNLE=_2^2-r~2Wr6)2VE>DtcmMq*PMh8_O87!?0kzz3v72+ypdr7~QQQjmb&zv*(a!r&76L;IxknDTV z9KnIpi1`<8yEi1iWnNmACbiFdXFSSFpAz|xwd}$oqHp`9)jpd)#_DtAC|+A^@iNPQ zZT)nv5WRXz`}=iP5U=i=KVdI&U%FN(Ab)ZjSH2~BDq*=JraBA3e-*{R*zHXo{#tvL z5CqJhlPMQUrIm{fQp63M*Q)y{^ZVE4q|_QcPMT0ARACO=UCpyridv{>Ds5aDJgN1* z)#zu{e~vsQLy$A{GlSq1724rHh_NDn!k+R9rd4Z#H?Urvycb%#UvUI^!74k7Dji>M zauHoq%qNrs>^jm(e(uYSm3`U|jwC39TO&E>toOgl58yLBOJsBU4Y9ogRm&{CkX!VSx&ou%0S5x z@x9`(>!%xJ`BA_~a_$W&o*wK19zN&fVRYtQusN|ImV2Xa zzVeBI@0w76(NdrDFeB({)Fi=w*tgO2dYSw`Xw}kbBvcR2GZam6)ja)LK#$#AH(h#w zF!a^nHluABBP(RgC46NOgV1^$mYXxlAF3!w>ymJU`f(UXs}TO`N*W00P_pRLl2fmZ z0>0Q1AV}n-B+fvJGLo^57R|_r{`7((Rvd*jZ_%XW3@nc>o3vjnp3-%HO2x#>y;6>* zbDSnUFFK;+-`BRx z&1y5Kn-cW+B=E1OvR^B62(ozLLT27qSFhTkRr~qJ3nA6ST$2Zjc7x8v1^!*uKiqR6 zf>Tccj7%NO(tL~S>+7_Cap$7}o5F*%k_?i{&qoE{=uBRpRQ0;F)7{}E9{X{94_abk_ zcXAm=Rc8S#mJSg#*~7?kVg^?Q```Yqh#zE7BxanMt2eU4u}J@a#~iZuL^Ym|9j~a0 ztSNP_lP}$gZ~^yJ@x_2yoC?5PdE6LlBYA3c0EmOWMI4d z&jc*)Jh)Z17wLLWSMwp50YQ?SbVj7nq(Af1a|S~Y7o41&Cw9#^ivUn8_>onUt+>qm zU6j27nEyNR%0SV7*f4x{zC}s&7+*PFH6Sf>7#2}ksaP^*@y1WrUG?KgE2{Uf+)t{I z+k2^Lx2X+6Xk+Nrc&?gIJ{fT9X#JPnj7Q$hSlJ@j5bo)7mSdo1_hpOnsNG#zd7~Q! zx=q02$4BJMOYk3A^mhq z_|lL(Awd^HZ@E+v6e3RM)N@=;L^LXm!z5JPIr+s0MY<`);&AmnF8-RQ=7Kz)ZfHRf z*A@6HY|a6t7`P7aZW6QZSVLSxXyDRmG~8%SNXd)yt2Kp(?-C>Z`LER{22 zhM7gRLG7D=8gPH$((Z2V(QKkbfD|#{sWLAqjgi-m68`5v8FB(Lx#*vH9QZ1ipRu*C z%Bwha;bn{;EYFb&B-L7`&3|rsG2i9z;dM;e`G=Y1Rw)74`)^jgUh1_qk0`e2D&@rS zLR@+u4sLvsi|3OZ^VVM#{^Hy*6-w*!Wj(AQ&D_m@^Zq^5>jA5bGZ`@2!;7}7uhM1+ z-Iydm?_Ecp1(fGg#W%8Qu%5)2t){dGgHk+K#Iql1(*3%tb**b+*{ldQ;zgSHaxF;Sk=5^`~zFTj_ho&1q?FI~_P$L4!!#qAP{j;PVV6KGw z>xnBXE@FGK)u?<9wdl?=r+(~viNID|A`i-Rz9;$VGsjhKg7Mo0b;Ys09JF=t^FP*; zLO{b7U_U%BP4QWc~lMGVQr}4704x zjl5GU{Dn=@`3zOa8jh=Gyt4RuX`>T>sW@8cLe@`oc1mmwJiHmUI@I<~@mGB>;u>X- zeRxi{uR3w1n{S=hz08l4leOpuzcDF)CC)E09dLD)022S42{EgI8&IN0Sv1AX9ru0X zlE4Es2zP&-E_&$Dau@%H!_RH zY)`9DuMg5#AU#S5PdMp*Ej#^+nl@+10k`*xIzKYXaWx_S?1OT~El6}cUgckZA1a@7 zP*nfQ@9|2LqJ}Qp)hTY8?=7O5vDOqjfG$0f6te|+AL&*-pWz&Q`L&Xox6o_7$-~n* zMY=M*#r>sG- zjD2=kYpV0(&}@cU!99q2>yJ;{db7O~C^V8CAHo<69YrXd5}D#*J{53H5>CI8{``r4 zRPN_yyY1HR%DK&Uw;*RINdLDJB`id@k4B;inh9#OZ-B1Lr!FS5*gi0S5pxo9(o4is zHi>+8Y};r_w`XIerL3e>%i}kvBbSgtQLc;=Q-;-TD>gJpsz8y4>HR?U zQ|Va^5|ZrrxWY$IqDEN&J3z$0uXXC#S4rb2M}$iWKvpKp`iZeJ=!C1qf6VxP#D6~L z3Ujcyz475XA5;S{W4*BYOlMCp25Tlu?Q@OgE6A?s9M+<}|AK{j8;3Bw`_C9y#Dwjt z1W)tDADUf}syqqceRKG_!X&b8U9fRSo*O$MmQE4)|xB91j}e>@`w;cA3tLcVO2=4As_4(~Xr*ky?4X|B9S1 zh)@TLWRm)<17+Ai(T55XOf%@!ImQLC0po0-r^`P;mru zsDUch{NmXwU|qEL!&BgQDJTPx!w7k38QZ{+V$w>nPA%jwe}@v?H1Zv1*-(~>c(q|2 z>jXLi<*~BZftwiU8oteO0+w?SsLk}c&34m!7(R%EL; zU2Q6M8E`h0>yp7gx2BqYu_+*Y=M~lrGU*@A>=%0OQSB}FXWI4-RT{?l1@ktihN4y{ z9U@T;@pjXO8qAOK0ZZ|W;s7+5 z%iaB*BnZuL)K@G>@y~_}$=uNsMK{b4tlls|SUYSi6)9d@YpEPMOLQoA^ePfxY+>u$ z=sZ^>wPpOH_hkn=#H|v5MDn*{>`4f8(CtruxuKi8!>`6ohFS1-cvRo*90w zo;EHx8vcaJf;3F?3;;`Fd?fjlBMk_vV_FRc&_Gjxny4Xrpb;5CcnjFSh48~neMufY zJ$BzcY*iHt1s-uBoft~8#R6y{lw1F#X6W^(t|Vs(PnBpLf_1e*-EEl;CT!(;OmF9E zf9Ov~37xOU=!vr0Cyhm=4%0@Z%|9w6Q} zK}yi9EDU=2jMOpCwqDNKLWl+X@qlL5H?n#>|0y!DS%8o@?%J{)4>?w91>PKEdqK`K zDi~@7ga~l&3LTg3J9#{ai++}S6PENpe|*o!N4qYb6|iaVK7nItV^KNHGCf1SnJ zyk7cZQjnVZmx+3UVxyAIoBb=kTtCYF<-o;*E01k6OTCh=qijMD9@uI}4#nm|Ecf#7 zc1rO+8u&9IYLE%^Zk{x6U*nY>uOiBNUdW7BmFgQqBPUKD^3(S;I>&EC{@)JjrbO_R?;@RHd{|HX-f!$~_&8W+9 z=Co6)B2f=S47sa@ZO^ZAmEG`$V{~eV!AzB9oxX{+&vJ0{CWiAYKuZ`2e-Ka=VBCnn z(C`|z4_OOEnPfz+*~(I&vH>9#N<(mv3U;8ym=vRJzYWd|MQD?d@|NmS64yM#h#foN zkK?Scbbb7fU0#K$|8&XjCo#|*WGmAfNfgOt$s(cb@WX&8B~RP%B~_;wz$Gn#aQT(n5wN=9hR)ako~eI zi>u{%-=D0`fgL};5aLyeVq6?Ti&D{e;7gj6;pnJY9J*CbZ2w-)ehfMOrxzVr`tnhH zHdeh5^XS?-!U)lsVw9g^=EyHv8zaX$qZ#IHlpdTD8(=jx_2krxfBku7k4!7cB3Ju| z>uEjdDVc=nuOglMhLKw9%9>e8Hg2EaKN&Pdkgndey)@Pg8jB z@5^rg{n9>CbhjJoF_9iH7A(HKBV(mwYigXeB;&isSWgnnd4FBs6jXEXO+VJ$>d*;b ztiUIt+~}}amsNQ2f5*L8*k=k|YxI2Dmb6ovA{O1Rz)XN13|4wy=*D@Y^Eq&fBVc0{ z{*!W0D3e}>@|EIR`z{nvcmj4Mmc+C)4wb%=Tc){AFw}r{5wLk$s-|_03TWi|sx@>e z1K56|*w;!t)!m008xzP-$#1{wT{T?WmI#6HeS-YR?&;oDe|`d>o<03C!aQ6=h)(y- zXq6NOlhyeOr5z^@i6z$2>TX9-JhmTYGVGxh_)1Ha#zXXXA7ejUL8`i}jAg*3a|4)G z5~3hvi~bfIXKj9jlB3YK%|3K-`JD+>FHo6KZ5g8?h9t zgjYix?yYvwe@9~(zaWdkXY+p0{LCb;Ws~xG*JT(LEN%slI@J=G{lcGS;gDYk%O<IE(kd$Bu~1AOw+BKRqM zB@{Oo1+7V(LP|>uF~wsXUTlUoV0y}F>Y2^Tq{O=H6m7R~QIW)?Jf#=IxP{++-o}P! zN_EIrXWJ=qnHEM}|M}19@o!b~wfv69E~WAoRMS>RbpRR%!8j|?XPi&84c`1p=vX8B z^U=}!e-mWu`%?kF2bC60{Ex|w#QOmoe20BU;W65P4p3p>RUnZ>m6U0NV~c^lhxSvF zfe~^CsaKtRS1ZycIJX3QjDZ@7Lols$7@nXwB9Ucl7ToRu%xrJ?%o`rlr7SH6yR(s> zoS$%c2&i-JQVdv#0}C0Kb)KfrXSpX^Ra+mwe=1#C&x_VofsPb$!oWr~E&v_w4yjgy z5I@Y~b9Nf~?gkDI$m*@TMNT1=s-10?tK~nb$d*3Jd7YHV)F%P1Ih;Se-)S1b4 zYGqApEQ|NdAu+kYFjtU#C-FmMO_2w_eaoNQJ{!~&+5*yFZ5s~=i zkXEUEg0aeY9f|#N)v7cMm64J&f&}jdEM&?06kBQv+@FF=e;(dw z?Vx3O#c|R7HzFROI7){pzKE78IV}Ye^JT+KtHhUZ4kdVNonMW(Q*TX*OYem@EwIkU zEV4M`d|yi&6k&K1o7n_adhT~#FMRys#~u+A>`gz7Ojf*Oxjkb|&fnt#W%#U3eA4Qp zJ3_Cyjl2A&B|yu9+-x|Jyr=s4f1(b#<{b#I&SMyv>d-Z^nYhXfx}{kqCh0#*iY6_D zk&Ao5JE)8!#`8+oWNSW9!o1#$E_h43$=|7*?6D5_;V(~$c#y4FoL{UgRn3zy_$fW& zM&ZB?RbdWskkC+1Hoi6K8DY^J%(~?O++dh>nq)Vp!aCS^SjW%oQDi;>eF5xnarZ{=??oUC@q$>38ntBmc-3b`kg^DZ#>PI>w(%h!7dq_i+9zsY2%{#J%|M zbqyh|No^fgJe**~<#kJb zbm6+>K}xr}+C*_zeo(80*H`Q_g?$;~N`;ovfyA&aOt~Jx{#tq8e^@RB)ZVE1Wgh%7 z%5G!Typ~Dt#I*~NWQ-GL28WZaii)6*q!G?F*{Lmz#1A!4iUN#Uqhusol-3{xlaa1i z8}@N}qE5}V?HK(8kIV<+(R*Mi{T&I8rbQKW^jOAU(Eozf{k=?@7OMyBy>t3u&a{zM zB~qBN!Ai@rlP?-xf6v6uIk*~~YA`(=K+BVO+Is%ebGxu8ynI>XV?pe#DL#Qo7HCh0 z`>B>m(lR-Tyd*wXR?{%*6_f~}Wkm#SJ{xcY8wkP#V^lvnOu|(FJP@oIm9g#lvkuE) zS^PQyn0lePCwb^|@dvc&35%`}HaAC;A^mjIhTq%{;bq5~e}(jxN7G4mt|R5TM1fNT zrUfQG#FLa;vlf-Fjr3ByG_PvXSagYA+oZ7w0;c{bryZeM#&|+^)I5_7r|o@+BeuIq zD-pPcQ|DF%M?oa%nC1h~DVO?RNuz=yWks$C9)Yx|8LHPpC1jxpn=>WK<11Htw-s1! zyY)!arX0D5e}|&<)0AtP7Ndkb@dKtgu6z~Z+|)USl%KnJ#d}$7#D~I3J*Z-1W!~v4 zCz5kdt$|svdZ$sqq}>$fXJ>jV@&*YcbJ!L+j9E)ejTr8AP|b53Qf@$uhmfbAz2*NB0J z$kLDNN2%VyIpszM{pKdC?b@b%KjnBcGlsO39rDak*A`{`Cfa_D2E&a#v z%8N^8|KBleO46~|4X>u=HaXRhQz2x$o^z>6f4e~q1~DhZ?^~-LPnvPk!P{u`kUU7a zSTHX;KJwcH@2}b;)R?;6CE8fFrO2x<4yj!Is z!b+DEUVFduk1-dVL2GZXhw*pC5&KCmMF^VVv)oaF1$rn}lmcPP9KW%)nBcz<5L)#0 z0pG-2|KZGJdRubz{urz3*H`r0Lyd|he=hl|$%6zF#?t9B+t-vg^OK*-t#f|sX^@8H zS1nZDM{fn>!Q>}zEd)-uJjP1}h6R^wtmb7z)+h!VncDe@M&~tL7Lo+40}=uE!Lr>a zG+rU^%~iE%4K$8M_$|4E(i)hf+5c7rr`xsJX^4qx(qZ)<~&M&HN2~ z+2xXOX6+Dkp4jZRvn_8VcU4LNf5z$;t644a@c#?uxU^LG=OFpa&L$uKtoT+@8yKS9 zw&rs`Vkw(5-Z8!M@x|}C6dIGq-M$};MtoPBpPSUvNcacszZ3fPA$7~Z>X0_N?>e7> zkwWc-o3?qInFu1}a!3B9v2sL!b{Kx`%8>Dr!m2r&-9w+GU>ib`0X&rEf2BbUo<6?t zY~{4d>HCG4Ge_=$Y;MALhw*= zvIsD!7$*NsEPOXBf62&p3U_(F&G&Pvs8citnld!SIx|(TU}nM+Ms}2Krbsfkg$MeP zKz*pFhbvJpEu5;?!k3%LFPTUgh+VdRJAS0|c%rtg$ZA?!+oh&Snyk3r&uZR_m{3nY z^OK!--VH)&w#1EBO;zyov~==Hfe9JQcf*JJrVso71DPRve-aS$^(Uvk|LHp9J`&Y0 zo|0r`3Bj7C$sA_F%=+F2w+U{(zx5BR1soPtgnXaO;G7s2O06N&=2FWb5L0MwSqy_tr zvOx?1#KRJb4^oLru)gUJxpcMq#K8{!yH`-gZ8Ry+Ph^ifS3g;cy!dyHWsDhVpy?2*+zBVkZa4h}_MXsUe~J93s?3*A$7 zkjz_rfBs15oPaIdKxruwJZi*|@53OKF*53nzx3|7l<$oKDHy4h!kZre+CfCgPp}`!e&f~9#xVK|HOkHjdRs1 zmuOH+Z$7!3ik@JVr{FXF0x>M^trUS5TLJJ#%3DmYjjf&5zkltrz!wtR6KL=xf?T+x zbC{#ojj8&0CP+FESDFcy+_kq2v2)7$5qK4&v-}izE@Xdn*kediHR<=cxJt*!MS7i6 ze>mc2{sS{Ba`F#j6=}D8Q?S>bhMA`3L433Jta}thM9SBP_O_HBn zW>wO$kI9p2+M6o1cbJ(MBuGx=7-d~(eP627)v*b9PUIaC%z{hoUw%y*e||rf8I#s9NPSEhT0nJ=fAEVJ zW@=Se5d_@2zvO`^g}X0T8%z`a#ZzadpOh+uUWyQd#KSG1sBDq&-q{e5&U@pNe(S3; zVso33!nc;yBhjV=S5rJ9fgZ_R=kTwW7eCTPmC%PR36p-i$;8KMLu}r~=}F39)*ewh z8Yt%dv~FHZ$|Z;`%HPqe6`Wd(f7W#b(U#2?4byPqkzZ+6YKeH3rJxSxRx67)mfl8+SM_GqQn*q4_ge*~Ug=H&>Cra0+J4ojSakJlB-RY zxpqt<_(dB#Lf#Z={wc<6paIKF+h8{#bV*}=!I>mY3mmWp7r1FlH3TF}`pU@SivRca z$jA6x8LW;_xZa9=Aefimf7qq)7CS1sYA1Ae&k9%L`FB`^Jc8Z9J6t2(f4aR!)B-ml z#FH-)Ym|5%5LV?l*Nwt=jZCe}Ah0)K$Y$kjxK3el8Slb~Y6RAFhu(*qiE-Bc`CYcP zIFGUyw7I!eIb9TS`2{QNxf4)u?m1mdwh94i-O_|~^6djyxZ5K$DQYAE|**RlTvtuF#c68C132U3`$8zT3v8 z((ZM!FytYZj$c{;Djt}J#&j&QB`Ck;=4)_7o{^FsUMJCS>G29*JE zR#m3px_V!1lyYON>lHcHgi2tx-WYG2id9Rqfd08CrT&N{UzL2q!^ba*QaWfXw*;ux zx>SS~1Q>BbBuZE@O3`f%ZM{u_BffGLe|lyc$pdB)@_OAL8TjZh@+;f%B@Za&huDv3 z$q=L?AP-YGe-y_^Y)C2?RunoeF=9zp3!mlug9a9chOvL6t$4h;n?rfpY8}h>a#*v9 zh)o(tHie-DY(zb@-9O0@`<_UJfeMuA5f}~$&A}?cInJ>o%jDMER03{f6iod^=^pYAz{f zev>3@Ub5mD%T7&cR>|*PoWoDrJKeV5b~a><4c54hso;AfM%0arODsQDurQ;6?`rv$anZ?V@Fx%2 zZDtP0e^k)W_&i&)c*4Av>5yaL**mUZBI-*3=@%c${SoIM<7$1nEhcp4s8C{pr9&Ar ze=2ncQMm~I0$C&muv>ma;5ST#lB08HWFqaG6dNK0DwD;6_cPlKMD~`HLuyw`&vbvW zYRzG$SZnfj`^7#QlIj=;`r`m8v51pFN&JTle?K(N|6(K8JZOb^U?WsSZm&MReeRW* z+n90rxkUNGM?au!rO9RiZt6dQ7EwNgI*9Vna;ic%(0N)`IMo=dT;~`gc6T#QlZ+6OMDQdj8O0Xo6ix@9 ze{q&z)|zyL}7Fhv~ZHrR46DD(*8;W2%z0A{qH%yfrI9 zPaXMU@>FwQQCjlMxU?W+_l$P54ZixVTit}mi+38ln2BKcQY&8btoI^^lq4}$e{06I zq{E~<{z%Mi9-$R&%|!7^yuT8a6{AfGeN-FJH&)YEMhD46QM12Gay67#8kc2$@cje4 zmR8hxBv|`sWIPuwQoUng{x9oOr?t58WK3+A1)JrhJ(HD%cG)%zP;?jD-3@fxl574E zRH!}@8|<#$s7ClSAx}}R%-6}dXM+*nb??r%GU&8Jm^D&@WMsc!=4#`e<#r#dMR&e zuk>{NZkDN%th`vmB+o1+GECrI$#{;G8D5eemw_fAFMtH%>C;N19Aym{okQ@5j$o1bV2rfjKR9;Fsms_)hAeXl2mbfSaa!CAXWLZR~lf(ck zeX)M*BnwW7K#|w_JuW0DDW(457197|xo%?F|6QXKZlC*|lGfece>~tD?VJ^LZi1GH z!jzh{AQk+z$+GCSY1!y(M>^A_EeT&phEVS-)7T1gfG^{^|F)6le1N%Cy^3gdOpMtJ zp*JHUjSjueAM}o2@B9MWS>cy-`~p(JR;*@t{^WedqX}n>ns5#pCfqd@W#Af;d;$T9 z`HJjiL;*hf?D1KCe=ODb@JlC~r2CipLdwy3`Il>YF&RBmPml+b7A+aMih^9=x>6~m zQVU-~AEKsnvp-k(=tUJ}I^C%cu3qxh$vzFLOhwG+khglY(smONDc1%TLnSwKS9Seg z7Jv|!WlV<8HP^0*rtf>85V=m>ILzmkctnL9i2WE)&+`aBe~uW-n?R6KTBgAb2PJmy z6VirKN}Y123)xYFnaKR_{@zE}mz;T3>%XRR5nV815JPGyTjSloSaUA*S)!*7O#8O0 zQ1_Jtfq6la!01g}w7Z|A_&cZHF_QY!?Vn$6;j`SPJXKa?jFWzf4JjkMM}et3&Ok)rHK!sw*NRolGg=4}ixo?y?l5 zjQerbCz2*4^Dzcc95xICswDhZxE&+QRtH*0T7yXze@*Rm`oU!r-~W%Mw_t0d>%xU0 z1PJayiUoqZ7I$}dXmF=U(E=q9+}+*XU5a~gx8hEVwFOGs?|IMp&JWl#bFFLbb<5m) zreKO2sf=N=lA9+?F_GHe>_H5|5!7c>$}p8Te4y=*8y$W|QNSBoJ9})GWj^=+=kt?OG)bOK+3x3mowLe)%gG$*3A52B zDM&U~k>CZcRQfdXupsdr|6q}~TJ|*bnf@5LBhZnY+G)0w+UBV3R=>gQeWD%*;Z8${ zWjwOC*eVd+HC>ypr6SbLiSGE`J{)`F;B{x{f6C9=G_I$yAw^W#E|Np}Fpc~d>hcB+ zjv0-QX-#chVlZ_Ce$uIib%1;tgiRBeYuhA!>%-x!WO3~zRawjHCJq(xg>j}fJMx(T zJMHD?Kfk_qpXy2^r8U3HevV4CTWO9J8PE!6#-bwoDJ_Du5#_@;S(Nz>*yfG(Fv)7O zf2QWINUhC(u7%&@?2BpXFjQ5wZ9|m#^vm#~S(HFR_%{q6EmKr5&oOy9$}osQJ_NmBglxa~pchV8`1idRDRQ zXxav7*`s^LEzpmckMe_I)^Qm5w~4a4f06qB>`H?JgdG9&+Kg8T`T#DO=|W62z52p( z9g{r`+2a`MBZUp17&W=R73#DOAu0eeKM=jkfE)+Di!@!}n#@>IB+`7B%#rZ6IZc7G z33&HJ8}ATP9as*2)hTzSM)LXM{&}D?Z;?=&?v-EOe-*%+ZRu)8cv{9WAItM=pKikCm`O;Fes(}coUdU; zPT8m(ZL5BoYW9}K5j-Ts0@h8@ggj|yJ?xoJjYLNGzOHGvUbEVN^~&1xU#+JvM;p1{ zJiUTcxRFvsUoW|LEf^oV?}(%}q!)84KuW7D5_jV|jYhT`*=L?A_;Tgzf8gP$|4#Fk z)NZ%zn-qtpbGVHTNXm9rQK6dQJ(`JW(YI1~%H!YTrS(+I4fDpbzK6ZiFr$-gfu_4z z=NF!fB4kNHj9WRm>UCs)WMSC?Pcm=ve|Gye@+(Cx2-XzFD@M+CvSU%u{*b4G#|%E% zS`R9>K0v+oCuW2YA=03Ef5JybZg7-5`pfTPOu=dTA*QOo#(j9^Nf+Kf565DY>k3ax zkv~1-<~A2OG)nyASD2an<(+UOClyYpO)WQ?Dasg*r@hgkuOx5HPnQv5j=U-p!b5rZ z&S61jgKXYOi*~`G-V~8}%~@dVSn(wUDRxpZ4F@ko(D8+ZfH5aMf3cNIVxO36iZ;P* zGoU_YK4V*hoq*j@!HBNeR*euF@NHV;WA`s58tKj3E`=~fetX|;G-%bW&>+zVWLqUc zAB>O}ouIy-2DH;@L`bp~9x;hYS@xtzDRcZNXknVI{6t8@$`N+ySloLy3C-IW1+&fOJ*UO?$%pQKzbS5Q2^!Lgk`JD4%{e$CSr^R@>f9C-Q<~;D3|e6B|@J z2d#3Os$_DTe?m*Kgty?->aAc|jFPmrUZsamuIoEf+jD1_!iHGmXUYGinc7B^QwH4L_e9h1ZQ&?x zgpVHJENytA=dS@!io3MFdE+3#_XQ9_#WdJrA8$eye?(u_)-t|hT|D|hqtf=jRMK-B z$q3tp0JlwGfjcVWpFJib*1sly!c9cqWM1>p623r3jv9_uwxJ_8q~w_rZ7U)sIUWNY zpxLpHhV;566AKY%%eD6r(p&p;-Yt+!VIucuv~etkX{yzz)Xt*N;%D(|a&SB05GEnA z91omFf9M@ETc$m&u(K~%*0O?g^NOD2w&u;q2w4su=E?QiT5cQ@<=Y3bgfE8lwwlI7 zmVxJ;F=FBwLPEnOZ9|%(B8>hqA}IAp=4;b$Er@i}vx*B%wypzPa7|MBXyb6qw6R)m zGPpPyIv6;BVRk7kxJ@nQ1I?U3YJr{d1sP4ef4_!^fn9w1e@m;rp9V*=!v@_Ah?R8Q z>P^QfnZ^Y+xbci~ro0fIZL)OkNVlPcWJvDSKRxD*+eG;l5?dw21sv-^hczwU1^@TV z5$9*yGK+m{o!xi5Q|75AA^y8^bNa_~B6WRw*`953nbSRC>}kFCy)}X?7mm6mjQO@r ze|=@ff-}~(Qn~e2k;W8etV-TWYKvPKudEa0bdLm`;`sj^z}dP5kun~ruk#-*og zC9D}Q56nLGM`lF~hLw?fEVEhx6zf9>kA(JK@lJ2P_yCj;v$;K=gO5^8KZ+q2e@Nk8pk?-*!)~AJj;yg-Af~0GYn+P9b(+twrnkIeujclEwF>`*R*CmZphooE{66v$0K^B zam;BkMBFr7XR_4Zk>#T*Oo6ISmI1GO+}CzeH}f2o&?K_cXlvs{hpr13I&Aaq7iO*x(rr_8r>z~klhD09mj`$r=IS7awC8>Q0HAjd94hOjbFPQ`kroRO^2Y~Nq8+KwO+i~A04zJC7tfXJw{GfMu( z8q?>5K*!#P>op|x+A0h^1%b(G z)RX~l*>l=x+|791f0KLzs+9jJAi=g*|HIRP((qPlEBBKrBPpKunk~vodXS`#xZji{ zGbh(aZ_uIXWXgK5qQe%HP1UA@!B+OMi1wOU6BjI+Qd(j6hzFt=Z|fGmVf1_o)zf023`kAK6jgh9^Pf1dVwFcNv=gBh<#nVE-+ zoSv#DJxuj{&Dp!+Ie|h+TGoHFhJqtYr;(*Nd!Ry?1I13cFWboylZk?>cmF(8i}O|< z!%8~tepkiJNj{UwnnT(`T)0xBf+SS+VDu&xw!m(rqe}fE5*G#(i^HT_;=b19C$B|Z zco-?=4o(^EfBBQ0II84PHB}3x>>O}ubV-rTPwJJK2_8u!!gwjOqgI#MN6BJ=U7BG~ zxHPi>Iwja`uQ}A+=gis@o1OYggcvlYZ;^sHtIyJ;V3lQdQmI;b99)b20sWaH=!S9& zF`Rm6QSnC~^G#O0ohvOsTWURLpFHyL z{PY_ES{W4aZH$fk7=9l+^h4@Thf-hGSUtx^P)~|ay%iYwalOmOi%OPFs9C774h~3T zA7z!0U?L=+>&?R!Ld0U3Wk{3~2db%r{!{cXGGx$`bA;6);?zGuI}Zm8WDais~90R8OhLMNS%_Z*Di#-sdeH{qZ3SrU^LqaEISEq-Y4NenozPL-}P1 z`%FSmTEG^#T4o+xiYRYbm>~+|HKwaqDIh&O&uHbxXZ*^eN=DPktn9|?YFg5f*M?O? ze;{0u12RR0ZeS~8Yi*+LWr=o(-yVmJbWDphu&0d+C7a+v@gvY9mE6Z8e9;1I61E-_ zuO>H|T;Wih4;Y)y_5FEv3KwN?ProEoK#0HD%a! z0B6LO5npB}N#lDgwXdT+La3gQu~o zcD3JXW2|+=#3?x_Q)Hi{;a3!A*b6H^m=t6TwfQr;ph(QSphT$W<0oylm}zR;e`PF` z>VagdTxN5N3n8k+f{18gXP_8e#Xkxpsp3}EdO5Z>Gd}%sT<@x-DCDF2<>9QIzc7u?K6c?h>t!S6b59Ht0JbJ99~38`HT`*98!rq=z7!v()7rYxa) zSb)X6$dBNN{!bs$lJV2v@{>{Ve{v}ba*e}UkknyRgtKBN%@u{qqVjk)+8@vx2PTYe zAI4ZXJq7;z2OOrRZZbv^d-GZBxu?JpFtpx)pCah_GBg0=5{E)>QC(P)&ei z&1I-MODUujQxy$E=kTzsD6EpM1vFtjsI96pT~`{J=m>lJCG<5EQ;(vkJRVJK!EP{S zg!MiIc?zrZc2GSU{muHUe_zKS8YyVM>62uM)Iyb*>x~K$^+}ion5svMe2yyw3%#_h z8AQg5(N)XMP_J4m7L7?)!{Mu(r5%zy9;B`lgi-5X;DpQHB@a=A(N;%3rSZ(&jX3N5 zMowjrfVpQv=I*ilxOd`_H{$#cGMbU?^F`I>{(rNK(;-DCMY%)Ye{X5!uimtZb2!Im zXSx=xnBLk3Xd8ce9ji(Xt7N0qOYDnBr<+EIT_*4LL`qE>iLG@@iY|uTaRa%4?A~U1 z3q~%QWxbQ3#{NZmQdioeOGAwA zjGP#LlRzw^gPK#Oe_MP>I~NzKPKL%<^&|ED-X;Z=)&;GIMy*)N(E@|%PIFR-KI|MY z$TvjwCxMifU}3>gA+7ys_MMP!ECb{yY7G|WPfP%&de2t}N@_Kob^MC^GR19KplepD zB0Ght7?{$S?9Wsy?wDheOV<1?JEZJnbnvG?M!3adpUh^Sf02Er#{T9BFA?Y%#CA*j zl~X@aR`kya;a@5{%6(xiOZ_%(L-%T`2V_CqZSJlS0sm0ugHyw8i3!VI)Q66A!TqhuExAF|e@;v?@sP2r%1!k@a zgw`t$f-bd&EX()ZfxANGQCI`d#1A4Yz7mR_NM37`&qLA7`lqUW-NYffH^Vy7PN9_! zPL;-tjJRDa#p7L+(IkI^)Oin(DTdP^!OWbbGl+X(e_?Wx{@5suHi$UEluUyX0|s${Uk9I8UcO_cvGWwWc7__!Y}9Ra)Pk) zs>vI&e;}>uNSkYPD>GqYK|9;cF_j3(9j$>ueIj)Yb z>EiTB`E?s}GdrsuORSFhl>FoAr6LbmK=xb1SduIbeS~)Cp^mB?#K7C6@95n(OzfL` z3zOwg>daTcDBh4ED}u~gV#V(&71mtb`Qj=GfBdM?1^lQ*48mtCP!|VU?K8EaF*>*$ zWLbTM5FW<>r))>h4K8Ceo+jyX@Qp<>sUNCJG}W$Bqo1Bn7nWXpVdpR3+rN_FPmy8= z5IUfT;jIe7+OmumSt#K)hgJgxR#b#zvz)BV@^#rMgTm9)nexCSqVm-jBSMcvtPf-I ze--8w&0#}e)&a~FPhPYP;I zb+MX$J|#ra=q1Y!g(1;f%n{PmBC!Ld7&B~2R_YqVvb-c_JLF=3OLfE)c>WSbE%HUu zp;F6Hu{3!nM!+;?kLw`{Yz!CqI@=;|HpM-ZB^Ikzwk9g4e-g8| zyfT-z7Q`;iy-KbGnqqch@pCJEs=#b2a`QL8g(v9kkP-#Ol3XN58@_F48{#WRlAHPp zh!0*&YGSB`Dr1?m;LJI2zUa z#H0M#&AAPYzfOKTC$q_3dz?yaf0(4B@{QtDhx{AwDoW!(=}{5Cp(I&yaw+Si9>S=N zq`L}HSE`qB>a?+=AFu3O9|Lr(Hz7_xwXI@^>!9S@O4{OntK@UFH>}qH9WU<`v5XH2QB%eA$D68!v!v7f9P1uLn43A z2RgPsc#1rT9U#j-E8#MD)pw@Wy9vT0YC|Jp)#8nO4~LGXqLU$rvD8)U?HK_*`)XV& zUTC~)2#YH2k~83F-?UMT!vWn0r#5qS#HMil_XPlnaJ%E^3$YcR4l(56_#o-_i;$Lp zu|qR={M#omHegrAVI9FQe+{kVi(^~Z7Kmc~Iv7IEWd#tXTsf5@?3zPyaS+Zn4`>_Z zMno)=nE;3&yagHiLTbyGVEohGv*%&u}d07AVCfvC2)KtwYI-D=D(M zmAHur_qfvo z=}z_cVC?UWEJH~~%ak<;kmK-^bdbfGorb2S!PF70oq;h>F>}U^J4|%#582z(mH%F3JH6G=ZL~nA0YWp!{!3s+)S$rw+&2h>g4@l_g3|=LX8>xD5S1w5=F-9ra3}?TWz4KGDjk=a#fQ|NAySDxpaLIE4s#@0qPC{r>ha5Xy=5X;y|`7jQV8se5iUfBAj5S666fcbYwRz*J|Hf?Jxf ziZURIQ3V4DZK7gEda^cuLgxJf9VaC&H=IL8HO zNy-wjf5fyz_)pzg=%oA|+$E5B^rs|?gch0bA&iT$r~>QVl*U{PqIe6v4=7+3;p9mU1z;7-E+wp8VIbMiW_jdo5&bB4k^f4ql__0`U zf3#ycn^;4CA~u^tTP&*$-Xtg1M=YP@@jx=#l~QGT6*T&VklBk+NhT?ML%R51QMSYs ztZmjAI$u_A_m?V#aDok&>ITEcw5RDh!laXfRdSU3-;ncFKa7FWI{eTCExg%iK%<98 z=u}_ckl^8uy@4sADb=-_@FL05r?!S0e0TovRayLd3aBxK2R#|boAf}1nh zjHa1A9uL_>`XJ#d)DfzD9k(c|{yHHG4~a$A2b_@G*tEX*MR2x*XQD)ihQ6dsj%M0p#?WPA)A+ymz}86ajqGICFReRDOuo>f*ocLe-sj_ zaNQQh(GKLKc;qgH8hlBqU=5o7g2~1U&PvN!IKO%TOF*>0X+XH+_J?T0lhuST(3QpU zl%c}(@F79zc}fZ#uM)z95YrlVJDus(4k;4irrl6Q)OXFvrL(q0l&4-~AoMUFU|%MN z6%%utl2U+W6+{a$n5pVVlF8<{vM5v9?SJkL(z~|8wHn8yak z7!lccOqoBsW+3HO(lphjTzyl51R)9Wvcu@Wl=w;sl_^DaL5l>jdxR!is=`g5g|4d`dkz$>8UL% z6znB>my83<=o}nw5WV0s7L!hgmc^+rHip5aRL1ce2*)<}x&$fWL>BYDW9~9f21=Y} zKjDl|Z7AZQ=FC?$J}2=chCs?0$bUi$!G2nfUvujiM$$HF7*o*a9DD=Vykk3eC*%3W z(lh~)2IwpALZ1C3+*nJCP=g{>T*U7aA(p}&_x8{!&SMg-&xvK0_a~6>5Ut8zcV2C^ zpHu+T+rjZ!BvZ%3@8nTwjXuteNp&|c-hY$KU%l*dmR%*FXaZ6P)2Zkb7*ndpULfHPY<@Iu@vliz#72x0eg7{D@ElbSr6hc;$%4z+(H`Mb zmx4UKFcymEp8c{z#`2~nCoSpGhiBE&8K%Lmj>Hzwz#ql+RI>IFb$_lTE^v-tgO-I? zgtdV`{tYl2qN4?3%C=`I3H%5dPpSxL6VpYyH1L=fR5v!c!u9*&jgN8TlG^3Da^bAa zYN{<(1IomN;AGlamTMrE>`$Ha1&PXKSy0|15a*;ZJC#lj3v7aY(@1C}0Bpx;oh7!9 zUKI6)KmDdEMJiiSxqmi5WKmAc~r4FoMJ6sBHqHHq}^+$R+|T0BaH5G>eQ7UKin<#eX0pLv4-9>2~JzSrDh} z^IIkc%&!3!#^{x}-x|AsS!e2qXzd?vf+h!_{Kqg^pn-&VT#C(^+y03+*b^3q9$4S+ zFdzv;4=G=PnSb)+R`|>|b0k-27GdulD_4{a9+gYeoB;LKztR}p(_+j?VrF(SxJh{N z@T0x;JvNLn%Mis|4|Ga;SPc-4YFU)AS{CJL78Emv0Tdus8ay9Nw4OGdZG!rD4 zUS$e`nXPOQE3AcKf|DtAD(QHVZLcYIgKqgron_Ount#888R%0^_iPY26hHE;Yc-L`BVfQL-Vczp;Hb0KTV#44#G)U$vOkz{3%g7>d0(p z#tk1%vVXf@*Hn(#tbWjPttQsyb%Zu|gz6}$ENl0()=-wqh%;NW$H?`tA(_p|uc}rU zoUiGpukrR(<1-%x^&mN&As;*%q@G@4vZgB&{M4XetYS0Cf+Z`+V<{*Zm1V%t(6X&s zb8qrBi$tExhl--yYlP$ZI~h&TFmBIiJRLl0|9|!?aHsY*J;b3&^XBE0hAoTma{IkO zo-K0XWEN2Ls_>8iC*hNU3HXRa9iuJ|Eo`VGK5Upkd?JdVa5(mm3>P|GhdgO>$85bj z@n?eJ<}Nv1V%kU`14V$hsa;A)O8HL)#o2XYxg%yvch)!xp z^?!}|V2E_SHC-PaN7kSv1RBH78c%FsG*-%@fGje3BG*gY!**R=`j89t} z^P6l@fKfi`x)T!k&RC#?Aw^VulC07M(){w+vze<5F}i0(93hCk6j;_~&xQN=mU4Bl-;dZh!~3^(FqeB$bYEx%Cyh2_0d!WH;Q!1Wa6lB8X88IK*By~ zCTffak5=C;WjGf>l1g&qJBKm5No|NqV#3p0QGhCm(y=B3y_XHG_pCi}s#g))d`M*{ z2oV!TB#OPSE!~@leW#*v4UV?TiE@ucWX_U7pyYyS9iV2q_zTb23Y8%l0VXLoRDYS^ zwHC5mpU-Nh40K20p0|WDyf<6KdBKgEy$^52ct^ojy$##V(f{F|mw9mQTbAHm?{yYO zSG~PjB3syQQmB*K-i$Uzq|UQ)087K3UT;kLXshSz_sz~cy<{|q=%T7e5Hd1c=iO$K zRE3q62IzyVBZsf8STpzrfTX-iSAU#*;TBV9V_PJLvnnIXQKLac=yp!wrqAL%D8-Dj z!2D+LwgiZV&HsViK`Ve|=+L+TLTqUXD90odYk)P@a*Q@a)kl6&B%Xz=6>jjMhtOpe z3nZ226nZq{dM;fS6JO{)S|LXeNeK*5%XIRel9yn6onG1Ax)WFdH~>gw>wj<#g}kr` z{F12hOfN(!BS@HYsVTM8yab96iS>a@pb976MOPBxA6F{Ur$Z`@@oVgN+66lN{Hn z$jwH&Ja6ID7x~CS@-aHo0)G==l(w5O$LQ?YTjgQN2C?zNJ`T<??Q9!|&Fd5yZ!@kzf%~MD=waJ^puR#6|5mmXZapROp5;4Ur z8*DC_8#D*`rSogm(+_G;;BgmXBza|Gpb%Ua5}s#IZO76a zh_3HaoKNwrb>nwzWPkYm&r;HY_P;znc*`GpOSdLXrwmxo`_^ZgVk);Q>8?ge-OZRk z*PE;$3G+6NjLUJFWFB6UH&3qs0vi~9W2BuQSGo4+u>_RxV_hUj#W)8}Ub?YH^4}9& zF+P@P6LwvqlBFvS4mOw(z~qd5LxAuY{k_}maB`U^eR^%yWq%U*@*);8hX_a|rMRB$ zF3cO|pqG*Ku^=R`L_%p_ysyZU{fgO^pjm~KVb5w_)y* zn)6V(iRxIwi+^zforD{U6G~?b=w|zeFYlS?kX@v{%of-OkFzESfmB2bRHk7JGespR zU;QQPnn!qT1z2nXvRa3*cwUiObI>1se@>(O@I>PIzbP+j(gxm?__jNQ%VMX2wM_`P z=0=$@&u84--ewZYBw8$C5;bU0aN}DehSDjyCJ3d<@P8lrn2&wD&LY1WK3a0AXompp z;JUsWJSAzf1yH$c9daeZW^35z5{_>zTXcMuj2-+*ucI<-jb@85-&ej2&KP{YAuthp zMtlQol4o>q`-GF4Inq`D&6t zP@Oq9SAYA*NU^~)kQ^Kg=pOdM_ATyIs+K0+KwF0#!PgGTRC$X!K{^!b{0cS87S@md zPCW*=lwO`iBwJCNF}_k@>{z^=L1~>g#r2vDzDz?9>bzOfz?@dXsBuxFDDZKedSA`r z?7eq4UW7X75=+KV=)`l}uwqEo^0mPrJT8!-W`D4(%X{pI-XLH#<=6)&8pDUZ#rO@K zde1UeO+9h89)fHNm?DC-5|;BlPMdElo`WhLT=GZ(67Ll%zix?AC?Dpu$=e?zX4p2@ zr@+1>f~C3XH&W2Yb6(e3=Wvl6p~~iZG2oK}%uLV@e(3Ti@M|Dp5XQOlPScu+`s8NP z&VRm{MGkvbW1L>N&XVFn$ayGHcTkI^Aj_gK$+Hv6&6Vwnz{zl890&j?F#e52Q$;&E z9sCqc7L|FR-a>dBzaK5Mp82Z7ffvsF(}WZd=APVwg$HjqKCxlLi7(Fcviq9ex5mhFY+AAc&h&79~;r+JbErm`El5NJGHkRuwmv~033 z-P#dGXZBXz33L$dv$yOzIh@}JgFG@3S}ZsR?#_V9p^=VBVs$)!vG0}genERuEga8r zsDfb%ccGX_OHgirG;)fQRsJ$8iq=mIDWni{#2U-5lQ$;buepgJ-rUPDJ2511V}D^1 zY|mlNo|4h_ivZx|z8H!Pi{Z9ozrD=Y^c(3pw3TT{YMw+I0mKE^v_x8$Fdvpc5 zGF1ZXkc(PME7h#0p`uv$q*TbOynPx%OKCCauC}zc_BeKDri~&|XDB5~6)SSAr4YGX zUA@Z;=6jM34pd!+D_=Jj8RMl~q*E1w<{lu+&ZGQGo<-P3!&IL37o+qESG1!v3`U77;JtIn@UDK>RAigHg}Gi3SSfZGJuFrl%3> zX@e%6qrRbU=GI-zjhQbOo@m8gC-0h_D#pUuK)}{lib&}Du0t_lUNwswhcvN$^`i8r zYQVs;=8foy4<5Y#@f|9jXLh>mUog9H zl8%uPn*d>CKY}tI?ho2+b0~hdeu<7|tZRV3toc^3 zDQK+Pt(+dveFcuKOP`)x3F*=C^I&;1R(c8T4=qM*eK%*{%bYFLezqiay=+F+gji?t{>qmxDN5E+B_`E$IgctP$JX*AuY)cBi??8Mo# zOS7|U=+_2Le1Gg3XIDlv6+9sOB}10NQ*n(XSl1xy7D=I3?n0uW4;k&>;JCMs^73id zWb$`|tSU4V9(Wgwb~>;01D)5Y)TCNXY9g9=_N(IJjA*i?<%ch8y>b)IvB zrKQ*UtI4~|86?$@i}s|kuSL6gkJ}j0&UGXJxC*q zDjO&&wSRqzp_H*4{2koGBPB2+XdxS{v^f$<5EJuuW9lsghtSOFi<<=<+{QtGi2ru` z3q;S0fGre)8Hn5D+;K+pO-IFtgdL;x?AyOT@7xFge-ZIM-cGeohr@HKlyh|Vi-WKt zYz`kK?9`hLExbI0m$~PRJUL@CG+QOrlyJACE`R-MX@-l9jp><5{UmQ#S9`Js`MKU$ zNXvXt)mhnCCRIy8#cXtXB*PH-;DTRXtu!b3+zAcMv<6Umsbd%g8O6n;NIx>*`53R& zkMzcA9x0B}L7yEOgTPn0Vz;T`BspOQ$bP0(p~r&o3UTmGm(&*9JEHGfBI>YH(ra`aWh_OKDMvap>%y6`n>~R`(i^}~ zV4_MNlS0BLyB4ZgHgAh=Cr&a~2$;&m1OXP*IMw_%jj2d5%WcGiPbAL*4x1+jP~XUH z(q$K-;>LH=bY2yM&IvzgSQCJE!PEvu#ebRojA-D`=wv+oWT-PDkhT%KSRL-`9Ivq) zJUbaq&7$x^4v2kqTeGvOI|Il2Ng@wvYgNkZDZ?%?8ZR!zVlEWpFK74Ck7F}^?(U*r zd%O{B_!#4zEPxQ5&J-L`3tm@@2FPQ&rA;WaIRoLU%&D|oLFOB+DbB3uVdjzQj(<=p zK^4ch#i}bvoXM0)Xl;P$4XemF{1W`u6`-iL6FLsI_@7+S$?j$y-k~v_7$tflY{ISt zsT9{c)_zb|vTRyNTeG|$YE&(|jCE)}I6zrTD6S;@CQ!pfy#Cg*&6xmeK4e8CGi9WF z!#sZ>aOR(zHY<(=9VJY_jfxBUihmMf-g$~}&q3nBhsD4mhU|YodV)v^==hmkjrlhd z;(rb*Kkeo5E+qVkJlspAe8Z}!GQ~m8j>W(aaI8UVLyB!#RxQRhh|Fn0WK0kmF4h3A zb22|PDjOS)uXdAc*7-iwBm}1KoLAE>*JJc=oQRm~b6IWavs(};H)7)>w0|snS7oEi zL6g(-J*EPM7BCpf8y*F7DUzZ0r2WXn_qrS4pg%Y@i(LGGz5q-F=Df%aYdrr`y%egj zMX=UC5V0^|UhpKb5rL zHuernN-FjY3Q#|%3VTZyTW3QHR3fY+W??UbGmX+B^ygN@LXEk!ex92 zdvCboH7_o6iuIa3vQ24r8{V`~1SQDby7*g`M zD?%{pwkvEC?*1;ec#MMsyBM{ZWYMNHPF|B&Z>_o1W?+)nc<&__=%jVy*Cjm#39(ef zKm!Xa5Rl(oHA731XFQ_2k$TP1++T?bq0L1ltFjyki4e&r}8 zv%;;zFRav_B>Q($ngEv#j53ETYY$PuNff37vrOgb)0eBp^?zQRa=L>LM5`sB)f%q1 z)lMwsRs^bC*{oQrP5$vl;aT)apB&PvaKj_`zm9s;%JAcs=w;F+@0_P&$`7L;W$%$G zJxJZuj;-nQ@_IIru`2HN)Zkob@G6N1=@tuVi~J4BC5D?vf{~I8-{^h7g)B#}F!?B% z{a|UjVkBmf9DlSugj|>03nR>1RvR4(ywoQ ztSpbw)AAG;QMBo-N#SBes7T6ni{W2j34_|0t#fpoNwlX#u_B<6`Y2p) z*n$RWKU(Q^k4_9VcBfhs!;4!r5f(_eb;vx^BA{AHIDeQ71Vvd4vuqXyqi~fQRHbS> zrl^6;!P18~YZt%4cOpwq#+=GXG$)duDV8>5(M{A_Rwh-?M(D!q@}p+Wlq?4l>Y6=zXZDaaCnr^g>4D zhuRltOMmC^t=MoSzx}vETeI{UbH>7kmnuz86E#giX#`my=WF^IBxE*>v9liJuF+g< z?wcfLl{p^{ajJ9exrgg4uI+gD7I?G4yvnp-n35UCv=hG`tnI`#mrhtAijlUrh)%Jf zRcVS1-AqT%$x%Xwl$yGA(xL=`qO?&%(J2NqDu0fZO`+i-JI0Fl#=8Q0V9-Eu2Hmq; zGwD(`Cs+T2=1wtXp=I}O0a6u90WwvJLy2f&(s$97p`{xM<ITGwH{r?-sBh1adTaI1?zN1vEOm0RZ^NC zOMl7^Z@RnTh-hJ$N;Q4RkQqyj4ilTB&R1Q@gVW0lBSI-1Y!%X2Hi~eYD*ny_><|15 zmHW*_P@EJe1xemxU@5;MyAK8w$gnI`G6zebpf?D+4c^y8T++XUe%&4)Ry*VLX0HF3 zwNG@-enMX2a4deMmt-A|NsSVxc^fJX(toBb`2kz8ifTD0^HD1N^!J&1TX?yoi<{Cq z!ic|l4nGKp-9(P1cHx!@e|0p(TUvRVmbM}#eVbDRNwPS-Itt<0G@BU-r=o`WA&F0| z-B^vHA}J6eSoESSk(R&|fcmg6Z|0yX#wt-lTPJLhd4WZf^$S|SVzc3~gGsfld4ImW zo3&Rn^z?(0)5J!P(0_Azrj#&VHb#!A`|8A0q&(G)_=`17q>1x z25X%Vs)~mSZ7t$oVTSQA?z%PR9>PZ?*2|MuR>B&3zlkUZ-i?u}()$~r8dUYP=6pDR z;j@fU8B=*j&WM%oA5%%!$-J(gQ0HAYZ8#M}U8>TgRA)L?B$)TBK}E^GmeLD|RE5mX zEbZz1jdNXk2l)Cp+5^@Lg%nl;ZwidVM`SQwUq9m9h;d8LV?)%aOSR4S$svJA5V1jtWAnZ>+*tl5VeG&8BsPfu%}Pkth}A~z zl&7JCq0Tmx{w7`mRZVt+*i=#_k)(o8GHqlOZ` z?tuPjsM&o-0(H@ySzjNJoVIkDYv^_u3^ommFy8)GYIm3712xkm*ypQ;UWev6%1$*R zDi!1~a@ZY%I=;G4VdLv#ygO}B$oqWs$xc;vy`+!(LPv3YLYp&Te=ofJK4p$`B1Kj6 z6%PlB3eKTK27fiEk~*IKxtMwPx5Z`Px@Bf1omXqGX2tB@QKV((nf1BNPoLF8z{C4w zb(ElFqpSj9fab%{ww+?slB3tDA@S*}iis!)Lk~qoqvevSM&8kpCjZwXzY8b@%;cbMv)Gcd73r`39Yse`Mw@a(?+&$RtV$Y@qQ&qLp5VxiI}!J+LTWU? zig+t|AAJa9#CINkU@VHrQ*(e2Q>BF%U!*UJFd-EwN;$l3gYsoFE8G=~m6VDT9A@yZ zLEPm>gnw!8@DAM^ec5)_&Af1A<#2c`1jlpVk|_cD)nt)SFwAP;CY@2q2YIps-X%(C z;|-wDFNSm8-#i;WdPui+$TAZ~(FWn~cVSId zopXjAT}q?jA=Wn(4A}Objcke0Lh_)6QoW`m_kT15H0GZ^oG9Gpss&(e$*cJN_Gt(& zc%hNnNKuVlNr8!+1Zf#iW-jBhXiL>Uao1+VQ~Wc13Ntlxj6WFap+-jKLVwQ%YCl2p-Phc+^JHc zXMcPuAL?qQ0hX;A^ypS;k!TfGZT0rT`! zi0w&piH@~|>IbWAYaZednUo5LKIKWrXMcNb4-Zt3NW3}f&6 zf2=KQO6L2-ZXrbUYFpm1)PU_dAcQ7MY$PUXD@}7H;nFe{OP&$Rzk0t9n0|5Av0zW* z$A+cG6<8GVGehDKL{}cU2L?v*Y6p1$+V4f=n@*lhQ|dKau2kOUd34(tl|0 zpD^2qh3)C8lFUWAo7jXaAeGU)sr4dCka47?U9L>a0iifr(r@ExDI1_NROQL zS>``8cWYcpk3jsY?I?JMv(cdOBJyc6*kV^v_khu7nWI)Mb_bB$EE7^Lek>L?XE|~F zIrk9hs9a2MQ8}QLnHFrob}pU5%74AGK&5v}FU20~u+pl;h~Q&EO+kU9&(Zcb#Nfa`|Pzh{6PPYjQ(>h&{p+L!2z~XDhs^x~*l?szN8SC?!-PHitFWPHg`XazV*L`O> z%>JR_HrW`^T4QO?$}Wjgq*X3hQV~?$!vFdRxjq6TIBpWy2MmozgU-SKRZ9M0zIwF( ze^~&Qje$S=Ci1yy@qu%AuYcnxGE--0OjRn`*bokK8OF9_uew6WQaQh09Huld{brF? zm$yVS&3lhN(lp=^eZFMUfI{QLz#8a1;p(d%h35OxG&Dp;_Zv=^(KbbjVwMZGb}{B^$sc7N2*+2YIGT-p7w ztR6Ge0PxaqFd|4rix}>xy#!R)3F$cxN;q4KzT=c{gyFMc*uF3Md=8k75E(tdi|9s% zHfy-a&oQ5J$B-~`r=AAVeTnG~;9Deu^Piyyu!JMx-D~*wLewjdh=?j6j4B?y28mJ; zsH}!5Jgnw(kZj5|VSh%~RZ=N=yyt}IRvP77q+a$MT_%wt-nI0=v3X{qkp}sjXr_KR z947)!#qA1`xlHl^z~r63)-dz=TJ#|&w-Rln4*S}=KYusAlJNx7{pK${vN1|@ zjAbJm^NQ}6C~ge&0G`9b7oqn>XJ?_zQl}|EWNor9-Jx%&VhZ+>l%Y#A?XytVn z%=NP9LsV$1j?^f|7AdhXJf--<_qc`^5_YlL@V(l*)M9525E8<-A@D^Gb1PQzox>DI zXe<}Uc`74M8GjJkC)Z`FR2GjBFLxrIFg)YbWPB6XCPQpdGK~|%3&ujE5f1D4B$vMO z1h`nWydIE0F3>$7VWue3CGg@egktsf&{B$iBAj~waRXRvIwqB=v|UDHRoQir3+@#M zed3Td#%6R@rDc#{`)oI%KtW9SkcinDM+zE}72Afb{C@xg4#SiiMrA(d<94$Lb=Du_ zAF^m1-g;ZBhVMAMkCP~pELvB#pEWYd_!otUQCv=!OahAeZ8}ymKk+s?XGbpGtl+cN zXs?z0qGeCiu3^}$3%2P7XtexC#SQe@_Fd)ea+6AnX{D5vs!FPTji3h3gRx}TKN6Ap zNqUdFynh+w%FBll3Mif^+3@hG(GtjVo{`}d_exMwa^peI>fGcpTP&l2d$KYq=RO=V zT|d@QS0q=6v8KL5(J{+I$32{=8nPje^_-_rCtbnq$RChlZnnXp6PaSv`C7M|q}!-W zYMqS3eXhM00>Z|IM|okHdpjA#QdvYIx-qQ!^nY@@1l~dx2H!xpmM7_m_!&WF2W6Sw zQ#}3?qI(CTG!AS2?)mQxUhvK-sVT>#f{!fM?nssqEm60GZ+#9u&CfDOI{38s`98NI zi$d1Iv+x;?z&vkzOgbId@G_C0se=#1$=S8)*EIrhHiu&}dXD?tC?g^_HlaCcY{&F$ z*?%703^Di}TJT*uUUp!Qw|A_3KfdjHi8(t`7EDnpn0>JnLJqSrC}WJ0L9b%5ohtVPJ`(&c zlQY8N(-?{2ZQ71!1KW>N9Vf0|Q{Hi&0r+~>qW1~>znU3Dzx1p9X35kM{`dO8lTn(o zx1)AmtzBflb`1t_jj#`Den3m#eXvg z5uOt%5f$i-I|*4BUPl9FU3=8PiZOtN29o_|CU?V(yuPk*w)j}nXxAVot_-wn;V&Fk zoe{Jz%zI}^5`cQeE2})%Og&pt*R1j>dJ2aLPqU0(DnH|9kLd`o{HK%qB1>hSmF=I% z`N(b+dy_^66} ztU-?zd^z$)0@ih25*xU*e8v`f&JVDV3fH7mW;+3*a)(Jxq_8=fs}DDo2F}kLDuI>` zy&LN-O`5FbTx?EDnAxI`kLa!^Sv6hbniib2eX#Hb)=J^ep3-- z3N)l>MBPG{eZ5}DH2L^0n|~LV3~Wln){E)Fqw=61l{snLA^`oqFX9<(!NxPZAYk=1 z26lat`7U_P*xvX(&s>oTbu2@o?hsg*ejvG6W-sh^SYYi z>CH&Lq^$F&Hpkj5=St+CE&Z&g1;D8bVD0GLRfzW1bfm0|S-#is*?+QKA`%SVm`_j!U3ls;6ZQKd9n69z=RMq)W#bJTeM zKK`5$9T5Ci|2}A@bzS%@k5BQ_%631oYd9UwWpS@TEEgs6Gmk$L2HHQe7$&Zq5E+N-XkC~?diG>f+a8Y?BT#qqPhm5gIcKrFTUoBKScV{?i-n=S{+{NW*GpLIWu)CSu7 z*dregfPZ}~^GRjtE;{QMbHxu}@?R##R+${UJZLGGZN2)WzZXspjLeX}DJR?9*ghWj zBOEvcFU*5| zF_MkV=r6roWWArmZ3g2AABlj^j^}s3xz9%ZN_Ol@vEzLkvC;j*Ez@0DwRejY<9`pR zZ|gWdZcBgPB39MNfd`-8V^@FD;wpADG}LJFUQ#yTgGJd+gG&-R?r*bs0ba*|StXW{ zlIBt0<=y^MU7xR?e_(kJ0TrWXGF=2!8osdE)uHTQ8ypm0Ke69Wo zbBW4#$76~ilY8y(X<*fYfU>4C#ni>NE^!KG{10Q+N%0@fWu2#w!WCGZqLuqPuGzuL z(o8)rDz{f*;btR;6IX=@xV(MZAKH0>N!4b7{AVa)`~BxX;@|xfeWm#erhl$~im6Dn zY%B{f`QP~%wjkRj1lMsD?r+WL#C@EiWM^~`^UHoxi2D5bm=qj$qLS$C8&VgJd*cQA zB_mp?;johIF2{w*=%$~I5)8CWaQ@hPO1<&NMbx9nwix1#ZDN++LSJjLqc7TUKHQk{ix06(Aet&W|@Q{v>PvW~sO?AQN&vxSoZ4*7;#@V(oi|WSu^5@sr z@0C^q>K(NlVd4i~tYFJF-bpJOnbY%1A>Un-0U;(Iu>+i&u-%Mec@e_Ehj(~Zy|=}A z^o)GXUZxxxs0sdrJqo9nK8Bxg8@#jBq;tY{c|HXur_Mf)SagnenSbYnSQ>Fj=Jt-+ zqRNb&H}dCf&~28~KA@=6$Usv`jOL=OjlPHi0JoEzgAsV$oy=vZT!K~_}oT*FZLRQW|01c;QjlzWB+rM9%2#B z$Mg?G$8|a3{QBN{N`J=D+d|S5l~$U0=519XpHvYX*>>d$!l>@I&lm!hxO@Bz6{eQ% zww_n&8?}F^7>8MEQia}qAT~6j+#>_(p2f*emhN2Ll9|cwOUHS~5HV}RAK9++57Wzp ze8y7~?YP9y7lVcRAoB`#6={wG$VcTTaxi8EdL49ao*EX2jenp*HC9R|c}5TQ$)u0{Q=T3(r6}x{>BTYB`hJ{&H}gHt*%f42uqDsAx3_~jOVV~7d@d2f zg7>cD9w$F1Hn835T6V>xnS0du+jpZMOeS9h6s`Hw+J9v}x^oBb?5h&ieY1_~XXnVl zGf2hz)|Sd#Tm;HcR_sb5mymoo1NXK3wutiXtp&CvfzK z?r*QliYr-{hg|xG{lLkt~rUo5R47?DcL5ZX?PE^a%t!r=lv`kAPC)BnBt` zsDJ5DT9AN6_=4MOcWQxt;%Ak#zT-Mr#p~3!chSQJOO}j*iF_>M+VxHvd{{4h_5Hv5 zoZXhD$CWmu4tm$seL{c^IBSE?Wjj{G{KuR-K)9-J+-!(tIq%P;n8q;4 z6Sm=DLa8;D@kc12sHjUY&#Ry*$b9bK??b~Lj%j_SLg{MriQ=&%(0-CU&rni^gnyqs zqv^&~@>o;wB&_4IgL?n}RPmqW&&ui7_w|25zszoZdA$ze)ct{#f7j6a?Pc%Rz^}~D zuktjO>tS7CucvQ6KM#`*>^Gt(9En93kl>d4A>tDOQ-y&XFf{{%Xj*Fao z-MiksI5+IvqQw_E&wl~){lE6M|9Pbf`+VFs{nVTBTNq_g4d);xo0O47WPdW^d1kC& z$J_yKk6Ie%)<5(2F7eaj0Ov>7Zd?=sxj;`#8oA%>CU~z9rBfx1f2Gefe{UldCGL~a z33^X<17M&2+u_(hnNFad7a#@i6A^jdfS9ks)f@P7Vhr1({&>uyt`C!N*FD8M;i2>? zw5!vd7LT92YnfF+Vo3=uW~IQV+|&z2IpFVwK5}tR5-^t&%o+oV>O-XH}=UtN8Y(sMQ^xUs&2r zyvwNnz1=KInEX+6nV~*wz(up$x2^Z!G0PL=wawOq-Ng?(4F@5DdVk(iJigA(Mj}4h zBg_p=?GdMSAeLGzw~F}mi_yMqlCcI9xS?+)b#~ z7*iRi4KJFS+`ox>PqqSJU#U0tJ*Vx&hq)z}Bz^vBoB#DL`Q6I#mpK=}_qL9HFABWb zJz%}_scu;`{)rA z-C1E)YDT${+3B@`mO|3`Re0yItWPk77A1wp;^Hut!+GE-x zkD`Ev@tV`XD8En;!$kKtNyk+hZQNd$F(K>^+sU5|);Q4l+IKUduZFPy_TKUzF?qG1 z9#OUJ^8sNO%G2Z2W{IolJ~{eRneWm*g#_`5M7;lnk4^RkA*G>P)&Q-h(Nzx~#CC$=>L{yrW*k6-xx z1VO;yrXLaxA6utlwiFq=6plECnDQ(lcC7fx_LLLH``xxTRgWr z0hF&+v?3cX)bTE1?8fE_E_*vT{s~vo)qlBUNvKP+zx$FZLRoPb()DAXmDV?+S?P0a zB_11So|DMV&e6Q(c_CqUBZ?k*E)LVx@(bmaYx4}-N1*uh{{4%@^={piSyRRSSO9&A z;8G`x*HzIx`Jt-JR(UaHUgcIXVA*&U&yO?_8>6bU& zm{}v&2kuAQ6;h9SQHu7I0lcrZ7Fj%$u`6p;R$HV?iTsl0QMgQ+gZ z73mK3z+>@8Y+TW;M>>QobH?`0a(u77p*9y=TYv39qYT`SiXoVr7IDV?>)({$(VPyl zNcK|6JJCs!8x3u71TxzGP@edVhcr7SRlze_U+d7|U-r}TBEwc!tm*EohmdzAeZuDR z`Rn|rzsvB-wv}`mk7o{@$QOF*I}m^Hm+{12O2h!-$3mpU%8LkkwEPd$4(^-APk*ky z{(t-H%O#TVwsQd6?`zPn<|xR3!D-tS)(5;#Pa{DT-)$!?B~8vM+Q>3^M@un!&2WC2 z-2DoFy?h`le3Cn`PCLLNnq5%{y5IEwJXgGfm5Z(}$eWSvkVUUU*lthimBG8vV`)We z`mk(e5HFhO&>$guxnXBL{-QI{w49# zt8B*fYI9fqe*;*E+Nja1KcQ$i*B#zH?OTh=OuakAWB2FXzn4t*yj#vAolMz4Djeik} z>;uk2T^~(d7227yX`n zvG(cxWv=K8)|7FZ^=2~7+M$3>P@T_>yrkC}N{^3sj`>vs_f^neiiXeJPQ!E_v%+pu z>wnDu{deu(^kN0$a`D=C0qoYjRewKrezsML-%M!+w~+9XPcjD&&X6G59Ci=ge^@;I zYS!3Iiv>3~S&6^LY8HlCIr+&wi1SW4YTKxjS#jgQI^$AC%#NSyyepm)%DfFT0!De5 z^1y~^ON`d!Svo|3dLrI%Up24EXoeaiC6cUY0fJ0QjUtkeu{+YwPpDUQRexH7fN>Ib z-U+(3`QV?eu5dj7G4At)_9|@mi00qZbgD%UHa}W6?o0t1fWEGtCRJWF>LN7eml|lk zTy1;tQ`v3nW(c8K`9SS#?hJfz#FAF=)VsvbBQi}hY#5h}7W}ZJW zV5OAbh?Q(iiVz>~&6LeR`YLjxjIy>(3u)PL>lhu`;7Hs!5UKaCPW$`QjPjTI6q|7K zzLY*%s|iAwRXcs~Ep_=sOPYK~6Sv}4Styvoe`%k{i<%xMVn4s@ihtryU_O^n!!0Qa zH4W!vWng7S@UPyle|~m;PIpaFD{%)~6s(dic)eBh>K7LN8^X|F60z?n0(I|~AIkla z^6#1E-$-Xf$&uKFvS!QVu1_t4CrCSK_ZvN77!Q#dY51Tfy&muNf3$=l&qC+mLx#Oc zFp>_V_n09q-GCFV-=J9av;igX*? zDZVJYSD_F}TE}0mmK?H_`J17`%&{bK29qe<&Y>|l{oUrtByODrNOi5D=nlNX#1(u8qu=rKQ<9L&@=l$orvhut)WOgD96Z5BZYdPh^`NB`~lCs zt_nR;1jd{H#^JlxIXV8#F&T( zm7gp#KcSIL*eud&q-{HX*abgbuRgZNiGJ^Uh?IP_{6zoLcs?M5(kixQfyVK>**f`` zY>aM2RqJ}?0v9g0`gY&dYA4jg|tm*=vI($fu&!cm^xK>pFC z7Ior88?Q1P6Ae*-wLU6Jz7VKN+Y<9-7xfNR`|Zf=G2v*4N_q??48|z-yfQ|qB!d?Z z@PACfEpQ9&(<;Tj`_F&;j}d=2j*rccQg$f=HsE_GE39po)?Iu6_4M zWyy(-+rEDS-vRlyiHcn5a0Zh~ccre&GrX%b8M`4*s>ROfYVYIs_Ti<>fyZ*dv<|td zKzU#Cl-?U+ROK|`Pe>NFI!oVxHT_ z7ZLgvul(LnQquIKcAiDW6$en?KGGv+u^7&a|1y93yi?U6%wZ20sS+CplFb@6+sac6 z7c->Nk(miE#CX@g8~@)FAW=8fN@kIoPL0RMwCa=5t;L|;4v+J8BVbl5X``|U4K-)% z+ehWPjqqezB zxoCe36iB-^lZv`bX8?mp$SEvI%+e(CV5Q$K$CLq0lXQ})Au}A1+9LDh2&u4R84NVP zKAaRSon4gkFK@qI>3PCI|$0K%HC9mB2e;D+S#OPFBwKoQFu-SjS z*=TFUvQt_x)pJQvgJj=^VIR?<@XSWJ@@Q?_mR>F?zq?P#?EB{3xXg1^zXQl+6*q{@ zSZZ`FuK@kOEC9pl2@j$`M#^*2-0O=#0-N?NF@w)7Gq$XnxA-_OQ7_>kohyMx zIUO@*3Z<(|d2VAfM&-gRil5>j?z8B z9<+ejFEa%pp(Q2HqrU>qv|_pF$P|&6V2ZU6ZI}}OCV~y{E+{hS<_1zZX7x^j>#i$o%JC3(fA-^S?fOi_6{lAX>HZ4 zHkpv5(R|4z|I^>+|4}^w&bfb~fuqyx!p$p8eJ?9Kx6?cz*bi$Ywu*FdG%)JKgr^NIn9{69QOqEc$t*@oYTP0Z7C&1ul?lm*ZS1CN?=5kc zkl%00v|J*!M3Y>0X-g|}FQ!?Gl+B@ZixE=@`;3#@gYcEkySIA2vG#wrQxr?@|Kn_# z0oy92ZFFBYKPQPO_Qu`#vHEOQ`R#gQ>DBSQ#dSC({Q2+K-(R0UP5p$t_ds6vV&=+? z0v>f6Vc}!^BTw7=vcC25A69?E+>>=<38gNF$9__8qYjpPuL^_aS)(+w%h9Kwlxqo} z1u7g1m7!+WjMTDW6qtVqL`DvpH7E99l8q0|s99my^CG%5&b zW*o%=na^*7o26bo>q7U}RYUJL)psu`Ip{y`XShDinC_Lp^bCI!t!Sk=Ig?5ke{V31 zl2GF%VbojkHIM1Yezh#s-3bHS2GVKX-skE;TKk4ea6K4~L+ms*F@PxC0|Lb|4zIoz z|C9RtlfzzHj+Gd-C`Ly~CihA53GsW|v%R*WBlWSQ5O0NH`MwDOmdotKk>}T+_<52uCzX1n23OAF?zrNgrg2-ie+WooS(m%nOKW z>S0GF2@g)%uxVf^(k~l9MYNKmQJ?6>KDsb15L_j}s4&ETfjF&70J2qOVlDzZl6&Q{&MnVp`&jO>FK-GEv6ZC}{IH%NHeYOLyCtR5#KAUW{#39z$gzRc) z1@OSbB);S*orU_k&{WRnNGvQsOjL^hQo=;=>k-ZJVa@t}J4lT?BiCK6*PUYY5Kt8D z{$zhMAN}{{{ij^{fM30PKREX-&y`T7l-bV#n0?;Y*H#+#NZYb(PEorh#G;(??_>Kh ze}rOjE(iqX)%JYQ-|`QM6;fpOXB7J#bwtQib+&{OkKgs9=;sh#uolp`($`OGd1A4t zDv~2nXmC;)T@W0BvZhP=G2ApJWdx5dTxx$unXjoUJ@2I=G3OYMH|~X3@|GhJ5@NG) z?lYTd#M2o*hCjX5otfHAphwg9`B(pUfyMo{vA2B(IC~>q=BwvH=lwIhV6mpLE%3&e zQscGI${K;uqY{(U^$9W)+?Ps1`g=x<#SG#9Of5tqzWf3GY0YQjUWj#4DhR=WgE9mz2-nbe?_Tao2UYQM_ z6l!j{0%RX(B7~TNJ%rR=66vNU7tB-A zy(H2Rc0J6Aem{)m`uUx|ZZOM+Ll%ZPDUgSarRqFG(*@v2SO4 zCLDJok8Sx7&Xm~v)^A4ED{1$K$htAF6+1K~!nbYmeegqW%h1E$-+R9#5_^9FA|oXd z5{!nc>0F0L4Q`N1Nq{0O@3&HveNeMLHM7Y;+D?c_M#aN)A&Vysvk%p2UNWG?Hy6B{ zoxR3DK8(S%g~9W`)DZaH15+a)r|US$!oVi%gElL!SW;Qq&mm?Mmrd(fU|Q2A!#iCm z_H84%oJ8MtBwRB~FR$E73-R zzf&e@N%KC)wnqhiWgB&Jx)y*Bb-i5HhNGF#D4i$XE?_kcDI}GVgVBE>z3iCfrc6Ed zy)xAtDYWu;yk#_EzaI+@47fc*Nqt#ovoEG?FlHf`_TZI#ZT6q86h2m23XFL&{_Ezx zL5Ddpp$xRWx?ZN&uU>Q6y{1lF?g7N}N`VQ}@M@WZD_2*zm&U%SA)< z56Yt*dH$4#^dd^Y9Cv@W(Si59Kdqo&_f2ml{^#YM@)a(Ag(o-n;c&e1CWHaQ%VFHy zXIZhKru91{o-)Tx5FQn64SWX~A#UxIRHo;ND|X(Cc#DWzLGTD&8za-O&1C;n;5V`D%i^3fj~y79`KAOH2=-(U4jcP%rVMCyVu0&HD5H{7uTwv zBg8HIla96U4E}%Dh$l%VDee&~>pw_}hWS>TxOZ#MwNy6(p;yg9CRwQw#m@T>JwfMVlBo(S4vK z*%8qyT~6P$>WDUVh>~nIa&qbKN%RQ_V7M8^e=eTDXkYEegM44x&=aGhNhV=*pELKI zS402;rjmcV9iFGu(qaU_!HPUT_8AgR!QMno^3zG#R@0Evp882Td^4a9pxn^M&7*eL zodB8-MCZ>ab$}qQ)Q$`A%7f5vNgDmeNDR#uy-02*`K7Clvm%uqC6Zuuq*RkQ8JH#e zK2Udw$VqgoZUFMK3r`-OxG&)(W~@a7*|1HRlx2VV>+y0p;ct&P`s@$MQ>ha5-q=lJ zwcDm&Ukv`Bm#IX*7k(Ff-*J0EqSgxNlTwxJ1jE~Age6oTyo`CvBfI`#0y-?Ea zU>$#zrDaqdet@Gfi941Bb&+j_Qc;GPqGHlC7mlSI-FI&OTOpKWQz-jH z&Pm3qv?royQ+!bu!QI z>ApD}6=xWIg74T#Z*8+}`1wVjtH=T*X7d~}XOM6z%>eC$ z(irA=kz;_`^)JkD24J+ zcD~4c;GtmmB+*#1i5Rbxcd|tC6SzaE??Eb`Lo-BGz{-$+AQ+$@-(;m!<-eo^9I(3u6E{bZlPJ(@jX z@XifK9YXY{#P7}dY0CH!QMknLHt&D(z7sB~&?!pwlefPFT>Vq^jH({v2#a{u2*l;A zswaX2ui7U%MGr*AoPh9iFP@Z5#D7Q$7)tqP$+tPNZ*TIHf#99yt12uLDj|+S3Gvp^ zqb0*Ft0mcj*d&K~vL2~}X2GZd8^i9Cy z8r3L9p2{OsUJ5;!#*DUK&t`v$RJAjR%G|TkmQmR%fITT%MKwlOIil7L7GxgRn6kS_ zeq+dP%o@y=uvh|$+4~7S_>&>6cz7qKxR4SXR@vm-LXsk(Ss)@6Mp}GaWD;XTf{D2| zB`h|)h0lKCjj%gzIn>nxSX!SwMJ)8z(%5zV=C4c#<~l|G)qhVY0Qi5}bUS&i%Yqj~ z4JFC)iscfDat6jNt9NbC&3nFW^swqID?acIQmjxB=sxKXIX1WgDCf`eB~LSkQ_?rv z#H6D80BlhX7{^)N@|W;!jjFlJTKMm8d=uFznoT^9pI*(JbqQV4c#x1NRUKEP8`=qm zF`Jy(pryy?W>DCNFU)@zQAWcopAp=ZJ#;v+oXVvi3=yJa_O$9vkzWI8evZE>t)2fR zRw#W~i*gxL>p##IVXP$=N#{38<<|){>NKTaFm^YFzxxfNN6+bMnGp#vhVLOzIJSnZ z7TH84{cz|q$}d7O3*4zQ+29d&XBgw_(b9yvg_9TGlax3(aWsE9e_XNv_lJm}S)$ZH z!!YJh%20(#p-3VT()>S&TgW?Yy)MUJc5!hwHm4$3%SzmSA3xa<&eT%64M$pBzjC4= zk(#-~H4_;UnWcsmf-6wVnG)yBz5L>w@K3QVb1*h2hn>t~5^nIVKFpZMktjyMe8D=> zImO!3KK6Luqlm~af zYsGWV5}gku!qJMPXT71)1j};d8nJn_lmORe8-*}Kek^~vYit{0inP#hGlixlZe7WnMi2ShW)+T`+EFgCW^FKIoZYvCv!@i(crQxmGD~g5u2Ew zPjl<%W~6^IVMFXTpJjJd3m6a0*B0G|yAP9lpOevr^NARc3&D6S4Bkz>4C*mmCeSrA zIsF{H5r^GT{lC#f!e}Hiu~}+{!W^tA^LU>Zqn0H?d2EYu1pz_dSA5yh?ie!7N_+?D zFSKPQ`MEco0o@Z=j`jdaB%KM40Jd8;G{9~SnK*yfww3B5c5#}G=P^SpzY5o{KASOm zKEON}TB>MQbk@%pK5}!3@|!Gy{9TBz*l&!IMDdjrI>_=eAtJ3s8!LoHP$`YZ!ff{K z1oMs_U%hF6*fV&jbr=OO&D1q3&Yqg#VQ5c_k&_X!2; zJ4b&6?y!+M(9zF7pIj*%pRSF95g=527Hb%55 zji?81#<7=YkHK3^2Jf)i=#6JJnZzG2$MpC#TmFt2dTYpb#H!i=+OKJZ4;(R}(KUbk zEO?9DUrM^HNr#r+XsD3OQy|63d>5K<4*%Ll>mhedBp`7&`{lhJ{-lwi*V3$d!j#cy z7xuu9q??J$oCxdHNX{4;;v&?Da!S>9eqAdWm^_Zo8Mt6+o&>x2I?6Ilt{$n@O@`K9 z=_%VzqxZv!xL0Ddnq8e%3s$!CkWsGWjxK~9_aT6_CimQ z_c_F5J~_9&4hJ`?mVGQ}3|06h6RLo-fUn*&M|!tH<293X=6Z_863V)rH8VWyvwLvX zvDN%H434nawrKYnSIN!?j6T!EDGkv`9=1`_zrsti0`32-zgt+?_ST3ejP!s1o7|g{ zEZ&$ZwO1u3c$XzNrdWb3JsL#|g~{T-+0ue4GSE56-fY|xlvG$R7r^dGcm5p&*9@G+ z)#=@s_d2agFr8V^}|f3!+%6 zBdS-5b38!EXbRp)DfW()n_(wpRO!K;b@pqXv)YIIb?P1tEKw-06;GM=&lEUEP3eP0 zfZd>|nTUZ2+PkGYzxae=;*V)RHe-CmZ7HCQ*Q_xJXmG3BY zqubDh>iqDA-sRv6pi<9OgEa_HQ|uO$SgX<}h0+wWLW$``?3z;mc}A{dsah;9_3_Ba zR=?TeDP>(zti~IPAf|sM;-59&<^28T``OyQapC2KY`{j@6cR)OHpv6OJfriqf^nRX;EKlTiYHwgc$!h@ z)AP)`ml&ZWY7QkxrnAG@EdoglT#-pY;h0ehmyQp`pLdG&XgzX=YVZhyFX1AmtD~lGZ zM`Td-sS)4;^j%6<(6gK|m5|(v%%^55-MrL~Uepw&Us4+I&~8TSmyTaYLmc52q86pP zEboPRG)O*|(dd7ZudkCDo7q&+tBCdT^`zL#6_)c45Qy7#OY4uR>=GzoB3NnJp2Cbb zO|Yvwz;uF#aJ1|b-i{3&mYpqwc%!*kljepvz|m0%Q-NP-Yi3B|H43dnL>72J+a-5s z0okApF4sU?)Fp-gYN1V(k*!^BoTj>EXe4NR*ULut`4!vFV_X? z(r!o>fOst{6NH$bx>jcNbz`EUfGB!M>}I6?Po``ycXz0MWPM4rnWQk<%(eZCRND+4 z)~E^8r|0AriqA;aqm0rlEYP>u_pza>(lnOtJQ8JOqcN5kKj0Y&O_t;pgQKimQ1)Ld z4NwBac8q@&5B1LXBrIViGX>*h6f(mlTtN>dteA%ike>2pp(&ilS&Jm3P`XGTlOSq5 zp>>=kb_pY{lx6JuwKW2q;|Ig1!lbAavX-GEjd2%i51M_Oa2xC~V}NVFH=-NkwCZ4} zZI8Fm1dw`-(pe&>=O$L@fS( ztYm#Up|2-D_W7ek5Hf@h74+UaHbyfPDOxHHcb8Z2wY?jD%m!4M1&JdU@BDt%7X?QB^tOb6 zjI_44pEqX4M`(Uhqn!{6+Ol+)O;2(r9N^JxVsd@@HND30RHwse6E0Gvb!qL8OIkhP za~4w3_4FLWk_L2qofdaM5FmA!5=7)mO)S_;>R^eZmzr4~x(2!d+8l_CDA|+CYVm(F zQOZOckrZP7Sp5Ahl_MY*B54=8Hy<9JOb~tWTg9k3k&N}5{@eH6{mLV9i05vO@|p-W z#CZMd5Dob%v%U+9$iP*t%HiqzZSu-|2KSWmcV9&GPiCVM&(Bb|q_e!H^oxWEp4Q)e z+9lDb$Pj*Yek-Gi$};q%BQJalyrzGQNDnzL=i~|1B|@+jA7%&aeNa zdjzHEO{vPSfgg@>Pvxb8{K$VW?^XJU_f=4*wRF4NAMNT?`FEXC2^*WP`3dN6n3%m5X8mf+SlqnT8m-gigF#Al~|}T zVGlzSYsyze^dDjimJgm%z23FuDcpL|RASjt6C+j7ojT(!TZOp(?<0Q%OF22jA5hba z8}!b`rLmsJ@T#j&>Wcuf^pjmWv>}$d8dL?e@T3W0dG3c~BhAO%5o3{o-n1+|*_~7TG210a2u@q$%3nqVx-EW!Ol`1Jjn?f{{ zm25%P7fwknTQP$GBV30i>QA_ICJ?RM$#9@v%lV2=YW1>SOJy# zOrn=|{v{Y&Nro84qy#~($3H>6qun@X(BrNIsNc{;8K-|Jckfkjewk6B^vhEx)4k;z z_MTjiC&Gz7J_NiFvZBjVboUjN@_TX8OU)5nA2B4I>wLR#pe*-*a|l65t4gTY-0qjQ z6}L#hH9TnyA0XkV#{+mmK)g>7J8+%ZNw{4);ZO}(gD#HVjtSfAO26D~XnwkGR@#wK zI_m6JlfZwwBz_R&*o>WQ;~nO*Aw|HRmb;$G%ovJ+*p<>*ZA+A+oG4+nW=7m#jDQ@y zN}V4iTY$3B=@?WLJw<=9Q8yz!Yvs(!raFTc>n$O<7QL#?ma_oTC^u7#Q_Y1IjmzJ5 zbkpIBn?LSLTb{G4;MYI?5(Q2lJ)J3G*wG`)^Ok=`nm$@P%W1m#`_C(t67uvmQSIJa zRIQi)b*$q|0-aPp{^RUH6&oW0q{>syqV7nfb|`D$5L23TSW{UTytRIsj&?Aq+@hK? ziLP-7`P(#IowQq@E+e4_&g`4Cq>iNm1@b9La1@@9XP7;wg?$P?5=j@b3vF_l}p<@iv3IY#Jm6LxR9g&s;P*yA-{s)``S6tNytt48sLhWtWOya{HUQrRI#- zYW|382(6L^xrHp<7z3udp_RT4{5Qk(+2z&r>kF8~=^(XhDST@8=@^#9 z$#l5|JzC+nxAaG`BB$OP_fcrrN6UW{%>#P+1Lb5M_**j{VeN90h9?+?mO5O%RV545-3KreU6j!R~fH!3MQ*8r?c)~3*0anDH6PUZ?^^XGOn>krWoTph!~e1iz26{xk0s-~NxjP zHL06Q=H;txBNvsJ$g#sq{bE0(J!~jCWGfiuh_;(hC^b=A$P8S{f^{aqL1SWz1ZWTU z&ahFff$835xf_k>`QCqhG3wY@>NT4Y*^CLqctkEhNn;}|xlq{eO@TG=@ldO${C$<1$`l&6tCtZ$0>OWD$P@P~u7%j~T}F)8 zVX<<1jsohTCs zk=AB>nkDKN+P7*I(Y)dLE?GwA2z2RcsCb4q>0dCCMIGj~*IyP_Shv9o0f8+P$$7J` zMye7LSl@qKiE|z!Kxv_t7O7?>nxCCE#pUdv^1HPvK?Yl_O3YGOrb%&TvNB?=<)2%^-dl?v)( zd*~JrGWwkm(PS%KdSmXh!Jz5IGGSfxQ6ki;4BG?_@Ll(KoKlN{C#A(84BpE;PG_>@~LQUWvBJu;==&`hF=oS+3W zp;y6YX2?ytKU*Os7O?{5W7SkXW@@R%z6F1Zvb~q^S0v5Vl6>d#He|Rox3?SzSnItx zOiKfQVD(4~@h=5cV=?fA^7G=(>J$3Lt;EAjT046gB6XOq1=6=BxT4x9}iQcPhQ$dI?ood&xu5WyBP$l4s~IM6PqNC*OY+ zvyRi3LFLzBj>+qN$iTF>9>u)7TG`0TVQh*{YeOtHilRjfgR;lQuB->AKG8_43a3#I zG3Rx4*U)Q#CKC%phBT;d{6&Ui)e4?fH zy4(S+Qh-;WY*xt?;cQi{>-i_XXBzM=YeV2RAq~dD=rxb#u7{hbw2A`I*HC{u|24)~ zHPm71Nm3k+$04y`+N*UmEOD)3M!DU|v}m<#e^ha?IcJ#U!Zj1^$>bm2B>Dhw?89h? zdC(-)JDq8D#^!2A9s^1Jdh-0~y?B1JE*Q6^3GG@U?1j8K2gnVtuNECWT_u-W5?b-! z9mQ31P>|i>VIe*U7&Gv&v~7QC#cKN)Am<1UH2LaZ5XA{N!x0Kop|U{bxsb%UpM{Sq zP7=H*i`|}eg%2;qH4zDpO>s14Wj3C~I?y5GQsQuA;Gn_*19Hq@Q8!kFca@8&MkrT- zHIACU=6jW0~|{JBP>UvfihB|)-8xm$!Jxfga=$JfsPv1;68Yix8F9M?`PF`}f0h*9i%NUl1# z;L&htx?im{zB^HF*lFJ-A zsbrq$1lpMrVvSinB31hh+d4dPi$;l1*L~(18P0;eE7;!;b-RCB&;C^g-bJnZt$Uuf z#+3W!VN%~F1a{UYYv3>+xkz;+4a;wVQ6Ozikp^>_>3mInQ@_ifM6up6@lIXGI%+;y zy3AEA#V>D=TE%^m;bU~oDC~ey)YpCCVyPa-XK9K|x5{D#CY>cXg^Z^tLYe?K?GPv( zv8+swG%PbL4J?0MHGOo;RgPDe!LL}Z+f?4pJiB*z%Qbh3Dm96f8zKiyEQoazkgJ!g zZGd2)-+ini0zL?aC~Y?#>OZ{U5Qy_Tod;ZHqE5GlC)+kwMR#bf7UbNP z{xfS8(nV@83scFQs`?=tOoorqY8)%2sV-lI!TpS~+&;-dA67gWnZP$e@ zHk+gxCq-yZNUW~0PDUiwG8m~N3*RMVx|uob2%ahGLTmC-%u^8)TT<&TZe!rqjv+ur zjqIvIIU|4SQ-;u0lh&=Id-QH6qNcJM1`cALSq0srso$5Q2PtIY)$%~)uei|`ELS30 zkbKeEg&M1LtEp3+@|Se_puE^8u_)czHzHRG0I1$;7zRpuN$FipsOMRCBf#+sJL23?21P)q82j>APW8-v>r{K@9NVwlQ_Ub`(yOqgmP|DV2 zNJMc6TB`E=HBcNb&tfH-{D|=`w3U&giMN0G)-P36x&Svz<02>d`zDMdarMf`#05;o zXTiw(Bq?za>YmrCC9`DBh?v@qv|61MTV$Rxs`m&4V1jDc|yMl0A8DSpdp(;|Ns ziCS!>4+pfq_lW@tiGoSGe{4$G$Rsj&YYEHEW`*tyFD9!?BvUW?M_dSbgl(WKED{MK zbix@{FxZjS`xv^h$Yjf8ZWEzsDEX#)2O+V)_Kak$sEq|Lm?s-ndV+b``|)#hb7>=R z0*{Vu3zgDu)6-ChSS8C7f^H{x!*PG_$2h|3F{7Su!{F(3d~Intm5N0%c{;|@4*GD` zLldW%i_+3=ag$0(j2jcO1G=S0Za_4ZdF0Z5IvR4N^B(3YqZ6;=7=6CRzRw z;xkh;Wp*)5nqSVQFLl|J>n}W9Z&cW9y%W)3bw&;g6=R@|H8ye0Xmx)eWj22&CId%i zrxb-d5wsZKAHQg8UN?mfiMOUK<68(X4V18uLA-RP#R(LZet{J{gEt$^9fN)zjxgdY zFGQarJWlU%sl<~wmBe%mp0Jal0HI3rciBfpDz;tiy6Yd&e0O)z4}SY-)DEg=W{;r6 zF>=k9)Je3_iL2`p9W6Ac;4gppt(;1V&37nu--T7Xv$^@z2OU?FX_Q{9N?lsq#&h3c zfHm!>K#oSA6fdgwu0T8t7if(Qm3}?a?-FV>OhlXt6@?4x{iet)Qx-iqYXmDEVlEl(ZtSRSJlDbqzS{*I!_2f6v*b=u$1cm6%ep0TEfqmw~v zbhrdH5^E8s`3YF!JVQzun)qI*p* zO9GN+?uwO2dELc^|MY*eI<7x;7l@Ie4rW)PcI-;%l74I-XhJQg8bqt7dm@WySW?vj z$z)`)TCGEA9e+%#%(-Ik!2CHCw`&<%vm|l^30`-W)9Ccj1Yo zWwH0Cn`MB1?hl6I^63YCPm0Qn?>+kV&m7__orNOFsnpO zsx(P>41CtTi&#h=1&;d&3MSoQ_ZY{yJG!ncwZRZ3O$~7LlP*SAyJ?=pLqz(PR!@d! zB3=8N{QG~=X!ygbzKxB|xfQTq2yFB`o*maBQ<tHH#pn%eB9U7TGR#sm2+Wll<`FyMHsWu6r z(RGc%5!eF5qKqTRtHhH>zYZMkIF7vp08!RF^jlzRbuS#d_9t@hotU^7 z|4)B{d)#ckAxk{Hd;UJJA-$%DoS$FgZ!MIJaXNu3qMY)&dLYR}O?PtqHaT#7y=iiXwE7PQH$nxe<4zQ!Da76mkl9pV$`YD| z7DZuXdqsnca0&?(Xd}EI8)IlSi?e^eZEWF-BS>ZjCeoLBS&?4neh#Uy%tk{NA9Qpq zsZs|Xd!5gWkc+FLI=~}QyMynb-wS-0{GeN28by&`JficHL?4W#J5Q3Ka^(TRC#Xn( z;>lu~+Rb=Cu?fW7NqPvcRrE&`yR6Sg;@@G6$0+4rr-BWQa~+4ZMXWxFC; zy2g_{4ms-+so9mJX~bZfaN>VD9Vc}sEq|wY%+KIsG(v8feN3g|BnRlsLm8Z=(MO4r zQZy^?J%~UY^zpdBX^2AXxMGb9bMkH=PRF52T`C|TUjiP#Enl>jT)rOxEL_sb;P9Rz zWYN(>&gep}D7fW#`F)0qaW>YOB#sgjakq%nIYqc;9y6d$THO)rM#+C3Fz88ML}b6% zoQYODN*@8Q$5G18k`G~Ir1Fz=#bzANwJo~*e2Z7QafHu*3~_#z>d_-JRlF-UFO5`p zD|I_K@K8mTYED(Zt8tfw$ZHo42DiV2hw{8?YNoXX-YWlP1B5Fbz>5E-3Z;DEly-b# zz+Z`~NiG2mou!l*NSS}WNe^Auy(}t?EXMrKiU!1m5D}f7@!^R&mHq*)_6Zi7`K@w< z`aeIt|5cnn$da&Twirr{$TQLk6?{q*Ks%fem~|r2G-SbrP|jeV=;Gi1bb*xv=3Gi% zGeunNpLg>vf^-O$urCzy{3wn4p-OSYhUc^uac%zU8*m7=lbL@!QRonQO>4RfkJEpE za=>8y)fq_xM2nAQPTHIaNFazYJ8^3G^bYTnz|T2cT8OrWD1XL*IEpe zK&ap{^sLiP zXKwPvWK^kwoQ!Dzt`iyB#{QbW4|!xh^F!l;;IGAv;igVwM|>oqk2ay3%1Shq^yJ{? ziQ#z-qyKzv3}|uo9t;klM~fu?91C%n(&OC5bKDd9Hu!(C8O?E8_xh2B(D2XmZW4UMv|>92~}QU3m^-f>BaA{XarQ12dt z;^ndZ)jRQ+;U@u@Q73GNd~e7#6=6-F@nvi4hlg&NLs8ZhM`)4jYF2^{iM_sQHLl-r z2S1XQD_Vc;T-L>g-Tguta~x}IoCvy&CQU;_(2x=d?-~yo77;(9G*7D=>l9BQ9q6^>}LeZo@JtBzogI&~M zUm1S}PQxY=PGD7nqJ4?BdVLzY#dJ_K)OP$LSf{?rm1OfX^9u4}oxaw+a)FdVz)NI{ zp+af?m7!~Qn)L2)gnU&C4^Igz1^25?#wFI}pfb=k&?RcllX2efFm@!9AWM$SokKmk z^F1*U9_f@AnTG(}*vD3z=oqi9M7Vz zv^fEul>X~nTKLgfoMTTGiWu~ZB<{GYmUI;@!PD}EE*Q(S+Jsh)!@r54-8p;pYmVV43*tpd$(G&<8pY)7~=!ihT3et>2tX-J-M}Um{n%MZ#1T z;fBwMESd_WgC72$W*3Xrvz$;&k1R_PF?E*auJnqK29o8)RNYM{IJVgq08taMElH%A zZI@LwDv8{`o-2fzs;fl4y_$4K>c)S1cBNfZHYD;QMY`1hZhUmY7_7=*(CQnjOnLZA zfE0s{L9D}dYEfHNX1RRxIDnNamLG_51YjVf3@V3Ft$r<$- zv?n%1qxP!RRtnW*qo|Ku(c+J#pOx(gTN{F^s5I`-$zVs)@sMfyysPn?v=8_>rf z;tHafqY?f|(uUzk{V2vIy|otj9P3v&Z7B>cf%z6>@atNzlp5k7UW*rh0nfscyDw944d@n;Hq#+P%cMP&6(?{E^U0I{7Pw{YCtb z5Lh9(Ai%`X_OHGFif^?f`Y(D6^zmOhXrw}!%J>9lz#@w9(t_3I(1U-_>{U~tIE%dA zT*%OD)TDI2AMEV3JrqX+pXjlFkCU6nz$aI6z)}gcja*XO1!d%`!YX#f+lNUA;o8$Z z2@w-E5dR2}{RxeB5(^U}zzxMjBRrH+Y})NyRF!~2l7od9qRE3IF*TP97YD=Igpvt2 z1y?{NrNGCq!tp}|NTh!<9!;7~|GX%{|1%3wMExNTw43QmX(eVDI)ys5FAbg~iO2Yz z2&|%~juVWWWPUxvSI4YvFu$jJ`v72wjiPnF6dtJ#rom&HAW4cMZvNe!7LmhCiXb1N zmL_VD68P18#=an+o;H*+O+)9Ai913Wt;yBFx)~z4yIA?Y8kB#iLLHU@Ups_@%?9|c zDlv9Ipuaq|6*`^qWkD5XpxIV2CeR*bj8zWU%PUO_$M-3{B!DAb6@L{3b$H z-Fb}O@&)VaTo#5+gt%1o^xV?<e<0735TT7(@%6EDg7$# zwGTNPMawK3#E7DQ?kj8xsw1Jg8D`K|(9KzT?}PUzBxcp!47KzE6nrE9{Po~keoyAy z${@m%Oj4`UQSq#@LszhGN;jl6ONdoqF>z@_~W4}hWcq{-z|;-Jd90$sacBurRl7GI1bQ&A%oSC zQ<;d=_pg-5Y+Hr_j;?m7Bu@&O=rs?8XC5}EGD1%RC_441!u5uQpwRY=nhlPC|*NDm9y{{UcvgM5U~tZf=T1QBz?1X#TJU>#ocNcZZCT^Ph* z=abUMuZ1F_T}T2s5h*S1??nDdv(l|n<96324dHT7dW);I4E&u;V%03P{@`h z6I29Eqo%bgdKHQkzIn<9UO1%=!^-fT^|-BAJ2XY|K_Q~cMX5E^T7d2sA>++-=i2eGF_Xra##%>xBo08bi%e*>{*2O zY`eFP2v+JHVff-D$HZL~PKmzHOXvCw+Xf6G&5@9lrTR)@<89ZDxh^#bIwp=?@e1vK zChw~%i#ab`JKqBWZ$SDcF8!lh!=pnAd=oQ9RS;<^A{3>lldMh4;?+9b2)qc3Xdv@p zRjtx^p*2j2CP`?$npktypmms&94dG@Q3W(Lfz@a(U}*|UDbhHe1(O9*y~;W|kc}tT z{UV3+9zz1Hjy6w$>=BIFr!8y`*djA@;INo*4)2J1%c*Vyvv`I5)*23pv9J&evq?W2KX$qZ^!g&Ox; zB3&+y@pxR@qGuJIhoyzZLbB(7V;=j+Wnnc19_&X;eW|N}b`A{uwa0fLIOr3071Wu- z;lZ?TH2N0xp_9uYiDiZniRnAHTSqm29Jn;Zj8?d~%IlAgf8a!jZFEZUBW%(9v5gn+ za!J)V`qtt;1@X%JTGUDB)b3}%q}yxfciVMFubz3`fi+#ua=+3c*F~!i@97iaBw>t2VRx2~3`^U=%t&DA!rs&sSLPETJ(_5*WThvx~t|LD> z*8L#D@Ov=Q;n+xene8KadT2}~RZ|DN_`q9oxF%aMY5%hI&RubF<7Q_|C_LIW)JQRZ z8G&aR8Y`Wa`8^>C%Hen9Q#VI-RM`3=mJtY2Dh<@}Gh=i`a1{D~L4do&K$xTCfF@#a zAcl$fAfVQKR4*NkemP2NoGwNoLNhCsh!KZ9-***xE{9n51fiZ0QS-LbFwJBz@jUjr zQ))#(jHt312HLxB^N3V0lGS{?iuCI`ELd@Zr=kV@ubwHPSJNdu9V!KB(mG(*wdM|W zGtRz)*hwgTf^f2Ru6|gqC~mCw#xw5{>Fj=#<~vgR zTuyOn7y-vlT$XZ@DiW7@t6NMU23<@Y(XjUASBC%B?cR>G&?8!dx9mpdtwx+<=^5sr zc^n^U=wRTY5G~G@IGVUIs_f*t5Y?9tA{R(citLGpdu0qW;E{8 z+Tg~`h=t6J=c#Jt*|WC41-Y3yE#$rHf1#F&7!q?_O_L#j;@Ss343NYVAIiPb^t zrVHhmCC0?$9>#4tpEgiG-bL{Jw^(XCJ~CIAiF`5sRqc5D@Y+L|5r5`FSDF1x6gHQE zEY2kOA`~uv3y?oo3>l=JTQ(dR6c~&@xEmodC#s%yY7lTtms%TvSP)FYy@16tI zn4l|2g5MfN+x~%!XaBOW^l-l&VQp+>z^C3BxVim$`xDOA4#!r3F-8SmTF6ZIPa^wg zvca?Up>l~QGJDPV)&{G)&^|FCD&~1K8uD)Yo`^b8) zYx+^#hyr<+P8vEyzQfYapl|z(brEaBx zs@ArDb=;sHQTNdZ8a_mNlG(cFBn1EuqL#6!2d%!8f8OZ(2X7$#RGrY#n~mD7^`-t>yM6=gZ{bGdlG>n(@#|tG*e5!F&xxx@VdNIr939S=c?IsCuK1qF~Cjw4pljR zqdWpSStu~P2G!9b712U%Z)s>(-9Qy-TBW4M)sE{SF;bLsWsWh(7ob+dsk=c_*zRSBzY=F(t#@#B{jdtTEMkJ6@%c;8WPt_)`2tLntPwPnda z%eq%ma+gdDV9F3E{PYU=fkvg?_q!wpRU` zl!lOD`W57`z$iln8M>Y3DF6gOhB95#1AvsNp4qX*L;|)@xLm??2mC~UbGx5ns7mm9 z4BQe{5696Jmm=_ep_s^~kxSNb6;kQX>QMoIo(jz7wfZ|wu3Y1%*440wz`w4__sLfE z0x!ynRi*i+nDvvoE!U3#Z>r#bu9-oih!y?RSBy{z(6nPk9L?!&tR2zDo6_v@o31aa ziCzY;v>-bx4!p4hjd5^r#9ZXGKYV@l24e#@m+%#zYfc57Yk&rDS$EQt-gp;mR73Y7 z56Q(k^e8WN%#NQ-Y*^rR-dUoZxZ?CJi2B~Y4zJ4SGXh;yo?=AH^PQ=GFkzdiAzl)k zQetN{jZcC{gQlz);&Bq4q4)`)j7aDY;7ie#r!-;l3Z|dOBCsvVN)aIBNhM;FS186q z*Zpo>CPIjGkx`Mi`Wq$~%b0x3c?cWk<5GFVb^71m4Q?BO7q%StT)uqdGIWhMZt2#H ziNU0JR@ml#p+?3hqWgw_9h<;lCbP?4 zu|JW-s|CW+$hsu)3Et`s3I%dnKIfVowt0zZq`yU^KI?Qp;v7b8Z3q^%7>1Rv$-MKv znyy4nwTZ!)G^4M7|M7LxU(r z1P;o^uY)H|2d!&yEa5gS<|CCJ%BY9b2Enl*j5)T9l5x#YPtv}}7=MXXR%yu%oDqkK zhdQYL;$krKS<7 zGNsz9&DZ*miTP7O>dRWp9E%DUy=HZ1x;Q_4UA8fS6_*v)nlZUSzi8FJ+j*&_--2qi zT=j|2T2(A;T{(rqvP5ai4%L66v)c1gUysXu)ev{Jsi4}9@3BFP>rx>IJa{R*)uS{m z;0yizSXjw_NCP!SlYY6BH_U52+DK;|1V;5U=vVoV4jrK)#>4Dr}+q+w4{*1-2qT;E%w6)q;t3BZ(h(7zJsFh>vz@UrEc$ zvEOj??V$GHV=ZFt2WGZp6uV>NMQnLzUNsxjV@wzyk2T%ZI;+Od+p&uJ`$Xtc#9|(Z zj(VxY2PL%0Js6Yp#zlCWS??6+LP`5x4Bib2k=j8Y9qn^qD(Mf|_d|IX$5)Lq6schta&d>FM~mAd8$iLv|8ni zaeH%#yuv{3Q}R?D{#B3ej~G8AWJXBmn-;-P+j_5jkqcH31V-CY zXzMXNu7mMR?@QEm%qonX+B~Xc{(cA^hT>2*3oKL0x!T%Pl62UzAsIbbN{1GHoRc&R zM=09tfXXy+tJimCRO0hGN@~^T@F9-gCEZi#+Jx4%j_E*~HqE%cH#ui(tAK=^h=3(PFCvJ$ID4eZ~vI>7*iY+CW z_^z{AnYKz6iqf0C#TYK&g*5G9!#xtiGW7&URMPllCkX*q+%|1M@5XwTEN}ORjVkb< zmU5{TX*miTHYZwN{(aTzvNv{_Yk%i|50{5JSmN#Uqt_+7S$9D-z9b_!7=!k2zD$0i z&pPU**oDVkN&`q3;hz^N40wikK~muAY9Fe*a#jzB`QdPKgiwKIiQ2c94Ng<4c&>Np zgyO#)6MNXvv|>lJBsZ#jhzcio-yR~R?2LOiz?BWW^H1eS9lY9EU1A0?u_~i~5Gg+x z40r)zK1+K{azv`t3QdS?HMnuv*(>cw2wnNcRkGv+-D|GoblIBw;6Gmiv45!#w$isd zW>B2x`5TIo%OH0zt4bE*Zw7C*z!HVAvVh1*!dztGOOX~dDJwy2sXZ=*wfhx3^R~6S z*WcYTa+HNW{ypoMvQL*FRa)_XKdzC!hr-ea6Tx!gAeV=6Aus*+UMoC0Qz(-9X=Q{Gg5h=rRB87wdailbg+qdA0eR)RF`Is|^0 zh*7M`L5iExt_O>cCNh*tWa3x9)Qa$@DGf*RhFq55Hp6ozypLa4R4Zw(g9wZ0l7ybJ z779yK8UD}~1;-U)$r*NkK#7l6ph09ch!g5kqSuWKOn0=THUOps@gEp}x=?ZUQ5SKt z#mz7#X&5kuH6BV6AER+phYN~CUrvhGw`y)4+n@dDlrgh2A?2DuQpHJARQh-9N zKU{B{Lu?W)TXd^9rIc$;7_6cjU-j|FGH7H4#MN5B^XW;V!4y@0-4|wu@nM$sSDW+W zFa;Mh8$Ey24ppy?#`VOoQrH8eJb5%vFv+&XkmFFo?PYTHi^_C-Ib7yXp^G)Y@1XY) z#(1xbIUWL{_hDfADoHiN>UGj8I(ZY*=GD;k)6lGv_E`-VKj(Dl15FsaAvJ^^FIiQjOC=QNUG3%0HAg$jo zs-BPIar)jrK^KiMDtWq%GC0_f&GD0&&>3wWB03^LKsCee`|YrHAJFX zI-M(uuZY(ob{?ZY1|kUPxh2*_wlyLVi}85x%7!(UpU+o+*k&)N&zeRi?9GSNs->&& z=@owm`>IlRr$n~eHZfW!F!?Ura5gO@lPqL3H7QXIUMQ|>UYzs<2#)@VvnQ^X;B0Gip#?piI*9_?a$r$**u9x)om5gBT>JNPx#-Vk4&>ehu)cIY z+7>dQ%+Ax8r?fc8e7;h!+5FWCC9EK;IQ6ZS3Kox^?lz>sK=ePRgRXi|v7flM5X*&a zn4&g+9VJ5eJAp)F(ul$Bbo6F11|ZB8CqFwPrTmeo48P9Eu@fYq8hL+Zb-miI`gFFOJR%x1p%Kn1+4t!=Qv=Y?T|%F zvUVU^uUKa3Wl$#0rkr$1u+YUKpEmC(&$J4EHoXcSc;I~Av!v64TYQs#i*Vn0%|l@d z-`keD55Wq&B5GN!lSi<^Z(v%#2E2;ZB@gSrkyh{r>8mB_M1RKlm zH9da)o%SB;<^3oDQn}S((*zSeO7BF@Zl*Y%8DSrJ)( z0U64DSMM9fJ>R|aGxENhBWvv{h*?g)6?Yj;V?qUbou4cui%2G#$7Pz4LWwv(!w)EG zXN4xs0p;oVZZn}3f8jV*=Ynm9l=?$l;AK@Exh+j$blUGxln|B=Bz3 zCG)LyIk|(2?5}aoLZU$({!(O$or8MgSo_X?6i6QRPF#^i`}xHT*J383f(}Vz+lClZ zAej$KP2CVR2~##&WC(n}stefJcES*e%%Guel!hf*P7acXchQqsyfV&ET}o+xGj!Ru zC>c5IYaJ_`CzZ!{L6BP5svg{N8eodqbuC7(GGD|5jRF;H*vWraUdZt;^k-}1{JS_# zz^@MJ^WYsu9YeG+)Sv&$mF-1Ut)TW4kYRQGx87Y_f zC*M0Yy}eeXlGP}PYJj+S$b6Hgk9sAk-9ue7fJ8mshLLGtvkIL#Rr&k0s)< z9hlJc$6^|^*~=3v=ysg)hq6#0(@YhL)|C8t=G|)YsYOsu^D%Mg+<+iz)$CK-N>9zr!`r%PCB@+o@P zzP(>{B_iC!$FI#>*GW1pW2R&TK%84;?ezY1 zl_~HML%VmniOUdw#Bo&)UJ%Q~#s?yU+q2AUeGp;0A)W950ffvjl`#y^ucE zpM5F=KclbjVHFg_kaOrd@ZV%P;9V=7%LKV^{RaQr!Pmq{U%R$&z)Y?I@EVbh4ZE>g>*)F`ZT`+Ccq znTwJvnOYjr*A%w!iI&c-`Egney4;`7J@WL6AVBxu>@;~+Xj?xQv*8;Zcs_^2fwt@DqKkoM+4za;cy`*Hn6~!nfBs#T{a1!4d$H)ey7Bg}zA|k=U)t0} zgE13VoVGIfBI^-Lk@HK$O=1-s@*MuT^r$nBe{-rh$*~&0+K&GnUv}DTy_=*h-=^eM`wq$ zIWcx-mv40QqqpJpgZ2K^HR%FDoxXo`DAX!{%DN*Z*}(}0<2YIhVI1ABIh|q!76#a{ zMF{kNM&I&)dEp#w6*m*m<)2y7A;wV8*4O4QIP>s6t1j*2iydyLuB7STy_B1n2GQ$q zX0t(?&d))-+f5CBugHQx$AHow{zm&i7|OSuXcEk$RhNy%@$3N1);(GGB;9zQ_bjx3 zv_)n%dV9P+IicEowYOq{hu216LYu{f$U2GJ*}lQ&LNL$PRhgs4R|2(rIq~|eyp3P| zjquM)uDzHBkF7}&HH=%uH~E%RypK^XbcJ5!DWM&5n2;h-EzS{9CDD6znXcYKL1$2N z!0Td$8dN%6LTj?Ph)dRCM;JelUN+NzMi&gp6wU;31Y;Ptv-k6dP!EEEG~Re3^lg;%~i=KymaGQ7Ua9wgq)%bA9N7luiHIz1OWQ@aR%OJozv zxSsX&-@ayV560H=c!S$#rGWvqYI4yZxXbK`H8_aM0uP}HeW4_Fh+F&Y*0Rj(l?Bry z4&|0pyhLA|gw_YysVZG*$m3OJ1{0kyWHULON-nU9J6#e_;j}AkZ{SSP9zqFfMBUxkJ%n6HDKv3@z1rjZ?gu3apXfPhMWt2XA z+UPI7VW)85LDm{Dob?(C@2Z+v5utu^%D3qJoZ|g1Wj~xRrQW& z9P+uyf27(&bL3lKx|VAwy6xX?{~pj?Iv2QvXtd|@P$>;nAosn`hu;u?g_N72eivAw z(v5PYbfHAA5H1I*A?)<^z`otVJcp!sl2A4^jQeHv3|_8BR^?ii_ClCwaP5@z2DY#4 z@aFD!{zMn@gg-LOi8v*S!Kl2>JF?1c8t&qVZ+Unp;3f~}Th6cciJqnJ1`$|=ICAE} zoUPNl!fCqrovk1BFk(%AL#(ER?)^SI9G(#=idASqg{@&z^54L{EWI1#X-RRJ9F{hY zF_B5f=j8MeH63LiC2;CJSZLHanF+l6{`Z$Ap0aN_eb4IZ2IKDK+mE{|KX4|X4gBVE z3tjwp;nRs-L!T6pupWlJIB&N(REOT~YXfZgYm|0^2s-XY*&XnI7_eo||Ms~zwM8`s8Ox&qjpYOjU{K30Uw} zT6p#N(@au{*x$DaTN4fAs8#f>4OKbVdBq*EIl;yMQ>u2revVl>{kH{A5uypyKb=Z3 zBFs@eb^~F#vzwywnE?mY~>+O}IzCz%^3}h(?D?sCVTo zf@Ak~G2@xC`7yFuXoj3epey??E0T#!HQpS)+E-U$5ovWsWjmtji21K6tHab>y05y} z!qH?OqjS5)Sx>o29^nUE_Oxl)QJVS>w!)CyzZfPx1X}!mjOMAgm|)~-x3sR?X=>i7 ztu^Di&>!x}pzZTXZf(}~Mkk5H+KNAbFnoV3sF}QXW=Wv}YiEs3+K~WRD@*b+3maLe z@{E#^&>dGAQ7CNTnlFW2eJRrmLU5 zv1|ANmho19E*4}$94|C)7Bf-;KXMne8!pNYz0SN{Tn>6orC~G4hkj6Q_01jm&7L{$ z$Ga<(^l~9eD{gz+{r(rJ1&k4#fpClUnyY~Xh|cJ=6D=s-jjh{q*G;Ph7RH`725*`M zZ_;PBF>S=Hq~V8bGOug_AbNOkR7PJ+EWhD5~#&b>lCQ#|#!0qER^w{BE!CuJB-~iru{A zaIz7YK){J|2$`5GjF)K^*nqFq8PomyPVJ7mAV%cH5mN6+5XD%R!x;~wgj)y?$#&H4 znNzHg4q3?8*Z}sN3A)OVH-1xi#EG>KSQRmecbzL)*xEEF+@8|5bO%!a)4UHcHEi zy&Ir$RI;HkH|c+g3g0z6eHseSg;rJy4-7!lYrW@^42B{dG$c4scd*QuWXB9q2xY{{ zZ%`d860|g1uQO??GfQa{Z1v{Z^^K5!X89G0rXQ?~@wGWBgtiaCSh+fchtZJ*jbzx$ zAvwE5!5rmC&@>%M<#^S3+hG}ZHOeI^GbI<5W0-5Kq86k^uhWg|j$9r_{nn?UJz-q| zp%YKc;01(xie#@DAau{!y$^&^?#_(Psp6ZC8TuVQNGjAc9BNIvWl+!wQR_l~z{TWu ztW0!-Oq(617Eaz;m>S`<08&bKWSEpMij*c7{aj18rT&V=5UmN6E+=Eha#2yd0JE&? z-!c%Mq0pE64*cDNFNACICJv9VE=Mng0}FQu*UnWO$AZSa6RBxnimGU01t*+^m8WN3 zhi*HGx_SCLd9C5>hQTo`es4^Fb;G!Wv7VD~nFAME#h#!d za%U8}lj<52CAdJU#iZIIps|JD#|FKV5@8JM1(8ln(AJ^3=5em?@h7coldwQGun@g9 zG=r4lJf}F1id3}%8QiW%6V8n>WEx_h|PYg6@>3Z zjsFd;`u^7Q^JV?Bgyc6Zi%v0j<=nksqSZxkhx&v(Dk7=!Pp z3qL_d-O0AlEgU9sYDZFZm}HXTHdArW73ll9f=uRW00)#$PlN&gDLQB~NX_DZ^RY9ptm`}^b1@nya}HOk^J-4w&aGJ|CQ`WD6>eO1=dE_0 z@N$LI_pd-g`mH1XXe*Ds&2*}Me+*2{k-`fiid5p4ZC zM#KPeJCB#!kBn`DJ_^;^&XGdYX78FNqa|*qY0wjfhii3CfJ_SVxJQ7;H zR@hH0FbX%oWF4u=mF)+*aH3SDK;2H!kQ{qYY;=}CSl-{KUwluj7zoU9W7FA5QIb$` z5?nQ}ILvU28|eryV@Lz|9a=wEzP|r?B2lKVZ^!edI`ylWfgR+M@3Bdh_nLUdxYV0K z_e)2JTN%cREq?}oXFwgJvJZ3ZMlj$lEV$LVzAcbYXq#;}uvuz2XoA1fT~Fh9&?*uPCo_lJo_QR_6_ zXz}8O1-2iOKO+NLh z))SAq;pMkc?KDNjw>yc;1E8nc`j6hGv9VO>8CM!tnfZ|6uw45p!d34|zw_ zgK=|mQl{7>&3zz87_QakJQ^nzXV#g!o%|DtUL9YEw5SOP*&P>k1te+rs9j##)+RrH z0(eNx{<@6Ch)VdnFx_#Rb=7nb(Br{}P)4}5#-b)8wBJJ(Xnt1rM2yL_w(~%ZjpvgW z8rkg>5}NDAk75!?e7nE-Di!lVeKa5oh-|U)bx?wyLJ-E;T>VgD-vLJeL(FJCB&i-p zLA_3do?T1M(?pWGi*CW*a&`WkQA(A6T4b3ZG5>4G<&zlvw_qw6(S{P%{>%u^Mk$Xz zM%tw4IxJan@~w#Y`ZwYqW&D>;EB z;jogb$$JU$^)xPNn{_M!BzqELZ#eMw+7b1pr;XIlaTX9QXWr+-DoW;#>*jEOxegdu zhaN&hXpkdBX?zV@ZX%ZA_+;z@ZHQ5$0O|vpTDQ;onf5*qbtS{R%7&H z`X@;z|4j`0ILQ!X6q_t%=-fL@zNQF=PP;e5n{7$pK|5~fd(9?#I6OS8s>pxLo~WVg z2DAj(a09P#)BOvPTGs8Zqrp904z*>$uk^*T|I#d~2RC5`#W);J+x* z-B@Ni#XfW<1ya(vq+{9y+ALi`t$8#$oZa2}*{?C(mx6*BSK6=(cxXv~&{k4%iD@S( zXA-6b6_cdzj1Q?OflHP0i(axSS2rWM=XG}dF|g1DAh)ur;1+|gu0H5 zNnq%r0-|+t)*q#-QM_sKT^HI~!8?WbrM&GU3{+sFB!Q{RJ&2AV*l3Y*q3I$o(7R{ic zUAORAmF`a|N?0?Vrn}o;JyElPmz%*``a{L#G{f6hXtFH-@VR38uzqs;lj0Mx86 z&tNJoq9_D~>xQC2)wKZB)kgs>J9~x|@fIniX8HV5(2%+Jw?_k`(@r0sM68p>r_Qq@BYj!OizQy|pWeHga+9!rz}i~|eSEYOryPT>3??&< z;6gsjn#is&)(6ymrYtKq!qTSS%a(AB6Q;hsEEghxO!pV428sw59X%0}8eE9RTzs#y zZ;fFpX7JEs(xt@K0-ZZ_HzLz<9kq-La*&{ZFE)xG0g~AV!pI+9S9?ynn2r<^>|H-o zAs9!tE$tI?Z*A3|*|~ldZzG8$WSTASgpJB!Xb8x_|H92066kC?dhNXeop~=!EU3X* z9@x&XS~G1DFa8$VnWAgeXn_ZHMHS6E%O~m{5v*_UmxY;(m|#Tu8aol@?2`nAKDzIJ zc%IY$6#tPXYoSiU-XkYY;O$#?B1T~;PmIn~7?=>SG4*7*& zbE8EZ?MUL%{HWXVBODkJLSMvN?`=Zd)4R?cWq5~tu1lwp;`gh%j$BcqQ=O^ub72G= z%B*Y^YDMVRje|&iiC{8HT+0-wE{9x+BS7vCo^F)pXJpEq|Oe8I?EF3si#x8Q9+3E>{V;g_y64- z!MVU<%;~nWXgELVvVY5e9@0~&c27)*Btool0tbst1%<$_$#7H(@P6<8ysY{AxiKL0 zT!ixRpr)KPX=~=z!K#aNx*Fyj9t8jS`qB{aQuE)$Qg&A_r4#R%XGV%2ItvSh{ue|t zKc$|_z6FHNF*?N$v6s{&YCSvQj3*PwI7Wqw8o(LCnpPcDUfAh>E)H)Q-9F*;W2e~X zgptAWRKj>Pq6>I*TYi03T~sr%UOz{qY3fbjC&6W6uA_y*$^8&E%Lq)y+hybT3I`+mz5@JPqMf8 z*q3igu2`|XS{q2r%5rQZim3Sv5zf~;(==SC>K@7wji#DX*{S+xj+b?m=rg8+6j!D9 zE^D9N7_xjDDn)qqcD6NPC5PTIjRj`Xua?aQ6U)fN8|HX_1Yp{LW-=5lP;uCo8419@ z4+-CUKTdPz$&Cp3y#4keNfs{*3B#*|{VZ>IiGaf;i;H@q6LSDb_sL}wcx8fq`a71* zO1XSafBIP!#@sZO!;-dRPqagC!;ln4MLP54R}U84SR9%SCO_bj!r9bg&d;xM?X6dt zzvA^y8j<3E<(5)`K~TiF{zsn%z>p5;WMf>35#V<;njiL(*$!%xTT5tON&6L0e|nQk z14qSFt2#7UOyBzw5+TC1>QYsQ zea!JBtU*eSghIzezJV(Lot-YYSR-OOmw zMPolMNU%9Z)|&K-ymY1O43<=O_n@FzH-r)NY=>tX(XX%0p@)qm|4Ns!f3@OLaJ@8X z@*fXF**V+PZDLkH5IxW_tfak;xIl!=jhmU*RQ$YkdR{V(IH?x89vY7HkDtW?cO0mzyEH|Y()qemPlk2{J9W+n@Gk+p%7t3=#>?33+xJ5xfr{ckU} zuY=B(m_pJqOv9gkgQJc$;6`LgSn`?tY5qokUL4r`a0eBwkog+kRTq&(P99wca{N7T z=4nCrjv`h8zj1O=#K@WxqN}}jPrhh$&OzoCoTEQvn%-U!ON@A0cZ!?l%bftsw^Uf- zPWtZ;xU)G$6-RCY1cD(Ib5Fa`+AuFUDgo)dV^4m7$Mxuc5p?gs!TAe+ zR%m+SA>}bD9SJAR-Frn$K*u^ncoYnQubxcqdMCruBxFVpS(5AlkK~82ipO>^bsKJlxv_g-(4n zu*;S{5~D-;gsQRN_z#QkH;gM?tu=pv@C){DdTW9}>d?qw>m4S|wawnByJbpvj%;LB zd_@HgY8%_eyQ1^yc$~Fv~B45=DEE(HTche7|%GjGJ}59^OO#B|7AfYUS<*Z>FS|%FJZHi zbItJ(PhOG$lU5(S%tU#gUMGn#2QYN2M>an0Ck(TuWaCLNkCAL9Hu^N!R7Cs1&jDC7 zR3#ud+<3qV**T}m1tj*gSt8(nO*l`&%^aKcuZqTT`tPB?q)Gf&b9Xc(ThOgl?ZS(( zg)VZ${5@3D{~TeYavQ2$B>@XR7bAq8tCan#Q%of$xSQ4%b(sUN@f%o~8RA-jd@fu+ z1TVf#e^uW2zwJ$kgRg3{3^h^eB~6WT{gJPr4u=}JMSj`#r0fcP5J#|oGMO_;HYCj_j-V~4Wm0i9v7M^TwF6F*O%S-!*$o4zVE;~tk4yzcJ25KDE0%Gb zLe}WPGu7&%yfp2w^GD!;D@vPfY;<}73xZnm;?J+U4wJxtkz6a~-JQ6bc_RG1%9b2q zcP{h3Nk$s9_iO6eo$$a09t7;*`K9l_H@&cOC?0wVO>HC(1pe-tH z#o(aNH@}J_2w_|h!}2L}OZRv0CQWLOGAsm01V)*Htl;saKkVD132s^5Xi3}A4YjR6 z*>TSt%R3f-E0X37+gC1-`)7wPcLKgGDuowAU6>Z4q#9}Xe0G2=?ze&p{ytS~KR zaJ!T=x&tX-8?{@#%wCbO;1n@Wpmp+oJlFhrgyc_uBi@%e(vlNEYBV<(B!)}YO}+Bl z5%lxbL1}I-hx;I%rZ!-Cf|$)K5d3r9ki%Viz+e_SR4iM)a~@MjFXi?HYk^1hmdQ`h z*RxFruq~MGqZe_3?x~k7=6U@r@Z(4w*wL!k%e@@G^LWoV7&VZtTKU?_O5T zuQtJd>1Y22IWDV~wdVMu=- zDPbS*WY-aI#(l#vzEHF07rtxFSVe~eA-*cLbqPk^=_O&#XR;*dTQ|Vbv8LwKgaiW;KUAon(cPFP~gh*wvmIV%wNsR6zz|H z1PlLWMkp)}vSym3Y-xQJd`%VLGR91-_TDHB*okPMMwG^6$e7G4u+|Zn@Qis=_o79{DKT=1PJ7)aqEXwD`4?Sl{p@UXSvCiJZNK%{vlk+ocxfk7od zqBt3{a+R`3bmShrES>U{s#BPLy(MUM7UWK8d)3BzEk-+_WVixO_|qZv2}-cA7FMoF zyqRImDziAh)2&1x%?zO>+ec$Y_T{4l$oY40-puXyx3i!ra-|fFZ`a)sJsxI%*>(yT z)Cif?nTt7WlbQGmgyk?Y#!dI!S=mAgCQ#WcXd2)GD-tOgfZ{Yiw@8vY>INId(Oy@X zaFlfXM@z>{LEY5fV2D7cumefrbvSl8@y`C#eQVoBdm?Z6EG>=`U^czsBka$j-Uvu^ ziziG zsLohj5Qbojt8`#CTDj>4gl>2|6t5|{@#$zE1xoquowbV%aO?q6{Kla~$sF(=e~Px+ zLT*|be$MJV8I@qHjOaBTL+iLaC6uU%);9J z+w1tq3!EpouBoatn*IA(4cYqcySD1cr2H4NG4;&JGi^ zTzScXodHAhCHhNqvlqAHdk)|LBeXM*O(xCb*=oViBb=fF5$xB2Fe`7lz&aDe2 zS${=ZN=2(?a7jzhFy}z#U8m^ms>0xG^EGn`hgETQpjakY{4F(OE1Y4#sXvL(dGX?S zbe4R*rJmDItd^kCg79aKZ~Ou(Y^C##bu;b}Y4}6il%Y zrk5N>RItdnK5G%YBZBxK0+P{#jenIkj$@@k?qBe1(Ro$H?X$_%(W}UU3yTtPqJcpT3-M}nglYtq` zrIMwX)+4j)`N%#;XQP^~e+D=FwLwarE{w@5_feo9Mu9i#{+j%^>5Ecu43pcz-FX9K z?|Fk2R9Uv}nkjb5s5kh&ie5|cQ%VQz2BS6yu%oTCb?&UoWf7y>FV@v_)KCmFXcIZj zoKa3PAlA;KQF#jyf0IOi@0(?T^qpST${y;y;t3Cpru95Wm*yBFP#*d92E!iDqwzQx2Ge3WbcnVo102FI`nv9zaqLHw&TPu2!=E-{A#MyZ ziRGS#UEP7X>VAI%az=eqDZ{cQhk18Tvc^|JMtke^!#=Dgm)(Ln;CZxXT=P_f3$lx;Yu<-`oM!@uCsGv4kjY7@N(8`O@KG1;>i#FkYx9V@CKGOk&ov-pyN zomqnC<`E~rGj!h-1iimHby#}n(?xnN5ontkP^`reAbZUAWdpr~Q_QBUt2t>{(}FST z)|{O&C5AZ_fBpX-B+S131I6#3n2TWdXmhdDm=UMcRNm@QRaQuvZ^uWAN3UEKnM9Xq ze~{PirL@jCK?9xf)EI|y<%*H}T<+YgP3Z4Um5WD-+B2y7-TdZCahBa5jtn*cFyc!Y z+A{Z31LdE6%TCzsnSr-_YW3&&kB}aal!5zE*`?@Ke=`dvgr-L2Ph6dSx&^8q&;&8K zBQzjuT>;PuPXq`1wk#A^euH>_!QYPpVHfdn_b}soWv`%C z3>u!s2;uqiZ1&7N(g1uLvNef?nFGEoDk-vTNuEo}VGR~kFASvlF3TV9XwNsEoLb^fUIKmhbucnPz zOq!hS8dU18b0w+_Tf|3J&HJv5QJi<7*&fO&f89kdiFNi!3~^A#>>Z9j@GbbSqdo2B z-c^8+_;>>xz-EklNrN!^rIl~=n~pSLge^u&l|Xq95zTK8QHuMwl}S5=#Q?myE6ae_ zdL~7G#Z*t1gZfdvMT;bXJUO4$E9b7IugC?tc~o(YOKY`&e`N6{Mg9@&M*qhnwv*kA zf5)?FSQq~x%bz_x`@PvCF}e=$?Hf9GqVtlP}jv->tgy z2cq#W%S*oI_&`{0ryr|Vzwf^PjowL;L(b%XRGBzYhTs81aUeK#`g7`Je))JbLF_x* z%xD5AT?0cvXy{bc!DrhJ!;v;`@25hIe@KRxm7}aRYI&0)j!8$WM}^Kc?(@N-hG--W)4(gE~lX+=IIVh7UF!a*66Px2E!h+ZC zd$tPG+fHZKbHn->&EC2`osLAzfTeRwzc%L6;c;eX{A)Xc*ar~(wph(-DVeute_z!R zp}?boibvJ3NXn+b;n|1ZT;8agQHB~ca2d&Cot#QqZmp#aT$+XO+CQ`31g_?ylETHs`lmR=;?v!s(bfZ48G{R6vZs2pEOXy-` zCdX69)nU_(=u~6%t!STi$Q+4Ee+-ll&AFXoDL|X6hBF7S&qdjoqD|Ds9W6TlH;&u4 zXx8cC-2vMvs)B~2_`6BY(o#WGtAC1z*{tT~{qu^l`kxLfDTCzsHkqDsf&`Zd zKf}aHr{6Le|kYBmJ@P}V!cDJ>%*02Bu0!HAiG0o@C6`b{bu|nItRFw zf>L0J&eCI@*fL0Cn$olH*cQvk6*ca36yH%|d47@U$4hbRuH0CMz*nLLw3v{FmJ651 z4@P0N)FEl+$0k%_vR}I#ScvQ zd;B#sggx4#T=Ojte8%dFVwYa0&%-6kpM4a)a)Gb=5$$?|AU!MI^FH{pp`pKc>2P_hz5 z>)F2dYirO3{{(^q>#^K^l%eBCQ^p5gaw^6tS&S`5!AH0X?Uvrqx6N}lnqHM$ORLfO zI91#j23=z`cJjZEgWce{1jrchC^n1Lq}`?+?ae$d68rW4e-uH&9;cbvIh*8QT1n=X zVy$J9HLa=MbK%l;Lng^DS$X~6ql3K}r3(FQIWMWI6T|2dMLC~2Rz%@~mI}$KnK5K> z3G=$(l+?yuZ68E~@;~dyO07=~h^DT}_-W8`4ft9*ZT(hQS!D`C^YjD@p~5M=lZ@n-Lx0;@3h!CsQ;9m{|oMSp`!I8CPimbpT0YzLs0(mtk)B zTV4vav+wT_-vc8(OTp`q()>3XhA5LTYt~|_v)!e6O3B)$%#nqkUHKO0p?NYm^tl@$ zK0saSh|q$|?K)GT{rcidx>JtRNI#1X7pb7s^9-&ef2nI*HU@?^Z?-KR7 zoue$-y3cr##Uf2lrL+v>2|d&FVz=d`brLR>5?+F`&z^k=0+~jZVr<&+(efk%JIrt)j8@Za8dMcxJy9@ZuS-M~4#ijcL#PWw$f?eBZ>{71;|V`H0zui0)L+m9 z94Q*Dw>Q1-HY8cGm&42ksolDHw4n|Hfl_XLk|K~~Eict0O5EAiC(g5)E9J7R%)i#0 z4VOPggug}{AQ_u7C}RF@1t!5X5e}2`LuH1I~hM6C6g%D`K!8>hNTCTFe z$@uL9h~>pRTeZCr;7fymKz8t_VQg&V!hDv?UWrbLKw_W!sN%9ELW3q$4Ak4Vtvd~U zoI4rP^c&7SMs()H_IQV1`dC0k$)K0;TvO`aZeBhCA2v(`K&NQC(;qL{W>=LliQ9x9 zf8rUAkX5ZpDq@{wa7Dn~RhmIAvrS6NVAHM=W{oK0WEIG)N=e@cz)RV&w{t(PP41X5Y#c5hHcSpMeE=&K5_ zzBpCfar)su=E5jEA0#6RLDcU&4S3#UcZ`y4&3Nd_Y5nApH^NF7)n z+@V8LhWKnJwJXgl+2tur&({JYFPxf6=HAgO#2&!RqW1wSda{6nhM-$bB6uIBf2}?r zr5#dDQRRP`$8k_0JinyM%r=0*q}L)tgloQ?)vc+DLCNEw_5Pu|h~v6rQIsyWky#w| zch@;uGBCWJVOYR?hD;nVUqK>_;w?Xr?F1<2v`B@7Z+i#4kiRnZ;QT~=Ugh||Ab0*< zANHw+XKTw|ddiuSVT#S3!IZnBf7t!27SJL#J{xJ1zWcU0H+&PkZThlJ9 z1l5Err>{CsaCu;BE&Zy&R)+|9-fjl{-}Y#Drdq;49ZA(61DUWKMLT_Ms8C(k5ef7PRpxRaSA(;Tff5P1moL<^L=@Ggn#LmI<()oE|Q6c1y! zWk-fx<#F!8MM@c+sDV>|x$jc63Dc2>iGfab+LrbS8?W@-C7adWn9h`DV!mfdEjhs*qP@ck-Gh@J-(z)`w)}}YxYtt58G`U&!Qy-7 zAgYx295bJ~BM&%Re+oBhT%>KsUMY!5asBn`AlkyISa{&#Cb#RBzkeyhgOhg$MEv))iPjEthX)F-A~T zVnh!|Czk=!eDh3rfYnx3St7kf)d_IUR-rBuBJEy_5ziDrf7KM6E;g%oA-iVeT=D%S zn*Cp061Q$@!-~0n<1J1&SJdfH9X90N;GcJrZwGmX|Z*{ z-(mcbW;|q$Y!yXBx{Rl896?U4)r(%g5b)aaI(0+-j#GopoN3W_ESqd>xO@ae#0K{X zR*oSX6MB7G5Kf>#e*5`-K>MHJ!Wr6jk=e}k5K-Q1fhuH6B2cf4MwzwB?N zb#;6mUCDJ-=mWk?kFH__^o^R&)LOcsPoS1&Xx~^&ILx6&+zb{cecDlH{hteId51^H|o~c#?%Imbcy)H-L-=^hKnK0ce=ohvmTgo!eb4r%XS4q#5 z|2`}KW}7NW5TduM5Pj2vL~6OMDz+k$;^&a6e_Qpj*sJ&mAS8x;JfUHQHk?3SyK1C% z4CKpM7<1R2yd~R{m>yb+a3ydL~J8YJgbT22?k_rwLvc=l?g-hyIOhFIu!GRbj5Ut zf5u)SU#Sm}iuSAUFZ!-GnXzOGXxO4_7*Co~sflN$UwLl=fWnR?iWVXqy*H&+5nhRJ za2GXZ{#TOAWZmM~?1mGNwr9@d&fFBv&eNSa?Gx(~`#A}N0c!rNzoE$r_f}b;J3<^T zVa3=i?^1m46mIaCz6y8UYq_2-iHS_Gf7745KatbG=^9XM(~4eoqb1s0ydO37W{dxa3Gecav+Wj#7rk++k*azZO(ksf8QTE z2nm}%6aMSnMo47j)9HM(&3VBhOWm3D1c>kxIS$Dtd+7MN-{MgMHWj-~pBVp3mV^^H zPG$oD?711mQM9}rLx=K1d;UV>KyCM)2Oq00HtueVwG&l&%T-m*0w_Qs{|96dk<qqo# zR{}wM?7x2g>ibDi;FKxH(UeXHJ0G_eOY;1CXW+N~$l1N}pJQbofgF`vLntf=4LwFWD=znG#ZhbTRkRHKa>j=NO9W%(bq4LNF>FnTUoEUWCY!0Y1y zQwe%lcfG~qguixap8jr}_Hu?o2c<}6s`@@Q=Aw@^i+CCt7g3PrBY!&swfF`Jp(gU? z{`(sLK88PYNDNvKsmh!oe?}i){1lPVbp8;`GsG)UJPBHiXlFPR-R^>CQB7Q^5R1M7 zs#=tq2rk6)E>D+ma~+1AP4X^M6rU7_UL0q$oC3*qnzPAKl+@&P;U}}klC>iMO>&B zM5aprUry{w4hqayf1J8YG~!FwVZB!siLo^+oKqoWXl^DZR zz>ZM!mmpnCbQnU2_0+|fXdnCY#f)5Ku`)xsS0Ne~^`w1aJX@%47w5AFcTCn%b4#<5 z*GcRTXnDwJx3l+0{`PD(sI|8P-5GzP8DQW;YBJ;m^OaF_vvqHFAKY8Qn8|TXti_D~IYnAXS zO)MU9e<-*p=3;-n4>gM8zU&@Bm&e@t48(9dJf>qY)v5X*LUIB3AZUG{ro zO_dp|s}N5iz1>0A_RtL(q@YtRM4za%_=C6T?>r8eJTND~Y$gt+h+GZyaScK#`>Vdy z`eH?CMY^qNL_xGnz^u@h0VED7#OXsam)D@7n~%DmUj%%q>OEZQuk2^EdpOnR&d+3H zf8Uu*^lulPP})g*my+y=;ra)=V*EPR;sl<07$Os-T1IwDg-|=Wq23z0RDK5t#?I&R z0u5EZ-7HUBi3W$&<%9tTVK_psO$i^i@$B&Llu`R|XGEXf3mx9TO|2pQpPyPJK4?IA zHq2lnM_-1yWvH*2UfxCG9z&l5l>NRse~)=z4oAfi?uf=*8ZDaC!K1KggJp?Y#TQ#g zTthn|JA6AF!%#^s<$M|>no&)LRj$Ev&2L7ne8%Tes)Wf)$3Uf4AN|OSvT~Cd5+8CP z8tOk<(Shygrf-aj@;+-YZKpR;F-J`X!#|uhhL^8B;teYmP~eq zI0D}H`Zp`2=RnXTV0wS3OYc-Me#2<+D&K`<~fukmco2Uv8=GmV?6U3zbe~8mZ#uS=wyJbAv%A>c>f1fLff@cG= zu()QHrb5K`kuLmMkSprI9DnvZ%or9c5SRA{7=zIqw<{`!xbM2TBwk>63qvSFo)}C+ ziCNzL?fQLt_lG$fjO zf}f7D+Kx6=iDo<2;F zbTI17V17EZ*nQso{NqsHSQZtYS-7D#xM7_-Xa>4=;BmV5US#gG+@Kbg*jU2wA12P# zHTfQ=)29ggt&6#8nhmPFYZPY{87$*#eAMTu5PyTzseTe^>4Mc9K%fmnQ zdjrK7W72DmHe7eTe@G^~Y4fJf<YP@l21Uxwse)yT1ZH}0ivV08O- zLHnOs;M{^w|Fe5ClL_E=`MPPAAX_5eS>SaDM<-XVND=~r!l0;$sS1t@9 z|65d!T;WjqQ3eo^NQYo=h4>rXH`a<&|7?#tD)tRb7BSIx7|E1sZrNvNpLkHdN^n+- zHs~!;Q+lB#%DeFePD>*ttvSu7OV{VxKnFfn2Nc@t z%lLC$9x)bWf7rrKPH+<$lsyM9S_OiF@mB7J8=I& z+KClJ5wJx8Mn^_67&3a&->68}Ge%Zu4P8Ij?3K8IFe_hJ)W2OWi0lP(Z=|0x=ewx1 z>GpsP|9T%(@8GvEU)6SX%k*s+ET3`?bvqa=TA!~Ge~{)d{Hq;lQ=i-mKEAy4?Y)(r zQOu>Gb7t6$IO6Q&K}r-w`-#_S==&c+Z&MH6WZ~KWg1IXN`avz&QDI5Q9|B<9g!Gt3 zUU(ykJfd)hkaSO0aieKsVcT~#l^(?E_9Zl$Mm}W)2hxrWW$5@W8GZvgp^%^-`OeM# za^!30e|Cffn=95rMSfZH-0#a)N+SwLSilSZt%V!p6Cmc^wBmwf;!Rv6yTrY)K)Pt= z`meb0wEc@wfu6PW19U8y!7--+loz10rw|R*7Kx2BEHYCBU+k?9&s*_+Q;ENJO}qLZ ziu0LlV3vu4)FDDVC}YPT0(XN&jFd!@;?0&ze|m-!@ukNX_#9k)>;T^F=0ug^-v*sX zjL`2A5!>X52mlT)={rQrB{tLlv4$*i;II3P3;TJUc!HonJdR<*K?S1Gu&{k>*dUt} z!bC_XYa~ZVkIvhr&fCx8vi-7au0b+Be8ej|H)8vlE^y)2a;=o>T+1uS7_hER@o6|a ze+NiX{NgK!E~?*%L2d*up;?6(^)P;1+X)q{ek4_i~*vMIij>>5i?#)>-~m-(;3+(hD?vz;cI^f-it`ANb|f8KBB zTIHpEZgPV71h)ZR%m1_{x&?HU^b@W(#|>+ z*XVyS4ES%YC}4if%QYDdOiUEbe*g-kL2=whD!0;nj2c&hH3}iwcRbp-tK1_$_fPde zL64-0SUduEBFue?{5zy75{7>-Be-uYEeuZ<`Mcb@@EoVly%pzbWllr&lSD6|PQo^2 z6W*%b{rzoBD097GKS*=co9ry#EXvQC-%7AR(wcF@MC8X}we$1pnJ@gee*$o{UKR9t zNi@!GjyL4?_y?=6pxK5gSa!gaXEYXpiS(cYjaPyK@jFe2jiCvl>3;|iM)R5?{1&i_ zuS^Xw5i2rC7XhQXFNZX^kAWXZ2cFidiD4rAbX$=6OHs?I30(Ep&3oetb^F~SsM^?* zL7tj0Q62iFuY@>T4Y1dCf2fY2i&csEPPJHw!`%Nd=LFNe><|CjG!K85dMejx%VIN8 z|8U+7Fb#guR_EI=?FJ_!zYE@ey<0p46X+4L7MN<7V*lf?#KF6Mo0s&|-xoqblzkN_KKF?#FnUyIN8!(nv0vJ(Nv95k|2_>F8Q=e}7eM%}cTmI+ z?X2TU&^Tf@9U#z=xt~wQJ_>JjeJ1W7;kRG6yZ3mKcjs4;ok)bVqDj1*~NL5^9~}{R8cvUN3n)Fe=rxRt@FYIX7&dB=9|4TbC2L! zBjcD19R&=7c<|og1F=AKMHP!Fu2~)8T6$_STXYe>GhFBhK6|BAxBu3q$m^6 zG5l+4BTmC^)W`7fv~1Og71zzEYycRrW- z>)!Z-fB)(!!GBBg1d`UBf7f$UL#pE>b8o^1??VhSFKJ;;y48nY zEL;P6Ls$Q51h)JV)38wo2|!0U%+fy6a&rB5Z1TJAR5^f?pjJcoXYE zUAF_!mtQW*fz~ct#E*nrvq9(n0<=Bpe?KBL$Wc$<;PrWcNqzO0`dMm5So?lE^FD&| zYw;ADPZw{07m*%5&siL`cmn1S^)>J5qPH%y&W##lqF8n5^4m}z#zMOMS)gCX7gSHT z6EgoD4EH~v%UvYdvBLuruxv9R&@8wSR@FMoZGAeWGEaL33GcJGe?~35 zPH6#IAd#MNDz1nkwBQ>aZUMm%_`VPWHmHKBEwfdo&(?f&OZpG68LC;IT{Iv^Q1tb@ zG!tQg&}S%k>t{%Q;Cr)RKX)!yUAU2o_D-*V8tGo8`<8yTIJXX|Jv>W&4p6A1!TACf8Am9f2!LZ z6MBC1>C=7fqfm=Ycv&ud=N4ljtUAG5$>KAjVZRv+9e>(B3d!Fs8NnPe`UUts9(+9> z0Fx*XhUpk*Q62^ zzAao|_jneXB*q_c(dIdawZYz7xsfOsN%r@7ytuB6AYIdlmW2pze`(1#H65zAmeGM4 zWTQ$t6K>l0UFq%OKsc=M)#FQ<6RE{fD3`G#8wC~`koWqmiAQeWa~eB`3Z=uvu;8*T zdz5VbYSie+ndmP8HA?2B=X))&pIUt!P=eu=tRYY$*EuVp)_*G``fr7;pa1HMxqz*k zEd;n>GgpAxP&kh-e*u>agYe0{9@Hav8}^`%_qH@R4}pn1-0!%KJjkd7+xXY6w!Y2J8b?6|EFnL%WVy@7O`vr z4lvPa+2wOXDBh07jw|nA%zZvY<`!=r&))M8EOeIYA&7_^e`&g(bxHQvuS#%9DA#p@?u|FUM*BUYj+t5^h2MD~hidc+VfPK#sdPDE5(L z)3ZYb75kupf5ZV?7LjXM{W|{XkK9M^l)ErBwR4dlwrJZ+wi!iPQu@eeq8+C9q z4-NnaJpila)Q||a_zx{J$V4VF$rMPb2w^~?+H_v@H#7X74iu*3yv0v1S)UGI65o94 zeI5)}rYv%QIt~M(w}dT*riLkwd1V2vs0ZxNoze3^f0#1?(Jb!oq0wvHx&Um=!wiwA z^Jdf{KivCRwV)w*Sl*Y<4WSDQ4CX1Rs)H;4lof%jdB3O7@P5+8k*qi`B6e{#sF@ff z7V+_D;QeYKs(Sxy=PsD9E^^y3Mh4Szk}Z^8o7T#Xh!;kHfjJS3-2r5osMKLAqQ8mi zA$1yNe<$HMVD(fNz~;vEL#HZk(TVK)5O|Hy1aHu1>Jm@-7~tp<2)+8wJ#gdfYSk7A zB2a5#Xdb<>;GMBmHAA=@^f_13G*dB6EQQ3hSS|t*{N=lEqZD=lpAn*6i93`iXl1qC z5=H^2YwzIM?aWdbSH(KaXQz-?Lh`HP{(dCqe-dYwuEYf>OO8n>kSJ`y3#3Ga)|`aUnhV;iX) ze_PG*Y)6lOIbws9u>%LK6jUE?jYlEff<;tezFVN8QKGp4zwso7C1C!yL#w5}(f2wm zE^A^{!XlZ36iKfQfs@=#fio5-T4gQ;i_pCpe-zhWVbq4T$%1W>=0>|UAQjVN7WW8M zxrp58|LPDcv^5TTJzS`BJbsHPUG&*3e+Hy#{ke#+>X{U!7pR)FO4GHEggGqZ&knNA z)CKYO%(5eLP8v`UQ-{}OdssFR5-%0u%yCHI(3V2bRB$|X0lE7nf4tyUS`_*kDk(00uD2D4wy5t}8-q1yF8|(>eiWjAtsv^bqS07{q8s@%l0MnPs#`I$mc< zq4t^)N{{@so1%li>UKVO)#=kDYikCA=)AT6HPrF=|M>CuL%zOwZjjAoGTf90xNgWK z87A`@8u&sC29=q9f>8oXj(oLWe?@LmXs00Fk0{NJQ8*7JAY>Ix55tmzdYC(*Qs6~b z2Vi^{Fd0HU>-}b{Vjf7W%&CIOcvTf*)LxjqbBA{wjE(D&Rt7HeKo=bH4p=bP%uG0f z;B#Ffi}24%O|abX`dIe1c)MZ;Zx%>)#nXn9;d=toNUzYzcPIhLrT#H$e+h;>SYt}v zLux8x>xz=rRihSJIBHnXZdcUc+q2*~N4UbEt_HSAhX1ef+}=>a#VV4Bfc#)pbA=+1 zi4#V+DLZ;=`H(unCBTp#!AwLby1j|)D@<>)az7e*U<0w&B8>gC<&9Wc8AKCgK4n4F z&Ypx48C29OiK)eiBC5b>e@MY+yfSUS8X~scE+Q^^wcyV7{@0ux`;6L%`g3hxD5q

jO)VrZ6o^}gZ5)5I9=7qaI*&~+k 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 GS^qyq`BY5+ delta 31493 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 j

Y<4ZX2FpeAqZ#+m5O_Nl`=mK3W+7b4= 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 aNgop}88Iumcgjy|LD}KqODm!rO!^0v!f6x$ literal 0 HcmV?d00001 From 50fa6a1c721f98f7bd5ab4d56f8e859b814f09ec Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:53:26 +0800 Subject: [PATCH 503/524] Update 37.Inner Class.md --- 37.Inner Class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/37.Inner Class.md b/37.Inner Class.md index d44b03b..736b818 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -8,4 +8,4 @@ * 本地内部类 * 匿名内部类 -![Inner Class](images/inner-class.jpg) +![Inner Class](images/inner-class.png) From 69a4e18cb8fcc0ae460f879065ba47b77edb619b Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:54:41 +0800 Subject: [PATCH 504/524] Update 37.Inner Class.md --- 37.Inner Class.md | 1 + 1 file changed, 1 insertion(+) diff --git a/37.Inner Class.md b/37.Inner Class.md index 736b818..d8b6d24 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -9,3 +9,4 @@ * 匿名内部类 ![Inner Class](images/inner-class.png) + From 362aa8c8cbefce8027a128701ec53f53da40e9c6 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:54:58 +0800 Subject: [PATCH 505/524] Update 37.Inner Class.md --- 37.Inner Class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/37.Inner Class.md b/37.Inner Class.md index d8b6d24..f17c8ef 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -9,4 +9,4 @@ * 匿名内部类 ![Inner Class](images/inner-class.png) - + From d634db41dd5e4f7f10133916af035caeb47320b8 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:55:27 +0800 Subject: [PATCH 506/524] Update 37.Inner Class.md --- 37.Inner Class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/37.Inner Class.md b/37.Inner Class.md index f17c8ef..0520b7c 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -9,4 +9,4 @@ * 匿名内部类 ![Inner Class](images/inner-class.png) - + From 68fd4e3d873ffeefc62d114d4c86b61ca6285812 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:55:44 +0800 Subject: [PATCH 507/524] Update 37.Inner Class.md --- 37.Inner Class.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/37.Inner Class.md b/37.Inner Class.md index 0520b7c..171857b 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -7,6 +7,5 @@ * 内部类 * 本地内部类 * 匿名内部类 - -![Inner Class](images/inner-class.png) + From 348e450aae099d4c75c2b34650d8ade651b03593 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 13:56:34 +0800 Subject: [PATCH 508/524] Update 37.Inner Class.md --- 37.Inner Class.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/37.Inner Class.md b/37.Inner Class.md index 171857b..4ab3da0 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -9,3 +9,11 @@ * 匿名内部类 + +##37.2 静态内部类 + +##37.3 内部类 + +##37.4 本地内部类 + +##37.5 匿名内部类 From a1a86ff8802d026db3b8edf08d50361eeb09310e Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 14:15:32 +0800 Subject: [PATCH 509/524] Update 37.Inner Class.md --- 37.Inner Class.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/37.Inner Class.md b/37.Inner Class.md index 4ab3da0..f7442b4 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -10,7 +10,30 @@ -##37.2 静态内部类 +##37.2 静态内部类(或者接口) + +在类(或者接口)内部以声明类变量的方法声明的类被称为**静态内部类(接口)**。由于外部和内部可以是类或者接口,因此,会有以下四种情况: + +```Java +class Outer { // 外部是类,内部是类 + static class Inner {} +} +``` +```Java +interface Outer { // 外部是接口,内部是类 + static class Inner {} +} +``` +```Java +class Outer { // 外部是类,内部是接口 + static interface Inner {} +} +``` +```Java +interface Outer { // 外部是接口,内部是接口 + static interface Inner {} +} +``` ##37.3 内部类 From d743c76289a1f9cd0ef57f59082f0a54ca477e8d Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 14:17:22 +0800 Subject: [PATCH 510/524] Update 37.Inner Class.md --- 37.Inner Class.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/37.Inner Class.md b/37.Inner Class.md index f7442b4..c8ed992 100644 --- a/37.Inner Class.md +++ b/37.Inner Class.md @@ -35,6 +35,9 @@ interface Outer { // 外部是接口,内部是接口 } ``` +**主要注意的点:** + * Java中,除了静态内部类(接口)以外的类或者接口都不能使用static修饰; + ##37.3 内部类 ##37.4 本地内部类 From ea08eb48376e260925a74079d46945dbcfa2ff76 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 14:18:04 +0800 Subject: [PATCH 511/524] Rename 37.Inner Class.md to 37.Inner-Class.md --- 37.Inner Class.md => 37.Inner-Class.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 37.Inner Class.md => 37.Inner-Class.md (100%) diff --git a/37.Inner Class.md b/37.Inner-Class.md similarity index 100% rename from 37.Inner Class.md rename to 37.Inner-Class.md From c3af0179acab4be5486dc067724a40bc710dba61 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 14:23:25 +0800 Subject: [PATCH 512/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index c8ed992..628f70e 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -12,7 +12,7 @@ ##37.2 静态内部类(或者接口) -在类(或者接口)内部以声明类变量的方法声明的类被称为**静态内部类(接口)**。由于外部和内部可以是类或者接口,因此,会有以下四种情况: +在类(或者接口)内部以声明类成员的方法声明的类被称为**静态内部类(接口)**。由于外部和内部可以是类或者接口,因此,会有以下四种情况: ```Java class Outer { // 外部是类,内部是类 @@ -35,6 +35,8 @@ interface Outer { // 外部是接口,内部是接口 } ``` +由于接口中的成员隐含地使用了static关键字修饰,因此当外部是接口时,静态内部类(接口)的static关键字可以不用显式声明。 + **主要注意的点:** * Java中,除了静态内部类(接口)以外的类或者接口都不能使用static修饰; From 6e446d410a7b532195f4e9ffd7995783c9d2f8df Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 17:05:27 +0800 Subject: [PATCH 513/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index 628f70e..b86772d 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -38,7 +38,8 @@ interface Outer { // 外部是接口,内部是接口 由于接口中的成员隐含地使用了static关键字修饰,因此当外部是接口时,静态内部类(接口)的static关键字可以不用显式声明。 **主要注意的点:** - * Java中,除了静态内部类(接口)以外的类或者接口都不能使用static修饰; + * Java中,除了静态内部类(接口)以外的类或者接口都不能使用static修饰。C#中的类可以用static修饰,static修饰的类不能被实例化; + * **静态内部类与普通的类唯一的区别就只在于:静态内部类嵌套在其他的类内部;** ##37.3 内部类 From c5279fd9519807d4dbee8c33ce240114c97c6aaa Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 17:11:49 +0800 Subject: [PATCH 514/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index b86772d..65dac8d 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -40,9 +40,13 @@ interface Outer { // 外部是接口,内部是接口 **主要注意的点:** * Java中,除了静态内部类(接口)以外的类或者接口都不能使用static修饰。C#中的类可以用static修饰,static修饰的类不能被实例化; * **静态内部类与普通的类唯一的区别就只在于:静态内部类嵌套在其他的类内部;** + * 静态内部类可以访问外部类的私有类变量或类方法; + * 外部类可以访问内部类的私有成员变量或方法, 当然,必须在持有静态内部类实例的前提下; ##37.3 内部类 + + ##37.4 本地内部类 ##37.5 匿名内部类 From 466fa4fc52ed4c94898d70b6a675a054c19fdc11 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 17:17:47 +0800 Subject: [PATCH 515/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index 65dac8d..abf99e8 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -45,7 +45,7 @@ interface Outer { // 外部是接口,内部是接口 ##37.3 内部类 - +在类内部以声明实例成员的方法声明的类(接口)被称为(非静态内部类(接口))**。由于接口中的方法会隐含static的修饰,所以不存在接口非静态内部类(接口)(Inner non-statc Class or Interface)。 ##37.4 本地内部类 From 0068f920b003b444e23864021d7f2f427ea0ffa0 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 17:24:12 +0800 Subject: [PATCH 516/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index abf99e8..1009d34 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -47,6 +47,12 @@ interface Outer { // 外部是接口,内部是接口 在类内部以声明实例成员的方法声明的类(接口)被称为(非静态内部类(接口))**。由于接口中的方法会隐含static的修饰,所以不存在接口非静态内部类(接口)(Inner non-statc Class or Interface)。 +**需要注意的点:** + * 内部类的实例化需要依赖外部类,也就是说,要new一个内部类,需要要持有外部类实例。 + * 内部类实例存在,则一定会有对应的外部类实例,反过来则不通; + * 内部类可以访问外部类的私有成员变量和方法; + * 外部类可以访问内部类的私有成员变量和方法,前期是必须持有内部类的相关实例; + ##37.4 本地内部类 ##37.5 匿名内部类 From 548b7b334c3ef9d62f602f5635c234998fc700e4 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 18:02:16 +0800 Subject: [PATCH 517/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index 1009d34..49dcfb2 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -48,10 +48,12 @@ interface Outer { // 外部是接口,内部是接口 在类内部以声明实例成员的方法声明的类(接口)被称为(非静态内部类(接口))**。由于接口中的方法会隐含static的修饰,所以不存在接口非静态内部类(接口)(Inner non-statc Class or Interface)。 **需要注意的点:** - * 内部类的实例化需要依赖外部类,也就是说,要new一个内部类,需要要持有外部类实例。 + * 内部类的实例化需要依赖外部类,也就是说,要new一个内部类,需要要持有外部类实例; + * 内部类会隐含持有外部类实例的引用,当内部类存在时,对应的外部类不会被GC掉; * 内部类实例存在,则一定会有对应的外部类实例,反过来则不通; * 内部类可以访问外部类的私有成员变量和方法; - * 外部类可以访问内部类的私有成员变量和方法,前期是必须持有内部类的相关实例; + * 外部类可以访问内部类的私有成员变量和方法,前提是必须持有内部类的相关实例;、 + * 内部类不能声明静态变量或静态方法; ##37.4 本地内部类 From 82f6d3312a16c09b3d27fffd974bd32dbfb55df7 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Mon, 6 Jun 2016 18:03:56 +0800 Subject: [PATCH 518/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index 49dcfb2..3d893ee 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -45,7 +45,7 @@ interface Outer { // 外部是接口,内部是接口 ##37.3 内部类 -在类内部以声明实例成员的方法声明的类(接口)被称为(非静态内部类(接口))**。由于接口中的方法会隐含static的修饰,所以不存在接口非静态内部类(接口)(Inner non-statc Class or Interface)。 +在类内部以声明实例成员的方法声明的类(接口)被称为(非静态内部类(接口))。由于接口中的方法会隐含static的修饰,所以不存在接口非静态内部类(接口)(Inner non-statc Class or Interface)。 **需要注意的点:** * 内部类的实例化需要依赖外部类,也就是说,要new一个内部类,需要要持有外部类实例; @@ -55,6 +55,6 @@ interface Outer { // 外部是接口,内部是接口 * 外部类可以访问内部类的私有成员变量和方法,前提是必须持有内部类的相关实例;、 * 内部类不能声明静态变量或静态方法; -##37.4 本地内部类 +##37.4 局部内部类 ##37.5 匿名内部类 From 8b60873f16d434a1392c90449bca2dd2ec4f011a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 7 Jun 2016 01:48:54 +0800 Subject: [PATCH 519/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index 3d893ee..7cf8f1c 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -57,4 +57,16 @@ interface Outer { // 外部是接口,内部是接口 ##37.4 局部内部类 +在代码块(例如方法、构造方法内部等)内部声明的类被称为局部内部类。 + +例如: +```Java +class SomeClass { + void someFunction() { + class Local { + } + } +} +``` + ##37.5 匿名内部类 From cbfffb78827bc4ebb25e81ba8b64403e46215d3a Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Tue, 7 Jun 2016 02:35:31 +0800 Subject: [PATCH 520/524] Update 37.Inner-Class.md --- 37.Inner-Class.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/37.Inner-Class.md b/37.Inner-Class.md index 7cf8f1c..02c81e7 100644 --- a/37.Inner-Class.md +++ b/37.Inner-Class.md @@ -69,4 +69,28 @@ class SomeClass { } ``` +**需要注意的点:** + * 局部内部类仅限于声明它的方法块的内部使用; + * 局部内部类可以继承其他类或者实现其他接口; + * 局部内部类可以访问所在方法块里的所有变量,访问的变量必须使用final声明; + ##37.5 匿名内部类 + +与局部内部类不同的时,匿名内部类没有类名,由于没有类型,匿名内部类不能声明自己的构造函数。 + +```Java +class SomeClass { + void someFunction() { + new Object() { }; + } +} +``` + +**需要注意的点:** + * 使用匿名内部类时,不能显式使用继承和实现接口,实际上匿名内部类已经隐含了这层关系; + * 匿名内部类可以访问所在方法块里的所有变量,访问的变量必须使用final声明; + * 局部内部类可以访问所在方法块里的所有变量,访问的变量必须使用final声明; + +##37.6 Why Final + +http://feiyeguohai.iteye.com/blog/1500108 From 7970fd073d8ca8c368f6d2b22e93a5532485280c Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Wed, 8 Jun 2016 17:03:02 +0800 Subject: [PATCH 521/524] =?UTF-8?q?Update=2000.=E5=BE=85=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E9=97=AE=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\345\206\263\351\227\256\351\242\230.md" | 33 ------------------- 1 file changed, 33 deletions(-) diff --git "a/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md" "b/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md" index f36ba9b..93703e9 100644 --- "a/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md" +++ "b/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md" @@ -1,35 +1,2 @@ #00.待解决问题 -* 如何禁止用户登出之后浏览器的回退功能? -* log4j的详细配置:参考这里 -* log4j使用数据库 -* 测试的内存数据库 -* jbmp 5 -* Spring web flow -* Lucens -* Hadoop -* aop -* webservice -* mybatis -* spring security -* nosql -* ide自动生成equals、hashcode、toString -* 原型设计工具Axure -* Java异常 -* 自定义日志级别 -* 如果你的项目或类,很难进行测试,这说明,你的类或项目的结构很有问题! -* 跨域访问和同源策略 -* 安全测试 -* 性能测试 -* 各种IO模型 -* MongoDB是否可以解决大数据量的检索问题? -* mysql多账号(安全账号)、索引、试图、优化查询、调优、备份 -* service层能否互相调用【考虑权限、事务、session】? -* Spring的事务传播机制 -* 测试的类型,以及如何完成测试 -* HTTP 406 错误的原因 -* https协议,在tomcat和apache搭建 -* JNDI -* JAAS -* javascript 在线着色工具 -* 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的,毕竟站在程序的角度来看这两个根本就是同一个,如果内部类该变了,而外部方法的形参却没有改变这是难以理解和不可接受的,所以为了保持参数的一致性,就规定使用final来避免形参的不改变。 From 4ba9de782daad97d735946927663d08f6b6f3b71 Mon Sep 17 00:00:00 2001 From: cokepluscarbon <93948886@qq.com> Date: Fri, 3 Jun 2016 03:49:20 +0800 Subject: [PATCH 522/524] JMM --- .../Java Virtual Machine.mmap | Bin 317017 -> 449849 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Java-Virtual-Machine/Java Virtual Machine.mmap b/Java-Virtual-Machine/Java Virtual Machine.mmap index a28d1491af8e0a85440e5817be70898b7895cec0..c41c38d1602b4c46e72dfeeb9f9319b6aa1ed18c 100644 GIT binary patch delta 158343 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 R42Vk+L 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