From 5d1fe1d7d95502f7a5d39f2d43c3530adc6a7e97 Mon Sep 17 00:00:00 2001 From: Shusheng Shi <2855845850@qq.com> Date: Sun, 1 Apr 2018 03:35:52 +0800 Subject: [PATCH 01/24] Initial commit --- .gitignore | 22 ++++++ LICENSE | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 + 3 files changed, 225 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6143e53 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..01fdb52 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# concurrency +Java 高并发解决方案demo From a59c1e2b6a0417a7fa0441d05fc986862d8b3e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=B6=E6=9B=99=E7=94=9F?= Date: Sun, 1 Apr 2018 06:30:05 +0800 Subject: [PATCH 02/24] init --- .gitignore | 4 + .idea/artifacts/concurrency_war.xml | 8 + .idea/artifacts/concurrency_war_exploded.xml | 58 +++++ .idea/dictionaries/shishusheng.xml | 3 + .idea/encodings.xml | 6 + .idea/inspectionProfiles/Project_Default.xml | 36 +++ ..._ch_qos_logback_logback_classic_1_1_11.xml | 13 + ...en__ch_qos_logback_logback_core_1_1_11.xml | 13 + .../Maven__com_fasterxml_classmate_1_3_4.xml | 13 + ...jackson_core_jackson_annotations_2_8_0.xml | 13 + ...erxml_jackson_core_jackson_core_2_8_10.xml | 13 + ...l_jackson_core_jackson_databind_2_8_10.xml | 13 + ..._com_google_code_findbugs_jsr305_1_3_9.xml | 13 + ...orprone_error_prone_annotations_2_0_18.xml | 13 + .../Maven__com_google_guava_guava_23_0.xml | 13 + ...m_google_j2objc_j2objc_annotations_1_1.xml | 13 + ...n__com_jayway_jsonpath_json_path_2_2_0.xml | 13 + ...ogle_android_json_0_0_20131108_vaadin1.xml | 13 + ..._validation_validation_api_1_1_0_Final.xml | 13 + .../Maven__joda_time_joda_time_2_9.xml | 13 + .idea/libraries/Maven__junit_junit_4_12.xml | 13 + ...Maven__net_minidev_accessors_smart_1_1.xml | 13 + .../Maven__net_minidev_json_smart_2_2_1.xml | 13 + ...org_apache_commons_commons_pool2_2_4_3.xml | 13 + ..._tomcat_embed_tomcat_embed_core_8_5_23.xml | 13 + ...he_tomcat_embed_tomcat_embed_el_8_5_23.xml | 13 + ...at_embed_tomcat_embed_websocket_8_5_23.xml | 13 + ...e_tomcat_tomcat_annotations_api_8_5_23.xml | 13 + .../Maven__org_assertj_assertj_core_2_6_0.xml | 13 + ...s_mojo_animal_sniffer_annotations_1_14.xml | 13 + .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 + ...ven__org_hamcrest_hamcrest_library_1_3.xml | 13 + ...ernate_hibernate_validator_5_3_6_Final.xml | 13 + ...boss_logging_jboss_logging_3_3_1_Final.xml | 13 + ...aven__org_mockito_mockito_core_1_10_19.xml | 13 + .../Maven__org_objenesis_objenesis_2_1.xml | 13 + .../Maven__org_ow2_asm_asm_5_0_3.xml | 13 + ...aven__org_projectlombok_lombok_1_16_10.xml | 13 + ...aven__org_skyscreamer_jsonassert_1_4_0.xml | 13 + ...Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml | 13 + .../Maven__org_slf4j_jul_to_slf4j_1_7_25.xml | 13 + ...ven__org_slf4j_log4j_over_slf4j_1_7_25.xml | 13 + .../Maven__org_slf4j_slf4j_api_1_7_25.xml | 13 + ...amework_boot_spring_boot_1_5_9_RELEASE.xml | 13 + ...pring_boot_autoconfigure_1_5_9_RELEASE.xml | 13 + ...boot_spring_boot_starter_1_5_9_RELEASE.xml | 13 + ...ing_boot_starter_logging_1_5_9_RELEASE.xml | 13 + ...spring_boot_starter_test_1_5_9_RELEASE.xml | 13 + ...ring_boot_starter_tomcat_1_5_9_RELEASE.xml | 13 + ..._spring_boot_starter_web_1_5_9_RELEASE.xml | 13 + ...rk_boot_spring_boot_test_1_5_9_RELEASE.xml | 13 + ..._boot_test_autoconfigure_1_5_9_RELEASE.xml | 13 + ...ingframework_spring_aop_4_3_13_RELEASE.xml | 13 + ...gframework_spring_beans_4_3_13_RELEASE.xml | 13 + ...ramework_spring_context_4_3_13_RELEASE.xml | 13 + ...ngframework_spring_core_4_3_13_RELEASE.xml | 13 + ...ework_spring_expression_4_3_13_RELEASE.xml | 13 + ...ngframework_spring_test_4_3_13_RELEASE.xml | 13 + ...ingframework_spring_web_4_3_13_RELEASE.xml | 13 + ...framework_spring_webmvc_4_3_13_RELEASE.xml | 13 + .../Maven__org_yaml_snakeyaml_1_17.xml | 13 + .../Maven__redis_clients_jedis_2_8_2.xml | 13 + .idea/misc.xml | 16 ++ .idea/modules.xml | 8 + .idea/uiDesigner.xml | 6 + .idea/vcs.xml | 6 + HighConcurrency/README.md | 30 +++ HighConcurrency/concurrency.iml | 123 ++++++++++ HighConcurrency/mvnw | 225 ++++++++++++++++++ HighConcurrency/mvnw.cmd | 143 +++++++++++ HighConcurrency/pom.xml | 104 ++++++++ .../concurrency/ConcurrencyApplication.java | 33 +++ .../mmall/concurrency/ConcurrencyTest.java | 47 ++++ .../com/mmall/concurrency/HttpFilter.java | 35 +++ .../mmall/concurrency/HttpInterceptor.java | 25 ++ .../mmall/concurrency/ServletInitializer.java | 13 + .../com/mmall/concurrency/TestController.java | 17 ++ .../concurrency/annoations/NotRecommend.java | 16 ++ .../concurrency/annoations/NotThreadSafe.java | 16 ++ .../concurrency/annoations/Recommend.java | 16 ++ .../concurrency/annoations/ThreadSafe.java | 16 ++ .../example/aqs/CountDownLatchExample1.java | 42 ++++ .../example/aqs/CountDownLatchExample2.java | 42 ++++ .../example/aqs/CyclicBarrierExample1.java | 38 +++ .../example/aqs/CyclicBarrierExample2.java | 43 ++++ .../example/aqs/CyclicBarrierExample3.java | 40 ++++ .../example/aqs/ForkJoinTaskExample.java | 66 +++++ .../example/aqs/FutureExample.java | 31 +++ .../example/aqs/FutureTaskExample.java | 27 +++ .../example/aqs/SemaphoreExample1.java | 40 ++++ .../example/aqs/SemaphoreExample2.java | 39 +++ .../example/aqs/SemaphoreExample3.java | 41 ++++ .../example/aqs/SemaphoreExample4.java | 41 ++++ .../example/atomic/AtomicExample1.java | 49 ++++ .../example/atomic/AtomicExample2.java | 49 ++++ .../example/atomic/AtomicExample3.java | 49 ++++ .../example/atomic/AtomicExample4.java | 27 +++ .../example/atomic/AtomicExample5.java | 34 +++ .../example/atomic/AtomicExample6.java | 50 ++++ .../example/cache/CacheController.java | 29 +++ .../example/cache/GuavaCacheExample1.java | 57 +++++ .../example/cache/GuavaCacheExample2.java | 67 ++++++ .../example/cache/RedisClient.java | 40 ++++ .../example/cache/RedisConfig.java | 16 ++ .../commonUnsafe/ArrayListExample.java | 50 ++++ .../commonUnsafe/DateFormatExample1.java | 51 ++++ .../commonUnsafe/DateFormatExample2.java | 50 ++++ .../commonUnsafe/DateFormatExample3.java | 50 ++++ .../example/commonUnsafe/HashMapExample.java | 50 ++++ .../example/commonUnsafe/HashSetExample.java | 50 ++++ .../example/commonUnsafe/StringExample1.java | 47 ++++ .../example/commonUnsafe/StringExample2.java | 47 ++++ .../concurrent/ConcurrentHashMapExample.java | 50 ++++ .../ConcurrentSkipListMapExample.java | 51 ++++ .../ConcurrentSkipListSetExample.java | 50 ++++ .../CopyOnWriteArrayListExample.java | 51 ++++ .../CopyOnWriteArraySetExample.java | 50 ++++ .../example/count/CountExample1.java | 47 ++++ .../example/count/CountExample2.java | 49 ++++ .../example/count/CountExample3.java | 47 ++++ .../example/count/CountExample4.java | 50 ++++ .../example/deadLock/DeadLock.java | 59 +++++ .../example/hystrix/HystrixController1.java | 51 ++++ .../example/hystrix/HystrixController2.java | 48 ++++ .../example/hystrix/HystrixController3.java | 39 +++ .../example/immutable/ImmutableExample1.java | 34 +++ .../example/immutable/ImmutableExample2.java | 28 +++ .../example/immutable/ImmutableExample3.java | 24 ++ .../example/lock/LockExample1.java | 47 ++++ .../example/lock/LockExample2.java | 56 +++++ .../example/lock/LockExample3.java | 52 ++++ .../example/lock/LockExample4.java | 59 +++++ .../example/lock/LockExample5.java | 55 +++++ .../example/lock/LockExample6.java | 40 ++++ .../concurrency/example/package-info.java | 1 + .../concurrency/example/publish/Escape.java | 28 +++ .../example/publish/UnsafePublish.java | 25 ++ .../rateLimiter/RateLimiterExample1.java | 25 ++ .../rateLimiter/RateLimiterExample2.java | 24 ++ .../example/singleton/SingletonExample1.java | 27 +++ .../example/singleton/SingletonExample2.java | 24 ++ .../example/singleton/SingletonExample3.java | 29 +++ .../example/singleton/SingletonExample4.java | 41 ++++ .../example/singleton/SingletonExample5.java | 35 +++ .../example/singleton/SingletonExample6.java | 33 +++ .../example/singleton/SingletonExample7.java | 36 +++ .../example/sync/SynchronizedExample1.java | 38 +++ .../example/sync/SynchronizedExample2.java | 38 +++ .../syncContainer/CollectionsExample1.java | 52 ++++ .../syncContainer/CollectionsExample2.java | 51 ++++ .../syncContainer/CollectionsExample3.java | 51 ++++ .../syncContainer/HashTableExample.java | 51 ++++ .../example/syncContainer/VectorExample1.java | 50 ++++ .../example/syncContainer/VectorExample2.java | 39 +++ .../example/syncContainer/VectorExample3.java | 45 ++++ .../example/threadLocal/RequestHolder.java | 18 ++ .../threadLocal/ThreadLocalController.java | 16 ++ .../threadPool/ThreadPoolExample1.java | 26 ++ .../threadPool/ThreadPoolExample2.java | 26 ++ .../threadPool/ThreadPoolExample3.java | 26 ++ .../threadPool/ThreadPoolExample4.java | 42 ++++ HighConcurrency/src/main/main.iml | 11 + .../ConcurrencyApplicationTests.java | 16 ++ HighConcurrency/src/test/test.iml | 11 + README.md | 25 +- concurrency.iml | 85 +++++++ mvnw | 225 ++++++++++++++++++ mvnw.cmd | 143 +++++++++++ pom.xml | 75 ++++++ .../concurrency/ConcurrencyApplication.java | 29 +++ .../mmall/concurrency/ConcurrencyTest.java | 47 ++++ .../com/mmall/concurrency/HttpFilter.java | 35 +++ .../mmall/concurrency/HttpInterceptor.java | 25 ++ .../mmall/concurrency/ServletInitializer.java | 13 + .../com/mmall/concurrency/TestController.java | 17 ++ .../concurrency/annoations/NotRecommend.java | 16 ++ .../concurrency/annoations/NotThreadSafe.java | 16 ++ .../concurrency/annoations/Recommend.java | 16 ++ .../concurrency/annoations/ThreadSafe.java | 16 ++ .../example/aqs/CountDownLatchExample1.java | 42 ++++ .../example/aqs/CountDownLatchExample2.java | 42 ++++ .../example/aqs/CyclicBarrierExample1.java | 38 +++ .../example/aqs/CyclicBarrierExample2.java | 43 ++++ .../example/aqs/CyclicBarrierExample3.java | 40 ++++ .../example/aqs/ForkJoinTaskExample.java | 66 +++++ .../example/aqs/FutureExample.java | 31 +++ .../example/aqs/FutureTaskExample.java | 27 +++ .../example/aqs/SemaphoreExample1.java | 40 ++++ .../example/aqs/SemaphoreExample2.java | 39 +++ .../example/aqs/SemaphoreExample3.java | 41 ++++ .../example/aqs/SemaphoreExample4.java | 41 ++++ .../example/atomic/AtomicExample1.java | 49 ++++ .../example/atomic/AtomicExample2.java | 49 ++++ .../example/atomic/AtomicExample3.java | 49 ++++ .../example/atomic/AtomicExample4.java | 27 +++ .../example/atomic/AtomicExample5.java | 34 +++ .../example/atomic/AtomicExample6.java | 50 ++++ .../commonUnsafe/ArrayListExample.java | 50 ++++ .../commonUnsafe/DateFormatExample1.java | 51 ++++ .../commonUnsafe/DateFormatExample2.java | 50 ++++ .../commonUnsafe/DateFormatExample3.java | 50 ++++ .../example/commonUnsafe/HashMapExample.java | 50 ++++ .../example/commonUnsafe/HashSetExample.java | 50 ++++ .../example/commonUnsafe/StringExample1.java | 47 ++++ .../example/commonUnsafe/StringExample2.java | 47 ++++ .../concurrent/ConcurrentHashMapExample.java | 50 ++++ .../ConcurrentSkipListMapExample.java | 51 ++++ .../ConcurrentSkipListSetExample.java | 50 ++++ .../CopyOnWriteArrayListExample.java | 51 ++++ .../CopyOnWriteArraySetExample.java | 50 ++++ .../example/count/CountExample1.java | 47 ++++ .../example/count/CountExample2.java | 49 ++++ .../example/count/CountExample3.java | 47 ++++ .../example/count/CountExample4.java | 50 ++++ .../example/deadLock/DeadLock.java | 59 +++++ .../example/immutable/ImmutableExample1.java | 34 +++ .../example/immutable/ImmutableExample2.java | 28 +++ .../example/immutable/ImmutableExample3.java | 24 ++ .../example/lock/LockExample1.java | 47 ++++ .../example/lock/LockExample2.java | 56 +++++ .../example/lock/LockExample3.java | 52 ++++ .../example/lock/LockExample4.java | 59 +++++ .../example/lock/LockExample5.java | 55 +++++ .../example/lock/LockExample6.java | 40 ++++ .../concurrency/example/package-info.java | 1 + .../concurrency/example/publish/Escape.java | 28 +++ .../example/publish/UnsafePublish.java | 25 ++ .../example/singleton/SingletonExample1.java | 27 +++ .../example/singleton/SingletonExample2.java | 24 ++ .../example/singleton/SingletonExample3.java | 29 +++ .../example/singleton/SingletonExample4.java | 41 ++++ .../example/singleton/SingletonExample5.java | 35 +++ .../example/singleton/SingletonExample6.java | 33 +++ .../example/singleton/SingletonExample7.java | 36 +++ .../example/sync/SynchronizedExample1.java | 38 +++ .../example/sync/SynchronizedExample2.java | 38 +++ .../syncContainer/CollectionsExample1.java | 52 ++++ .../syncContainer/CollectionsExample2.java | 51 ++++ .../syncContainer/CollectionsExample3.java | 51 ++++ .../syncContainer/HashTableExample.java | 51 ++++ .../example/syncContainer/VectorExample1.java | 50 ++++ .../example/syncContainer/VectorExample2.java | 39 +++ .../example/syncContainer/VectorExample3.java | 45 ++++ .../example/threadLocal/RequestHolder.java | 18 ++ .../threadLocal/ThreadLocalController.java | 16 ++ .../threadPool/ThreadPoolExample1.java | 26 ++ .../threadPool/ThreadPoolExample2.java | 26 ++ .../threadPool/ThreadPoolExample3.java | 26 ++ .../threadPool/ThreadPoolExample4.java | 42 ++++ .../ConcurrencyApplicationTests.java | 16 ++ 250 files changed, 8749 insertions(+), 2 deletions(-) create mode 100644 .idea/artifacts/concurrency_war.xml create mode 100644 .idea/artifacts/concurrency_war_exploded.xml create mode 100644 .idea/dictionaries/shishusheng.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_11.xml create mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_core_1_1_11.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_10.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_10.xml create mode 100644 .idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml create mode 100644 .idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_0_18.xml create mode 100644 .idea/libraries/Maven__com_google_guava_guava_23_0.xml create mode 100644 .idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml create mode 100644 .idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml create mode 100644 .idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml create mode 100644 .idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml create mode 100644 .idea/libraries/Maven__joda_time_joda_time_2_9.xml create mode 100644 .idea/libraries/Maven__junit_junit_4_12.xml create mode 100644 .idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml create mode 100644 .idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_3.xml create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_23.xml create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_23.xml create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_23.xml create mode 100644 .idea/libraries/Maven__org_apache_tomcat_tomcat_annotations_api_8_5_23.xml create mode 100644 .idea/libraries/Maven__org_assertj_assertj_core_2_6_0.xml create mode 100644 .idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml create mode 100644 .idea/libraries/Maven__org_hibernate_hibernate_validator_5_3_6_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml create mode 100644 .idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml create mode 100644 .idea/libraries/Maven__org_objenesis_objenesis_2_1.xml create mode 100644 .idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml create mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml create mode 100644 .idea/libraries/Maven__org_skyscreamer_jsonassert_1_4_0.xml create mode 100644 .idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml create mode 100644 .idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_25.xml create mode 100644 .idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_test_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_web_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_webmvc_4_3_13_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml create mode 100644 .idea/libraries/Maven__redis_clients_jedis_2_8_2.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100755 HighConcurrency/README.md create mode 100755 HighConcurrency/concurrency.iml create mode 100755 HighConcurrency/mvnw create mode 100755 HighConcurrency/mvnw.cmd create mode 100755 HighConcurrency/pom.xml create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyTest.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/annoations/Recommend.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/CacheController.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisClient.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisConfig.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java create mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java create mode 100755 HighConcurrency/src/main/main.iml create mode 100755 HighConcurrency/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java create mode 100755 HighConcurrency/src/test/test.iml mode change 100644 => 100755 README.md create mode 100644 concurrency.iml create mode 100755 mvnw create mode 100755 mvnw.cmd create mode 100755 pom.xml create mode 100755 src/main/java/com/mmall/concurrency/ConcurrencyApplication.java create mode 100755 src/main/java/com/mmall/concurrency/ConcurrencyTest.java create mode 100755 src/main/java/com/mmall/concurrency/HttpFilter.java create mode 100755 src/main/java/com/mmall/concurrency/HttpInterceptor.java create mode 100755 src/main/java/com/mmall/concurrency/ServletInitializer.java create mode 100755 src/main/java/com/mmall/concurrency/TestController.java create mode 100755 src/main/java/com/mmall/concurrency/annoations/NotRecommend.java create mode 100755 src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java create mode 100755 src/main/java/com/mmall/concurrency/annoations/Recommend.java create mode 100755 src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java create mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java create mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java create mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/count/CountExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/count/CountExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/count/CountExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/count/CountExample4.java create mode 100755 src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java create mode 100755 src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample4.java create mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample5.java create mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample6.java create mode 100755 src/main/java/com/mmall/concurrency/example/package-info.java create mode 100755 src/main/java/com/mmall/concurrency/example/publish/Escape.java create mode 100755 src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java create mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java create mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java create mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java create mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java create mode 100755 src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java create mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java create mode 100755 src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java create mode 100755 src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java create mode 100755 src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java create mode 100755 src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java create mode 100755 src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java create mode 100755 src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java diff --git a/.gitignore b/.gitignore index 6143e53..f4e3f40 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,7 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +/.idea/ +/target/ +/*.iml \ No newline at end of file diff --git a/.idea/artifacts/concurrency_war.xml b/.idea/artifacts/concurrency_war.xml new file mode 100644 index 0000000..09c0531 --- /dev/null +++ b/.idea/artifacts/concurrency_war.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/target + + + + + \ No newline at end of file diff --git a/.idea/artifacts/concurrency_war_exploded.xml b/.idea/artifacts/concurrency_war_exploded.xml new file mode 100644 index 0000000..2f15d66 --- /dev/null +++ b/.idea/artifacts/concurrency_war_exploded.xml @@ -0,0 +1,58 @@ + + + $PROJECT_DIR$/target/concurrency-0.0.1-SNAPSHOT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/shishusheng.xml b/.idea/dictionaries/shishusheng.xml new file mode 100644 index 0000000..881bbf2 --- /dev/null +++ b/.idea/dictionaries/shishusheng.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..b26911b --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6560a98 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_11.xml b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_11.xml new file mode 100644 index 0000000..c6ea67e --- /dev/null +++ b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_11.xml b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_11.xml new file mode 100644 index 0000000..f538e36 --- /dev/null +++ b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml new file mode 100644 index 0000000..33c30b4 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml new file mode 100644 index 0000000..49b4ec7 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_10.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_10.xml new file mode 100644 index 0000000..5d9d662 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_10.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_10.xml new file mode 100644 index 0000000..df5cb22 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml new file mode 100644 index 0000000..0e66824 --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_0_18.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_0_18.xml new file mode 100644 index 0000000..702d49b --- /dev/null +++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_0_18.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_23_0.xml b/.idea/libraries/Maven__com_google_guava_guava_23_0.xml new file mode 100644 index 0000000..589a439 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_23_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml new file mode 100644 index 0000000..c06f999 --- /dev/null +++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml new file mode 100644 index 0000000..578b079 --- /dev/null +++ b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml new file mode 100644 index 0000000..b8581a6 --- /dev/null +++ b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml b/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml new file mode 100644 index 0000000..940ce73 --- /dev/null +++ b/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__joda_time_joda_time_2_9.xml b/.idea/libraries/Maven__joda_time_joda_time_2_9.xml new file mode 100644 index 0000000..bb6a71f --- /dev/null +++ b/.idea/libraries/Maven__joda_time_joda_time_2_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml new file mode 100644 index 0000000..d411041 --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml b/.idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml new file mode 100644 index 0000000..88d626e --- /dev/null +++ b/.idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml b/.idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml new file mode 100644 index 0000000..6c692c8 --- /dev/null +++ b/.idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_3.xml b/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_3.xml new file mode 100644 index 0000000..cc0b58b --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_23.xml new file mode 100644 index 0000000..99e8c9e --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_23.xml new file mode 100644 index 0000000..9837b75 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_23.xml new file mode 100644 index 0000000..6a989bb --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_tomcat_annotations_api_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_tomcat_annotations_api_8_5_23.xml new file mode 100644 index 0000000..4aba27a --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_tomcat_annotations_api_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_assertj_assertj_core_2_6_0.xml b/.idea/libraries/Maven__org_assertj_assertj_core_2_6_0.xml new file mode 100644 index 0000000..58bdc9a --- /dev/null +++ b/.idea/libraries/Maven__org_assertj_assertj_core_2_6_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml new file mode 100644 index 0000000..1af11e4 --- /dev/null +++ b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..f58bbc1 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml new file mode 100644 index 0000000..78dbe45 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_3_6_Final.xml b/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_3_6_Final.xml new file mode 100644 index 0000000..3c0ddd4 --- /dev/null +++ b/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_3_6_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml new file mode 100644 index 0000000..6dc7a37 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml b/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml new file mode 100644 index 0000000..a523703 --- /dev/null +++ b/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml b/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml new file mode 100644 index 0000000..7ab319b --- /dev/null +++ b/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml new file mode 100644 index 0000000..da69f6c --- /dev/null +++ b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml new file mode 100644 index 0000000..2c72884 --- /dev/null +++ b/.idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_4_0.xml b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_4_0.xml new file mode 100644 index 0000000..f86d2c8 --- /dev/null +++ b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_4_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml new file mode 100644 index 0000000..bae9949 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_25.xml new file mode 100644 index 0000000..6073e53 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml new file mode 100644 index 0000000..a14ac63 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml new file mode 100644 index 0000000..20e8163 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_5_9_RELEASE.xml new file mode 100644 index 0000000..44dc419 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_9_RELEASE.xml new file mode 100644 index 0000000..4c3a2b7 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_5_9_RELEASE.xml new file mode 100644 index 0000000..c6ba5e1 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_5_9_RELEASE.xml new file mode 100644 index 0000000..33c0b1c --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_5_9_RELEASE.xml new file mode 100644 index 0000000..d7db397 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_9_RELEASE.xml new file mode 100644 index 0000000..ed7b340 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_5_9_RELEASE.xml new file mode 100644 index 0000000..f0bd94f --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_5_9_RELEASE.xml new file mode 100644 index 0000000..9312efe --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_9_RELEASE.xml new file mode 100644 index 0000000..07d7bca --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml new file mode 100644 index 0000000..e06e71e --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml new file mode 100644 index 0000000..0a8cafe --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml new file mode 100644 index 0000000..8050852 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml new file mode 100644 index 0000000..b95dd78 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml new file mode 100644 index 0000000..7a825ff --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_test_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_test_4_3_13_RELEASE.xml new file mode 100644 index 0000000..0c0fcbf --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_test_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_web_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_web_4_3_13_RELEASE.xml new file mode 100644 index 0000000..31aebfb --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_web_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_webmvc_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_webmvc_4_3_13_RELEASE.xml new file mode 100644 index 0000000..01a3291 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_webmvc_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml new file mode 100644 index 0000000..20e2920 --- /dev/null +++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__redis_clients_jedis_2_8_2.xml b/.idea/libraries/Maven__redis_clients_jedis_2_8_2.xml new file mode 100644 index 0000000..5fe8223 --- /dev/null +++ b/.idea/libraries/Maven__redis_clients_jedis_2_8_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5f61bad --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..6373207 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..8bb0e83 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/HighConcurrency/README.md b/HighConcurrency/README.md new file mode 100755 index 0000000..f46c65b --- /dev/null +++ b/HighConcurrency/README.md @@ -0,0 +1,30 @@ +# Concurrency + +## Jimin 微信公众号:TechDevPro + +不断更新,可以关注并留言自己希望学习的技术 + +## Jimin 手记地址 + +http://www.imooc.com/u/5980627/articles + +不断更新 + +## Jimin 实战课程【Java开发企业级权限管理系统】推荐 + +http://coding.imooc.com/class/149.html + + +## 课程专属的QQ学习群 + +Web端"进入课程",页面右侧会看到QQ群号,验证信息是:购买课程对应的订单号 + +进群可以额外获得学习一些【课外知识】及【面试知识】 + +## 课程脑图 + +### Java并发编程与高并发解决方案 +http://naotu.baidu.com/file/6808ea88451b49ba4964e2c81d0d2c8b?token=3a5de17f2ea7220d + +### Java开发企业级权限管理系统 +http://naotu.baidu.com/file/fe4d0ed0ce3b8dfd9b09263c0f7abf01?token=fdd400eba319d8b7 diff --git a/HighConcurrency/concurrency.iml b/HighConcurrency/concurrency.iml new file mode 100755 index 0000000..6818e80 --- /dev/null +++ b/HighConcurrency/concurrency.iml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HighConcurrency/mvnw b/HighConcurrency/mvnw new file mode 100755 index 0000000..5bf251c --- /dev/null +++ b/HighConcurrency/mvnw @@ -0,0 +1,225 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +echo $MAVEN_PROJECTBASEDIR +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/HighConcurrency/mvnw.cmd b/HighConcurrency/mvnw.cmd new file mode 100755 index 0000000..019bd74 --- /dev/null +++ b/HighConcurrency/mvnw.cmd @@ -0,0 +1,143 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/HighConcurrency/pom.xml b/HighConcurrency/pom.xml new file mode 100755 index 0000000..45cf822 --- /dev/null +++ b/HighConcurrency/pom.xml @@ -0,0 +1,104 @@ + + + 4.0.0 + + com.mmall + concurrency + 0.0.1-SNAPSHOT + war + + concurrency + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Edgware.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + 1.16.10 + + + + com.google.guava + guava + 23.0 + + + + joda-time + joda-time + 2.9 + + + + redis.clients + jedis + 2.8.2 + + + + + org.springframework.cloud + spring-cloud-starter-hystrix + + + + + org.springframework.cloud + spring-cloud-starter-hystrix-dashboard + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java b/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java new file mode 100755 index 0000000..40a57f6 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java @@ -0,0 +1,33 @@ +package com.mmall.concurrency; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; +import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@SpringBootApplication +@EnableHystrixDashboard +@EnableCircuitBreaker +public class ConcurrencyApplication extends WebMvcConfigurerAdapter{ + + public static void main(String[] args) { + SpringApplication.run(ConcurrencyApplication.class, args); + } + + @Bean + public FilterRegistrationBean httpFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new HttpFilter()); + registrationBean.addUrlPatterns("/threadLocal/*"); + return registrationBean; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HttpInterceptor()).addPathPatterns("/**"); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyTest.java b/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyTest.java new file mode 100755 index 0000000..2399b85 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyTest.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class ConcurrencyTest { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count++; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java b/HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java new file mode 100755 index 0000000..bf7b83c --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java @@ -0,0 +1,35 @@ +package com.mmall.concurrency; + +import com.mmall.concurrency.example.threadLocal.RequestHolder; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +@Slf4j +public class HttpFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; +// log.info("do filter, {}, {}", Thread.currentThread().getId(), request.getServletPath()); + RequestHolder.add(Thread.currentThread().getId()); + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java b/HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java new file mode 100755 index 0000000..737fb74 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java @@ -0,0 +1,25 @@ +package com.mmall.concurrency; + +import com.mmall.concurrency.example.threadLocal.RequestHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +public class HttpInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { +// log.info("preHandle"); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + RequestHolder.remove(); +// log.info("afterCompletion"); + return; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java b/HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java new file mode 100755 index 0000000..e741569 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java @@ -0,0 +1,13 @@ +package com.mmall.concurrency; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(ConcurrencyApplication.class); + } + +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java b/HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java new file mode 100755 index 0000000..cef6f01 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java @@ -0,0 +1,17 @@ +package com.mmall.concurrency; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@Slf4j +public class TestController { + + @RequestMapping("/test") + @ResponseBody + public String test() { + return "test"; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java new file mode 100755 index 0000000..07a140c --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【不推荐】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface NotRecommend { + + String value() default ""; +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java new file mode 100755 index 0000000..9886fb9 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【线程不安全】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface NotThreadSafe { + + String value() default ""; +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/Recommend.java b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/Recommend.java new file mode 100755 index 0000000..8a3a2bd --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/Recommend.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【推荐】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface Recommend { + + String value() default ""; +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java new file mode 100755 index 0000000..e91e512 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【线程安全】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface ThreadSafe { + + String value() default ""; +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java new file mode 100755 index 0000000..bbdf25d --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java @@ -0,0 +1,42 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class CountDownLatchExample1 { + + private final static int threadCount = 200; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final CountDownLatch countDownLatch = new CountDownLatch(threadCount); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + test(threadNum); + } catch (Exception e) { + log.error("exception", e); + } finally { + countDownLatch.countDown(); + } + }); + } + countDownLatch.await(); + log.info("finish"); + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + Thread.sleep(100); + log.info("{}", threadNum); + Thread.sleep(100); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java new file mode 100755 index 0000000..590ebb6 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java @@ -0,0 +1,42 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class CountDownLatchExample2 { + + private final static int threadCount = 200; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final CountDownLatch countDownLatch = new CountDownLatch(threadCount); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + test(threadNum); + } catch (Exception e) { + log.error("exception", e); + } finally { + countDownLatch.countDown(); + } + }); + } + countDownLatch.await(10, TimeUnit.MILLISECONDS); + log.info("finish"); + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + Thread.sleep(100); + log.info("{}", threadNum); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java new file mode 100755 index 0000000..e9a888c --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java @@ -0,0 +1,38 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class CyclicBarrierExample1 { + + private static CyclicBarrier barrier = new CyclicBarrier(5); + + public static void main(String[] args) throws Exception { + + ExecutorService executor = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int threadNum = i; + Thread.sleep(1000); + executor.execute(() -> { + try { + race(threadNum); + } catch (Exception e) { + log.error("exception", e); + } + }); + } + executor.shutdown(); + } + + private static void race(int threadNum) throws Exception { + Thread.sleep(1000); + log.info("{} is ready", threadNum); + barrier.await(); + log.info("{} continue", threadNum); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java new file mode 100755 index 0000000..1bbcf42 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java @@ -0,0 +1,43 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class CyclicBarrierExample2 { + + private static CyclicBarrier barrier = new CyclicBarrier(5); + + public static void main(String[] args) throws Exception { + + ExecutorService executor = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int threadNum = i; + Thread.sleep(1000); + executor.execute(() -> { + try { + race(threadNum); + } catch (Exception e) { + log.error("exception", e); + } + }); + } + executor.shutdown(); + } + + private static void race(int threadNum) throws Exception { + Thread.sleep(1000); + log.info("{} is ready", threadNum); + try { + barrier.await(2000, TimeUnit.MILLISECONDS); + } catch (Exception e) { + log.warn("BarrierException", e); + } + log.info("{} continue", threadNum); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java new file mode 100755 index 0000000..3105ce2 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java @@ -0,0 +1,40 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class CyclicBarrierExample3 { + + private static CyclicBarrier barrier = new CyclicBarrier(5, () -> { + log.info("callback is running"); + }); + + public static void main(String[] args) throws Exception { + + ExecutorService executor = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int threadNum = i; + Thread.sleep(1000); + executor.execute(() -> { + try { + race(threadNum); + } catch (Exception e) { + log.error("exception", e); + } + }); + } + executor.shutdown(); + } + + private static void race(int threadNum) throws Exception { + Thread.sleep(1000); + log.info("{} is ready", threadNum); + barrier.await(); + log.info("{} continue", threadNum); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java new file mode 100755 index 0000000..fba3af8 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java @@ -0,0 +1,66 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.Future; +import java.util.concurrent.RecursiveTask; + +@Slf4j +public class ForkJoinTaskExample extends RecursiveTask { + + public static final int threshold = 2; + private int start; + private int end; + + public ForkJoinTaskExample(int start, int end) { + this.start = start; + this.end = end; + } + + @Override + protected Integer compute() { + int sum = 0; + + //如果任务足够小就计算任务 + boolean canCompute = (end - start) <= threshold; + if (canCompute) { + for (int i = start; i <= end; i++) { + sum += i; + } + } else { + // 如果任务大于阈值,就分裂成两个子任务计算 + int middle = (start + end) / 2; + ForkJoinTaskExample leftTask = new ForkJoinTaskExample(start, middle); + ForkJoinTaskExample rightTask = new ForkJoinTaskExample(middle + 1, end); + + // 执行子任务 + leftTask.fork(); + rightTask.fork(); + + // 等待任务执行结束合并其结果 + int leftResult = leftTask.join(); + int rightResult = rightTask.join(); + + // 合并子任务 + sum = leftResult + rightResult; + } + return sum; + } + + public static void main(String[] args) { + ForkJoinPool forkjoinPool = new ForkJoinPool(); + + //生成一个计算任务,计算1+2+3+4 + ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100); + + //执行一个任务 + Future result = forkjoinPool.submit(task); + + try { + log.info("result:{}", result.get()); + } catch (Exception e) { + log.error("exception", e); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java new file mode 100755 index 0000000..ee36b6e --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java @@ -0,0 +1,31 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +@Slf4j +public class FutureExample { + + static class MyCallable implements Callable { + + @Override + public String call() throws Exception { + log.info("do something in callable"); + Thread.sleep(5000); + return "Done"; + } + } + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + Future future = executorService.submit(new MyCallable()); + log.info("do something in main"); + Thread.sleep(1000); + String result = future.get(); + log.info("result:{}", result); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java new file mode 100755 index 0000000..34479ad --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java @@ -0,0 +1,27 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; + +@Slf4j +public class FutureTaskExample { + + public static void main(String[] args) throws Exception { + FutureTask futureTask = new FutureTask(new Callable() { + @Override + public String call() throws Exception { + log.info("do something in callable"); + Thread.sleep(5000); + return "Done"; + } + }); + + new Thread(futureTask).start(); + log.info("do something in main"); + Thread.sleep(1000); + String result = futureTask.get(); + log.info("result:{}", result); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java new file mode 100755 index 0000000..4a32ac9 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java @@ -0,0 +1,40 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +public class SemaphoreExample1 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + semaphore.acquire(); // 获取一个许可 + test(threadNum); + semaphore.release(); // 释放一个许可 + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java new file mode 100755 index 0000000..da24aff --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java @@ -0,0 +1,39 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +public class SemaphoreExample2 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + semaphore.acquire(3); // 获取多个许可 + test(threadNum); + semaphore.release(3); // 释放多个许可 + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java new file mode 100755 index 0000000..82c6073 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java @@ -0,0 +1,41 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class SemaphoreExample3 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + if (semaphore.tryAcquire()) { // 尝试获取一个许可 + test(threadNum); + semaphore.release(); // 释放一个许可 + } + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java new file mode 100755 index 0000000..27ee7b8 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java @@ -0,0 +1,41 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class SemaphoreExample4 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + if (semaphore.tryAcquire(5000, TimeUnit.MILLISECONDS)) { // 尝试获取一个许可 + test(threadNum); + semaphore.release(); // 释放一个许可 + } + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java new file mode 100755 index 0000000..fad1bea --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@ThreadSafe +public class AtomicExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static AtomicInteger count = new AtomicInteger(0); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count.get()); + } + + private static void add() { + count.incrementAndGet(); + // count.getAndIncrement(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java new file mode 100755 index 0000000..03660b3 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicLong; + +@Slf4j +@ThreadSafe +public class AtomicExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static AtomicLong count = new AtomicLong(0); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count.get()); + } + + private static void add() { + count.incrementAndGet(); + // count.getAndIncrement(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java new file mode 100755 index 0000000..561fd4a --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; + +@Slf4j +@ThreadSafe +public class AtomicExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static LongAdder count = new LongAdder(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count.increment(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java new file mode 100755 index 0000000..e8ec003 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java @@ -0,0 +1,27 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.LongAdder; + +@Slf4j +@ThreadSafe +public class AtomicExample4 { + + private static AtomicReference count = new AtomicReference<>(0); + + public static void main(String[] args) { + count.compareAndSet(0, 2); // 2 + count.compareAndSet(0, 1); // no + count.compareAndSet(1, 3); // no + count.compareAndSet(2, 4); // 4 + count.compareAndSet(3, 5); // no + log.info("count:{}", count.get()); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java new file mode 100755 index 0000000..f52635f --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java @@ -0,0 +1,34 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicReference; + +@Slf4j +@ThreadSafe +public class AtomicExample5 { + + private static AtomicIntegerFieldUpdater updater = + AtomicIntegerFieldUpdater.newUpdater(AtomicExample5.class, "count"); + + @Getter + public volatile int count = 100; + + public static void main(String[] args) { + + AtomicExample5 example5 = new AtomicExample5(); + + if (updater.compareAndSet(example5, 100, 120)) { + log.info("update success 1, {}", example5.getCount()); + } + + if (updater.compareAndSet(example5, 100, 120)) { + log.info("update success 2, {}", example5.getCount()); + } else { + log.info("update failed, {}", example5.getCount()); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java new file mode 100755 index 0000000..69fd3a6 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicBoolean; + +@Slf4j +@ThreadSafe +public class AtomicExample6 { + + private static AtomicBoolean isHappened = new AtomicBoolean(false); + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + test(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("isHappened:{}", isHappened.get()); + } + + private static void test() { + if (isHappened.compareAndSet(false, true)) { + log.info("execute"); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/CacheController.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/CacheController.java new file mode 100755 index 0000000..2bd6a67 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/CacheController.java @@ -0,0 +1,29 @@ +package com.mmall.concurrency.example.cache; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping("/cache") +public class CacheController { + + @Autowired + private RedisClient redisClient; + + @RequestMapping("/set") + @ResponseBody + public String set(@RequestParam("k") String k, @RequestParam("v") String v) + throws Exception { + redisClient.set(k, v); + return "SUCCESS"; + } + + @RequestMapping("/get") + @ResponseBody + public String get(@RequestParam("k") String k) throws Exception { + return redisClient.get(k); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample1.java new file mode 100755 index 0000000..3e06a8a --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample1.java @@ -0,0 +1,57 @@ +package com.mmall.concurrency.example.cache; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.TimeUnit; + +@Slf4j +public class GuavaCacheExample1 { + + public static void main(String[] args) { + + LoadingCache cache = CacheBuilder.newBuilder() + .maximumSize(10) // 最多存放10个数据 + .expireAfterWrite(10, TimeUnit.SECONDS) // 缓存10秒 + .recordStats() // 开启记录状态数据功能 + .build(new CacheLoader() { + @Override + public Integer load(String key) throws Exception { + return -1; + } + }); + + log.info("{}", cache.getIfPresent("key1")); // null + cache.put("key1", 1); + log.info("{}", cache.getIfPresent("key1")); // 1 + cache.invalidate("key1"); + log.info("{}", cache.getIfPresent("key1")); // null + + try { + log.info("{}", cache.get("key2")); // -1 + cache.put("key2", 2); + log.info("{}", cache.get("key2")); // 2 + + log.info("{}", cache.size()); // 1 + + for (int i = 3; i < 13; i++) { + cache.put("key" + i, i); + } + log.info("{}", cache.size()); // 10 + + log.info("{}", cache.getIfPresent("key2")); // null + + Thread.sleep(11000); + + log.info("{}", cache.get("key5")); // -1 + + log.info("{},{}", cache.stats().hitCount(), cache.stats().missCount()); + + log.info("{},{}", cache.stats().hitRate(), cache.stats().missRate()); + } catch (Exception e) { + log.error("cache exception", e); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample2.java new file mode 100755 index 0000000..9bf370d --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample2.java @@ -0,0 +1,67 @@ +package com.mmall.concurrency.example.cache; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class GuavaCacheExample2 { + + public static void main(String[] args) { + + Cache cache = CacheBuilder.newBuilder() + .maximumSize(10) // 最多存放10个数据 + .expireAfterWrite(10, TimeUnit.SECONDS) // 缓存10秒 + .recordStats() // 开启记录状态数据功能 + .build(); + + log.info("{}", cache.getIfPresent("key1")); // null + cache.put("key1", 1); + log.info("{}", cache.getIfPresent("key1")); // 1 + cache.invalidate("key1"); + log.info("{}", cache.getIfPresent("key1")); // null + + try { + log.info("{}", cache.get("key2", new Callable() { + @Override + public Integer call() throws Exception { + return -1; + } + })); // -1 + cache.put("key2", 2); + log.info("{}", cache.get("key2", new Callable() { + @Override + public Integer call() throws Exception { + return -1; + } + })); // 2 + + log.info("{}", cache.size()); // 1 + + for (int i = 3; i < 13; i++) { + cache.put("key" + i, i); + } + log.info("{}", cache.size()); // 10 + + log.info("{}", cache.getIfPresent("key2")); // null + + Thread.sleep(11000); + + log.info("{}", cache.get("key5", new Callable() { + @Override + public Integer call() throws Exception { + return -1; + } + })); // -1 + + log.info("{},{}", cache.stats().hitCount(), cache.stats().missCount()); + + log.info("{},{}", cache.stats().hitRate(), cache.stats().missRate()); + } catch (Exception e) { + log.error("cache exception", e); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisClient.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisClient.java new file mode 100755 index 0000000..8979ce5 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisClient.java @@ -0,0 +1,40 @@ +package com.mmall.concurrency.example.cache; + +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; + +import javax.annotation.Resource; + +// http://redis.cn/ +@Component +public class RedisClient { + + @Resource(name = "redisPool") + private JedisPool jedisPool; + + public void set(String key, String value) throws Exception { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.set(key, value); + } finally { + if (jedis != null) { + jedis.close(); + } + } + } + + + public String get(String key) throws Exception { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.get(key); + } finally { + if (jedis != null) { + jedis.close(); + } + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisConfig.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisConfig.java new file mode 100755 index 0000000..e41179e --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisConfig.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.example.cache; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import redis.clients.jedis.JedisPool; + +@Configuration +public class RedisConfig { + + @Bean(name = "redisPool") + public JedisPool jedisPool(@Value("${jedis.host}") String host, + @Value("${jedis.port}") int port) { + return new JedisPool(host, port); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java new file mode 100755 index 0000000..0fa0f98 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class ArrayListExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = new ArrayList<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java new file mode 100755 index 0000000..0337434 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class DateFormatExample1 { + + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + } + + private static void update() { + try { + simpleDateFormat.parse("20180208"); + } catch (Exception e) { + log.error("parse exception", e); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java new file mode 100755 index 0000000..06c2596 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class DateFormatExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + } + + private static void update() { + try { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + simpleDateFormat.parse("20180208"); + } catch (Exception e) { + log.error("parse exception", e); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java new file mode 100755 index 0000000..9ea33c7 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class DateFormatExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyyMMdd"); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + } + + private static void update(int i) { + log.info("{}, {}", i, DateTime.parse("20180208", dateTimeFormatter).toDate()); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java new file mode 100755 index 0000000..861058c --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class HashMapExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new HashMap<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java new file mode 100755 index 0000000..3defb68 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class HashSetExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = new HashSet<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java new file mode 100755 index 0000000..efcf7a9 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class StringExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static StringBuilder stringBuilder = new StringBuilder(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", stringBuilder.length()); + } + + private static void update() { + stringBuilder.append("1"); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java new file mode 100755 index 0000000..c0e709d --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class StringExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static StringBuffer stringBuffer = new StringBuffer(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", stringBuffer.length()); + } + + private static void update() { + stringBuffer.append("1"); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java new file mode 100755 index 0000000..5cf7fe1 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class ConcurrentHashMapExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new ConcurrentHashMap<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java new file mode 100755 index 0000000..9aee082 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class ConcurrentSkipListMapExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new ConcurrentSkipListMap<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java new file mode 100755 index 0000000..5732bea --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class ConcurrentSkipListSetExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = new ConcurrentSkipListSet<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java new file mode 100755 index 0000000..1f265dc --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CopyOnWriteArrayListExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = new CopyOnWriteArrayList<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java new file mode 100755 index 0000000..81b7606 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CopyOnWriteArraySetExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = new CopyOnWriteArraySet<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java new file mode 100755 index 0000000..53c229e --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class CountExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count++; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java new file mode 100755 index 0000000..0856d27 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@ThreadSafe +public class CountExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static AtomicInteger count = new AtomicInteger(0); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count.get()); + } + + private static void add() { + count.incrementAndGet(); + // count.getAndIncrement(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java new file mode 100755 index 0000000..888ab0d --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CountExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private synchronized static void add() { + count++; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java new file mode 100755 index 0000000..c8206ce --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class CountExample4 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static volatile int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count++; + // 1、count + // 2、+1 + // 3、count + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java new file mode 100755 index 0000000..3c19f37 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java @@ -0,0 +1,59 @@ +package com.mmall.concurrency.example.deadLock; + +import lombok.extern.slf4j.Slf4j; + +/** + * 一个简单的死锁类 + * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 + * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 + * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定; + * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定; + * td1、td2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。 + */ + +@Slf4j +public class DeadLock implements Runnable { + public int flag = 1; + //静态对象是类的所有对象共享的 + private static Object o1 = new Object(), o2 = new Object(); + + @Override + public void run() { + log.info("flag:{}", flag); + if (flag == 1) { + synchronized (o1) { + try { + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } + synchronized (o2) { + log.info("1"); + } + } + } + if (flag == 0) { + synchronized (o2) { + try { + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } + synchronized (o1) { + log.info("0"); + } + } + } + } + + public static void main(String[] args) { + DeadLock td1 = new DeadLock(); + DeadLock td2 = new DeadLock(); + td1.flag = 1; + td2.flag = 0; + //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。 + //td2的run()可能在td1的run()之前运行 + new Thread(td1).start(); + new Thread(td2).start(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java new file mode 100755 index 0000000..d3d9b9f --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.hystrix; + +import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Slf4j +@Controller +@RequestMapping("/hystrix1") +@DefaultProperties(defaultFallback = "defaultFail") +public class HystrixController1 { + + @HystrixCommand(fallbackMethod = "fail1") + @RequestMapping("/test1") + @ResponseBody + public String test1() { + throw new RuntimeException(); + } + + private String fail1() { + log.warn("fail1"); + return "fail1"; + } + + @HystrixCommand(fallbackMethod = "fail2") + @RequestMapping("/test2") + @ResponseBody + public String test2() { + throw new RuntimeException(); + } + + @HystrixCommand(fallbackMethod = "fail3") + private String fail2() { + log.warn("fail2"); + throw new RuntimeException(); + } + + @HystrixCommand + private String fail3() { + log.warn("fail3"); + throw new RuntimeException(); + } + + private String defaultFail() { + log.warn("default fail"); + return "default fail"; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java new file mode 100755 index 0000000..582761a --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java @@ -0,0 +1,48 @@ +package com.mmall.concurrency.example.hystrix; + +import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Slf4j +@Controller +@RequestMapping("/hystrix2") +@DefaultProperties(defaultFallback = "defaultFail") +public class HystrixController2 { + + @HystrixCommand(commandProperties = { + @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500") + }) + @RequestMapping("/test1") + @ResponseBody + public String test1() throws Exception { + Thread.sleep(1000); + return "test1"; + } + + @HystrixCommand(commandProperties = { + @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")}, + threadPoolProperties = { + @HystrixProperty(name = "coreSize", value = "30"), + @HystrixProperty(name = "maxQueueSize", value = "101"), + @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"), + @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"), + @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"), + @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440") + }) + @RequestMapping("/test2") + @ResponseBody + public String test2() throws Exception { + Thread.sleep(1000); + return "test2"; + } + + private String defaultFail() { + log.warn("default fail"); + return "default fail"; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java new file mode 100755 index 0000000..de5ab6b --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java @@ -0,0 +1,39 @@ +package com.mmall.concurrency.example.hystrix; + +import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Slf4j +@Controller +@RequestMapping("/hystrix3") +@DefaultProperties(defaultFallback = "defaultFail") +public class HystrixController3 { + + @HystrixCommand(commandProperties = { + @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 熔断器在整个统计时间内是否开启的阀值 + @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "3"), // 至少有3个请求才进行熔断错误比率计算 + @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"), //当出错率超过50%后熔断器启动 + @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"), // 熔断器工作时间,超过这个时间,先放一个请求进去,成功的话就关闭熔断,失败就再等一段时间 + @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000")// 统计滚动的时间窗口 + }) + @RequestMapping("/test1") + @ResponseBody + public String test1(@RequestParam("id") Integer id) { + log.info("id:{}", id); + if (id % 2 == 0) { + throw new RuntimeException(); + } + return "test_" + id; + } + + private String defaultFail() { + log.warn("default fail"); + return "default fail"; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java new file mode 100755 index 0000000..49d588b --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java @@ -0,0 +1,34 @@ +package com.mmall.concurrency.example.immutable; + +import com.google.common.collect.Maps; +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; + +@Slf4j +@NotThreadSafe +public class ImmutableExample1 { + + private final static Integer a = 1; + private final static String b = "2"; + private final static Map map = Maps.newHashMap(); + + static { + map.put(1, 2); + map.put(3, 4); + map.put(5, 6); + } + + public static void main(String[] args) { +// a = 2; +// b = "3"; +// map = Maps.newHashMap(); + map.put(1, 3); + log.info("{}", map.get(1)); + } + + private void test(final int a) { +// a = 1; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java new file mode 100755 index 0000000..62bb525 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java @@ -0,0 +1,28 @@ +package com.mmall.concurrency.example.immutable; + +import com.google.common.collect.Maps; +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.Map; + +@Slf4j +@ThreadSafe +public class ImmutableExample2 { + + private static Map map = Maps.newHashMap(); + + static { + map.put(1, 2); + map.put(3, 4); + map.put(5, 6); + map = Collections.unmodifiableMap(map); + } + + public static void main(String[] args) { + map.put(1, 3); + log.info("{}", map.get(1)); + } + +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java new file mode 100755 index 0000000..2fc3fbb --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java @@ -0,0 +1,24 @@ +package com.mmall.concurrency.example.immutable; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.mmall.concurrency.annoations.ThreadSafe; + +@ThreadSafe +public class ImmutableExample3 { + + private final static ImmutableList list = ImmutableList.of(1, 2, 3); + + private final static ImmutableSet set = ImmutableSet.copyOf(list); + + private final static ImmutableMap map = ImmutableMap.of(1, 2, 3, 4); + + private final static ImmutableMap map2 = ImmutableMap.builder() + .put(1, 2).put(3, 4).put(5, 6).build(); + + + public static void main(String[] args) { + System.out.println(map2.get(3)); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java new file mode 100755 index 0000000..1c1e971 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.lock; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class LockExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private synchronized static void add() { + count++; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java new file mode 100755 index 0000000..4c372f2 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java @@ -0,0 +1,56 @@ +package com.mmall.concurrency.example.lock; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Slf4j +@ThreadSafe +public class LockExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + private final static Lock lock = new ReentrantLock(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + lock.lock(); + try { + count++; + } finally { + lock.unlock(); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java new file mode 100755 index 0000000..d50d697 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java @@ -0,0 +1,52 @@ +package com.mmall.concurrency.example.lock; + +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +@Slf4j +public class LockExample3 { + + private final Map map = new TreeMap<>(); + + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + + private final Lock readLock = lock.readLock(); + + private final Lock writeLock = lock.writeLock(); + + public Data get(String key) { + readLock.lock(); + try { + return map.get(key); + } finally { + readLock.unlock(); + } + } + + public Set getAllKeys() { + readLock.lock(); + try { + return map.keySet(); + } finally { + readLock.unlock(); + } + } + + public Data put(String key, Data value) { + writeLock.lock(); + try { + return map.put(key, value); + } finally { + readLock.unlock(); + } + } + + class Data { + + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java new file mode 100755 index 0000000..79305d2 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java @@ -0,0 +1,59 @@ +package com.mmall.concurrency.example.lock; + +import java.util.concurrent.locks.StampedLock; + +public class LockExample4 { + + class Point { + private double x, y; + private final StampedLock sl = new StampedLock(); + + void move(double deltaX, double deltaY) { // an exclusively locked method + long stamp = sl.writeLock(); + try { + x += deltaX; + y += deltaY; + } finally { + sl.unlockWrite(stamp); + } + } + + //下面看看乐观读锁案例 + double distanceFromOrigin() { // A read-only method + long stamp = sl.tryOptimisticRead(); //获得一个乐观读锁 + double currentX = x, currentY = y; //将两个字段读入本地局部变量 + if (!sl.validate(stamp)) { //检查发出乐观读锁后同时是否有其他写锁发生? + stamp = sl.readLock(); //如果没有,我们再次获得一个读悲观锁 + try { + currentX = x; // 将两个字段读入本地局部变量 + currentY = y; // 将两个字段读入本地局部变量 + } finally { + sl.unlockRead(stamp); + } + } + return Math.sqrt(currentX * currentX + currentY * currentY); + } + + //下面是悲观读锁案例 + void moveIfAtOrigin(double newX, double newY) { // upgrade + // Could instead start with optimistic, not read mode + long stamp = sl.readLock(); + try { + while (x == 0.0 && y == 0.0) { //循环,检查当前状态是否符合 + long ws = sl.tryConvertToWriteLock(stamp); //将读锁转为写锁 + if (ws != 0L) { //这是确认转为写锁是否成功 + stamp = ws; //如果成功 替换票据 + x = newX; //进行状态改变 + y = newY; //进行状态改变 + break; + } else { //如果不能成功转换为写锁 + sl.unlockRead(stamp); //我们显式释放读锁 + stamp = sl.writeLock(); //显式直接进行写锁 然后再通过循环再试 + } + } + } finally { + sl.unlock(stamp); //释放读锁或写锁 + } + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java new file mode 100755 index 0000000..97b4a83 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java @@ -0,0 +1,55 @@ +package com.mmall.concurrency.example.lock; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.StampedLock; + +@Slf4j +@ThreadSafe +public class LockExample5 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + private final static StampedLock lock = new StampedLock(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + long stamp = lock.writeLock(); + try { + count++; + } finally { + lock.unlock(stamp); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java new file mode 100755 index 0000000..31a3dd5 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java @@ -0,0 +1,40 @@ +package com.mmall.concurrency.example.lock; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +@Slf4j +public class LockExample6 { + + public static void main(String[] args) { + ReentrantLock reentrantLock = new ReentrantLock(); + Condition condition = reentrantLock.newCondition(); + + new Thread(() -> { + try { + reentrantLock.lock(); + log.info("wait signal"); // 1 + condition.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + log.info("get signal"); // 4 + reentrantLock.unlock(); + }).start(); + + new Thread(() -> { + reentrantLock.lock(); + log.info("get lock"); // 2 + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + condition.signalAll(); + log.info("send signal ~ "); // 3 + reentrantLock.unlock(); + }).start(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java new file mode 100755 index 0000000..0affdfe --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java @@ -0,0 +1 @@ +package com.mmall.concurrency.example; \ No newline at end of file diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java new file mode 100755 index 0000000..3279644 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java @@ -0,0 +1,28 @@ +package com.mmall.concurrency.example.publish; + +import com.mmall.concurrency.annoations.NotRecommend; +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@NotThreadSafe +@NotRecommend +public class Escape { + + private int thisCanBeEscape = 0; + + public Escape () { + new InnerClass(); + } + + private class InnerClass { + + public InnerClass() { + log.info("{}", Escape.this.thisCanBeEscape); + } + } + + public static void main(String[] args) { + new Escape(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java new file mode 100755 index 0000000..20900ce --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java @@ -0,0 +1,25 @@ +package com.mmall.concurrency.example.publish; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Arrays; + +@Slf4j +@NotThreadSafe +public class UnsafePublish { + + private String[] states = {"a", "b", "c"}; + + public String[] getStates() { + return states; + } + + public static void main(String[] args) { + UnsafePublish unsafePublish = new UnsafePublish(); + log.info("{}", Arrays.toString(unsafePublish.getStates())); + + unsafePublish.getStates()[0] = "d"; + log.info("{}", Arrays.toString(unsafePublish.getStates())); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java new file mode 100755 index 0000000..405d963 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java @@ -0,0 +1,25 @@ +package com.mmall.concurrency.example.rateLimiter; + +import com.google.common.util.concurrent.RateLimiter; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.TimeUnit; + +@Slf4j +public class RateLimiterExample1 { + + private static RateLimiter rateLimiter = RateLimiter.create(5); + + public static void main(String[] args) throws Exception { + + for (int index = 0; index < 100; index++) { + if (rateLimiter.tryAcquire(190, TimeUnit.MILLISECONDS)) { + handle(index); + } + } + } + + private static void handle(int i) { + log.info("{}", i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java new file mode 100755 index 0000000..297dbcb --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java @@ -0,0 +1,24 @@ +package com.mmall.concurrency.example.rateLimiter; + +import com.google.common.util.concurrent.RateLimiter; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.TimeUnit; + +@Slf4j +public class RateLimiterExample2 { + + private static RateLimiter rateLimiter = RateLimiter.create(5); + + public static void main(String[] args) throws Exception { + + for (int index = 0; index < 100; index++) { + rateLimiter.acquire(); + handle(index); + } + } + + private static void handle(int i) { + log.info("{}", i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java new file mode 100755 index 0000000..c0dc41e --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java @@ -0,0 +1,27 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.NotThreadSafe; + +/** + * 懒汉模式 + * 单例实例在第一次使用时进行创建 + */ +@NotThreadSafe +public class SingletonExample1 { + + // 私有构造函数 + private SingletonExample1() { + + } + + // 单例对象 + private static SingletonExample1 instance = null; + + // 静态的工厂方法 + public static SingletonExample1 getInstance() { + if (instance == null) { + instance = new SingletonExample1(); + } + return instance; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java new file mode 100755 index 0000000..28c0197 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java @@ -0,0 +1,24 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 饿汉模式 + * 单例实例在类装载时进行创建 + */ +@ThreadSafe +public class SingletonExample2 { + + // 私有构造函数 + private SingletonExample2() { + + } + + // 单例对象 + private static SingletonExample2 instance = new SingletonExample2(); + + // 静态的工厂方法 + public static SingletonExample2 getInstance() { + return instance; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java new file mode 100755 index 0000000..e10b0d9 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java @@ -0,0 +1,29 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.NotRecommend; +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 懒汉模式 + * 单例实例在第一次使用时进行创建 + */ +@ThreadSafe +@NotRecommend +public class SingletonExample3 { + + // 私有构造函数 + private SingletonExample3() { + + } + + // 单例对象 + private static SingletonExample3 instance = null; + + // 静态的工厂方法 + public static synchronized SingletonExample3 getInstance() { + if (instance == null) { + instance = new SingletonExample3(); + } + return instance; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java new file mode 100755 index 0000000..0ac3432 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java @@ -0,0 +1,41 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.NotThreadSafe; + +/** + * 懒汉模式 -》 双重同步锁单例模式 + * 单例实例在第一次使用时进行创建 + */ +@NotThreadSafe +public class SingletonExample4 { + + // 私有构造函数 + private SingletonExample4() { + + } + + // 1、memory = allocate() 分配对象的内存空间 + // 2、ctorInstance() 初始化对象 + // 3、instance = memory 设置instance指向刚分配的内存 + + // JVM和cpu优化,发生了指令重排 + + // 1、memory = allocate() 分配对象的内存空间 + // 3、instance = memory 设置instance指向刚分配的内存 + // 2、ctorInstance() 初始化对象 + + // 单例对象 + private static SingletonExample4 instance = null; + + // 静态的工厂方法 + public static SingletonExample4 getInstance() { + if (instance == null) { // 双重检测机制 // B + synchronized (SingletonExample4.class) { // 同步锁 + if (instance == null) { + instance = new SingletonExample4(); // A - 3 + } + } + } + return instance; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java new file mode 100755 index 0000000..b53df2a --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java @@ -0,0 +1,35 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 懒汉模式 -》 双重同步锁单例模式 + * 单例实例在第一次使用时进行创建 + */ +@ThreadSafe +public class SingletonExample5 { + + // 私有构造函数 + private SingletonExample5() { + + } + + // 1、memory = allocate() 分配对象的内存空间 + // 2、ctorInstance() 初始化对象 + // 3、instance = memory 设置instance指向刚分配的内存 + + // 单例对象 volatile + 双重检测机制 -> 禁止指令重排 + private volatile static SingletonExample5 instance = null; + + // 静态的工厂方法 + public static SingletonExample5 getInstance() { + if (instance == null) { // 双重检测机制 // B + synchronized (SingletonExample5.class) { // 同步锁 + if (instance == null) { + instance = new SingletonExample5(); // A - 3 + } + } + } + return instance; + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java new file mode 100755 index 0000000..1755598 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java @@ -0,0 +1,33 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 饿汉模式 + * 单例实例在类装载时进行创建 + */ +@ThreadSafe +public class SingletonExample6 { + + // 私有构造函数 + private SingletonExample6() { + + } + + // 单例对象 + private static SingletonExample6 instance = null; + + static { + instance = new SingletonExample6(); + } + + // 静态的工厂方法 + public static SingletonExample6 getInstance() { + return instance; + } + + public static void main(String[] args) { + System.out.println(getInstance().hashCode()); + System.out.println(getInstance().hashCode()); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java new file mode 100755 index 0000000..982f5be --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java @@ -0,0 +1,36 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.Recommend; +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 枚举模式:最安全 + */ +@ThreadSafe +@Recommend +public class SingletonExample7 { + + // 私有构造函数 + private SingletonExample7() { + + } + + public static SingletonExample7 getInstance() { + return Singleton.INSTANCE.getInstance(); + } + + private enum Singleton { + INSTANCE; + + private SingletonExample7 singleton; + + // JVM保证这个方法绝对只调用一次 + Singleton() { + singleton = new SingletonExample7(); + } + + public SingletonExample7 getInstance() { + return singleton; + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java new file mode 100755 index 0000000..36ba4ad --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java @@ -0,0 +1,38 @@ +package com.mmall.concurrency.example.sync; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class SynchronizedExample1 { + + // 修饰一个代码块 + public void test1(int j) { + synchronized (this) { + for (int i = 0; i < 10; i++) { + log.info("test1 {} - {}", j, i); + } + } + } + + // 修饰一个方法 + public synchronized void test2(int j) { + for (int i = 0; i < 10; i++) { + log.info("test2 {} - {}", j, i); + } + } + + public static void main(String[] args) { + SynchronizedExample1 example1 = new SynchronizedExample1(); + SynchronizedExample1 example2 = new SynchronizedExample1(); + ExecutorService executorService = Executors.newCachedThreadPool(); + executorService.execute(() -> { + example1.test2(1); + }); + executorService.execute(() -> { + example2.test2(2); + }); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java new file mode 100755 index 0000000..7478a89 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java @@ -0,0 +1,38 @@ +package com.mmall.concurrency.example.sync; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class SynchronizedExample2 { + + // 修饰一个类 + public static void test1(int j) { + synchronized (SynchronizedExample2.class) { + for (int i = 0; i < 10; i++) { + log.info("test1 {} - {}", j, i); + } + } + } + + // 修饰一个静态方法 + public static synchronized void test2(int j) { + for (int i = 0; i < 10; i++) { + log.info("test2 {} - {}", j, i); + } + } + + public static void main(String[] args) { + SynchronizedExample2 example1 = new SynchronizedExample2(); + SynchronizedExample2 example2 = new SynchronizedExample2(); + ExecutorService executorService = Executors.newCachedThreadPool(); + executorService.execute(() -> { + example1.test1(1); + }); + executorService.execute(() -> { + example2.test1(2); + }); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java new file mode 100755 index 0000000..071e096 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java @@ -0,0 +1,52 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.google.common.collect.Lists; +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CollectionsExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = Collections.synchronizedList(Lists.newArrayList()); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java new file mode 100755 index 0000000..7b571a0 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.google.common.collect.Sets; +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CollectionsExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = Collections.synchronizedSet(Sets.newHashSet()); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java new file mode 100755 index 0000000..9978bd2 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CollectionsExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = Collections.synchronizedMap(new HashMap<>()); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java new file mode 100755 index 0000000..620f915 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class HashTableExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new Hashtable<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java new file mode 100755 index 0000000..2b622a3 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Vector; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class VectorExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = new Vector<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java new file mode 100755 index 0000000..18a5528 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java @@ -0,0 +1,39 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.NotThreadSafe; + +import java.util.Vector; + +@NotThreadSafe +public class VectorExample2 { + + private static Vector vector = new Vector<>(); + + public static void main(String[] args) { + + while (true) { + + for (int i = 0; i < 10; i++) { + vector.add(i); + } + + Thread thread1 = new Thread() { + public void run() { + for (int i = 0; i < vector.size(); i++) { + vector.remove(i); + } + } + }; + + Thread thread2 = new Thread() { + public void run() { + for (int i = 0; i < vector.size(); i++) { + vector.get(i); + } + } + }; + thread1.start(); + thread2.start(); + } + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java new file mode 100755 index 0000000..a56c854 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java @@ -0,0 +1,45 @@ +package com.mmall.concurrency.example.syncContainer; + +import java.util.Iterator; +import java.util.Vector; + +public class VectorExample3 { + + // java.util.ConcurrentModificationException + private static void test1(Vector v1) { // foreach + for(Integer i : v1) { + if (i.equals(3)) { + v1.remove(i); + } + } + } + + // java.util.ConcurrentModificationException + private static void test2(Vector v1) { // iterator + Iterator iterator = v1.iterator(); + while (iterator.hasNext()) { + Integer i = iterator.next(); + if (i.equals(3)) { + v1.remove(i); + } + } + } + + // success + private static void test3(Vector v1) { // for + for (int i = 0; i < v1.size(); i++) { + if (v1.get(i).equals(3)) { + v1.remove(i); + } + } + } + + public static void main(String[] args) { + + Vector vector = new Vector<>(); + vector.add(1); + vector.add(2); + vector.add(3); + test1(vector); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java new file mode 100755 index 0000000..89a785f --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java @@ -0,0 +1,18 @@ +package com.mmall.concurrency.example.threadLocal; + +public class RequestHolder { + + private final static ThreadLocal requestHolder = new ThreadLocal<>(); + + public static void add(Long id) { + requestHolder.set(id); + } + + public static Long getId() { + return requestHolder.get(); + } + + public static void remove() { + requestHolder.remove(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java new file mode 100755 index 0000000..fb400dd --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.example.threadLocal; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping("/threadLocal") +public class ThreadLocalController { + + @RequestMapping("/test") + @ResponseBody + public Long test() { + return RequestHolder.getId(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java new file mode 100755 index 0000000..b2dbbc0 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java @@ -0,0 +1,26 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class ThreadPoolExample1 { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int index = i; + executorService.execute(new Runnable() { + @Override + public void run() { + log.info("task:{}", index); + } + }); + } + executorService.shutdown(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java new file mode 100755 index 0000000..b489ed3 --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java @@ -0,0 +1,26 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class ThreadPoolExample2 { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newFixedThreadPool(3); + + for (int i = 0; i < 10; i++) { + final int index = i; + executorService.execute(new Runnable() { + @Override + public void run() { + log.info("task:{}", index); + } + }); + } + executorService.shutdown(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java new file mode 100755 index 0000000..faf88ee --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java @@ -0,0 +1,26 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class ThreadPoolExample3 { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newSingleThreadExecutor(); + + for (int i = 0; i < 10; i++) { + final int index = i; + executorService.execute(new Runnable() { + @Override + public void run() { + log.info("task:{}", index); + } + }); + } + executorService.shutdown(); + } +} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java new file mode 100755 index 0000000..111c2aa --- /dev/null +++ b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java @@ -0,0 +1,42 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class ThreadPoolExample4 { + + public static void main(String[] args) { + + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); + +// executorService.schedule(new Runnable() { +// @Override +// public void run() { +// log.warn("schedule run"); +// } +// }, 3, TimeUnit.SECONDS); + + executorService.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + log.warn("schedule run"); + } + }, 1, 3, TimeUnit.SECONDS); +// executorService.shutdown(); + + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + log.warn("timer run"); + } + }, new Date(), 5 * 1000); + } +} diff --git a/HighConcurrency/src/main/main.iml b/HighConcurrency/src/main/main.iml new file mode 100755 index 0000000..908ad4f --- /dev/null +++ b/HighConcurrency/src/main/main.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/HighConcurrency/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java b/HighConcurrency/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java new file mode 100755 index 0000000..f3b1f60 --- /dev/null +++ b/HighConcurrency/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ConcurrencyApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/HighConcurrency/src/test/test.iml b/HighConcurrency/src/test/test.iml new file mode 100755 index 0000000..a0e49a3 --- /dev/null +++ b/HighConcurrency/src/test/test.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 01fdb52..4cbe3ec --- a/README.md +++ b/README.md @@ -1,2 +1,23 @@ -# concurrency -Java 高并发解决方案demo +# Concurrency + +## Jimin 微信公众号:TechDevPro + +不断更新,可以关注并留言自己希望学习的技术 + +## Jimin 手记地址 + +http://www.imooc.com/u/5980627/articles + +不断更新 + +## Jimin 实战课程【Java开发企业级权限管理系统】推荐 + +http://coding.imooc.com/class/149.html + + +## 课程专属的QQ学习群 + +Web端"进入课程",页面右侧会看到QQ群号,验证信息是:购买课程对应的订单号 + +进群可以额外获得学习一些【课外知识】及【面试知识】 + diff --git a/concurrency.iml b/concurrency.iml new file mode 100644 index 0000000..777de43 --- /dev/null +++ b/concurrency.iml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..5bf251c --- /dev/null +++ b/mvnw @@ -0,0 +1,225 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +echo $MAVEN_PROJECTBASEDIR +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100755 index 0000000..019bd74 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,143 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100755 index 0000000..4d43433 --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + com.mmall + concurrency + 0.0.1-SNAPSHOT + war + + concurrency + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + 1.16.10 + + + + com.google.guava + guava + 23.0 + + + + joda-time + joda-time + 2.9 + + + + redis.clients + jedis + 2.8.2 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java b/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java new file mode 100755 index 0000000..356d14d --- /dev/null +++ b/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java @@ -0,0 +1,29 @@ +package com.mmall.concurrency; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@SpringBootApplication +public class ConcurrencyApplication extends WebMvcConfigurerAdapter{ + + public static void main(String[] args) { + SpringApplication.run(ConcurrencyApplication.class, args); + } + + @Bean + public FilterRegistrationBean httpFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new HttpFilter()); + registrationBean.addUrlPatterns("/threadLocal/*"); + return registrationBean; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HttpInterceptor()).addPathPatterns("/**"); + } +} diff --git a/src/main/java/com/mmall/concurrency/ConcurrencyTest.java b/src/main/java/com/mmall/concurrency/ConcurrencyTest.java new file mode 100755 index 0000000..404a893 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/ConcurrencyTest.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class git ConcurrencyTest { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count++; + } +} diff --git a/src/main/java/com/mmall/concurrency/HttpFilter.java b/src/main/java/com/mmall/concurrency/HttpFilter.java new file mode 100755 index 0000000..ab62a05 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/HttpFilter.java @@ -0,0 +1,35 @@ +package com.mmall.concurrency; + +import com.mmall.concurrency.example.threadLocal.RequestHolder; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +@Slf4j +public class HttpFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + log.info("do filter, {}, {}", Thread.currentThread().getId(), request.getServletPath()); + RequestHolder.add(Thread.currentThread().getId()); + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + + } +} diff --git a/src/main/java/com/mmall/concurrency/HttpInterceptor.java b/src/main/java/com/mmall/concurrency/HttpInterceptor.java new file mode 100755 index 0000000..03d598c --- /dev/null +++ b/src/main/java/com/mmall/concurrency/HttpInterceptor.java @@ -0,0 +1,25 @@ +package com.mmall.concurrency; + +import com.mmall.concurrency.example.threadLocal.RequestHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +public class HttpInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + log.info("preHandle"); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + RequestHolder.remove(); + log.info("afterCompletion"); + return; + } +} diff --git a/src/main/java/com/mmall/concurrency/ServletInitializer.java b/src/main/java/com/mmall/concurrency/ServletInitializer.java new file mode 100755 index 0000000..e741569 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/ServletInitializer.java @@ -0,0 +1,13 @@ +package com.mmall.concurrency; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(ConcurrencyApplication.class); + } + +} diff --git a/src/main/java/com/mmall/concurrency/TestController.java b/src/main/java/com/mmall/concurrency/TestController.java new file mode 100755 index 0000000..cef6f01 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/TestController.java @@ -0,0 +1,17 @@ +package com.mmall.concurrency; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@Slf4j +public class TestController { + + @RequestMapping("/test") + @ResponseBody + public String test() { + return "test"; + } +} diff --git a/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java b/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java new file mode 100755 index 0000000..07a140c --- /dev/null +++ b/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【不推荐】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface NotRecommend { + + String value() default ""; +} diff --git a/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java b/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java new file mode 100755 index 0000000..9886fb9 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【线程不安全】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface NotThreadSafe { + + String value() default ""; +} diff --git a/src/main/java/com/mmall/concurrency/annoations/Recommend.java b/src/main/java/com/mmall/concurrency/annoations/Recommend.java new file mode 100755 index 0000000..8a3a2bd --- /dev/null +++ b/src/main/java/com/mmall/concurrency/annoations/Recommend.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【推荐】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface Recommend { + + String value() default ""; +} diff --git a/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java b/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java new file mode 100755 index 0000000..e91e512 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.annoations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 课程里用来标记【线程安全】的类或者写法 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface ThreadSafe { + + String value() default ""; +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java b/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java new file mode 100755 index 0000000..bbdf25d --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java @@ -0,0 +1,42 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class CountDownLatchExample1 { + + private final static int threadCount = 200; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final CountDownLatch countDownLatch = new CountDownLatch(threadCount); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + test(threadNum); + } catch (Exception e) { + log.error("exception", e); + } finally { + countDownLatch.countDown(); + } + }); + } + countDownLatch.await(); + log.info("finish"); + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + Thread.sleep(100); + log.info("{}", threadNum); + Thread.sleep(100); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java b/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java new file mode 100755 index 0000000..590ebb6 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java @@ -0,0 +1,42 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class CountDownLatchExample2 { + + private final static int threadCount = 200; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final CountDownLatch countDownLatch = new CountDownLatch(threadCount); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + test(threadNum); + } catch (Exception e) { + log.error("exception", e); + } finally { + countDownLatch.countDown(); + } + }); + } + countDownLatch.await(10, TimeUnit.MILLISECONDS); + log.info("finish"); + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + Thread.sleep(100); + log.info("{}", threadNum); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java new file mode 100755 index 0000000..e9a888c --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java @@ -0,0 +1,38 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class CyclicBarrierExample1 { + + private static CyclicBarrier barrier = new CyclicBarrier(5); + + public static void main(String[] args) throws Exception { + + ExecutorService executor = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int threadNum = i; + Thread.sleep(1000); + executor.execute(() -> { + try { + race(threadNum); + } catch (Exception e) { + log.error("exception", e); + } + }); + } + executor.shutdown(); + } + + private static void race(int threadNum) throws Exception { + Thread.sleep(1000); + log.info("{} is ready", threadNum); + barrier.await(); + log.info("{} continue", threadNum); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java new file mode 100755 index 0000000..1bbcf42 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java @@ -0,0 +1,43 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class CyclicBarrierExample2 { + + private static CyclicBarrier barrier = new CyclicBarrier(5); + + public static void main(String[] args) throws Exception { + + ExecutorService executor = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int threadNum = i; + Thread.sleep(1000); + executor.execute(() -> { + try { + race(threadNum); + } catch (Exception e) { + log.error("exception", e); + } + }); + } + executor.shutdown(); + } + + private static void race(int threadNum) throws Exception { + Thread.sleep(1000); + log.info("{} is ready", threadNum); + try { + barrier.await(2000, TimeUnit.MILLISECONDS); + } catch (Exception e) { + log.warn("BarrierException", e); + } + log.info("{} continue", threadNum); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java new file mode 100755 index 0000000..3105ce2 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java @@ -0,0 +1,40 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class CyclicBarrierExample3 { + + private static CyclicBarrier barrier = new CyclicBarrier(5, () -> { + log.info("callback is running"); + }); + + public static void main(String[] args) throws Exception { + + ExecutorService executor = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int threadNum = i; + Thread.sleep(1000); + executor.execute(() -> { + try { + race(threadNum); + } catch (Exception e) { + log.error("exception", e); + } + }); + } + executor.shutdown(); + } + + private static void race(int threadNum) throws Exception { + Thread.sleep(1000); + log.info("{} is ready", threadNum); + barrier.await(); + log.info("{} continue", threadNum); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java b/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java new file mode 100755 index 0000000..fba3af8 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java @@ -0,0 +1,66 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.Future; +import java.util.concurrent.RecursiveTask; + +@Slf4j +public class ForkJoinTaskExample extends RecursiveTask { + + public static final int threshold = 2; + private int start; + private int end; + + public ForkJoinTaskExample(int start, int end) { + this.start = start; + this.end = end; + } + + @Override + protected Integer compute() { + int sum = 0; + + //如果任务足够小就计算任务 + boolean canCompute = (end - start) <= threshold; + if (canCompute) { + for (int i = start; i <= end; i++) { + sum += i; + } + } else { + // 如果任务大于阈值,就分裂成两个子任务计算 + int middle = (start + end) / 2; + ForkJoinTaskExample leftTask = new ForkJoinTaskExample(start, middle); + ForkJoinTaskExample rightTask = new ForkJoinTaskExample(middle + 1, end); + + // 执行子任务 + leftTask.fork(); + rightTask.fork(); + + // 等待任务执行结束合并其结果 + int leftResult = leftTask.join(); + int rightResult = rightTask.join(); + + // 合并子任务 + sum = leftResult + rightResult; + } + return sum; + } + + public static void main(String[] args) { + ForkJoinPool forkjoinPool = new ForkJoinPool(); + + //生成一个计算任务,计算1+2+3+4 + ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100); + + //执行一个任务 + Future result = forkjoinPool.submit(task); + + try { + log.info("result:{}", result.get()); + } catch (Exception e) { + log.error("exception", e); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java b/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java new file mode 100755 index 0000000..ee36b6e --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java @@ -0,0 +1,31 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +@Slf4j +public class FutureExample { + + static class MyCallable implements Callable { + + @Override + public String call() throws Exception { + log.info("do something in callable"); + Thread.sleep(5000); + return "Done"; + } + } + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + Future future = executorService.submit(new MyCallable()); + log.info("do something in main"); + Thread.sleep(1000); + String result = future.get(); + log.info("result:{}", result); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java b/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java new file mode 100755 index 0000000..34479ad --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java @@ -0,0 +1,27 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; + +@Slf4j +public class FutureTaskExample { + + public static void main(String[] args) throws Exception { + FutureTask futureTask = new FutureTask(new Callable() { + @Override + public String call() throws Exception { + log.info("do something in callable"); + Thread.sleep(5000); + return "Done"; + } + }); + + new Thread(futureTask).start(); + log.info("do something in main"); + Thread.sleep(1000); + String result = futureTask.get(); + log.info("result:{}", result); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java new file mode 100755 index 0000000..4a32ac9 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java @@ -0,0 +1,40 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +public class SemaphoreExample1 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + semaphore.acquire(); // 获取一个许可 + test(threadNum); + semaphore.release(); // 释放一个许可 + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java new file mode 100755 index 0000000..da24aff --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java @@ -0,0 +1,39 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +public class SemaphoreExample2 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + semaphore.acquire(3); // 获取多个许可 + test(threadNum); + semaphore.release(3); // 释放多个许可 + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java new file mode 100755 index 0000000..82c6073 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java @@ -0,0 +1,41 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class SemaphoreExample3 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + if (semaphore.tryAcquire()) { // 尝试获取一个许可 + test(threadNum); + semaphore.release(); // 释放一个许可 + } + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java new file mode 100755 index 0000000..27ee7b8 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java @@ -0,0 +1,41 @@ +package com.mmall.concurrency.example.aqs; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class SemaphoreExample4 { + + private final static int threadCount = 20; + + public static void main(String[] args) throws Exception { + + ExecutorService exec = Executors.newCachedThreadPool(); + + final Semaphore semaphore = new Semaphore(3); + + for (int i = 0; i < threadCount; i++) { + final int threadNum = i; + exec.execute(() -> { + try { + if (semaphore.tryAcquire(5000, TimeUnit.MILLISECONDS)) { // 尝试获取一个许可 + test(threadNum); + semaphore.release(); // 释放一个许可 + } + } catch (Exception e) { + log.error("exception", e); + } + }); + } + exec.shutdown(); + } + + private static void test(int threadNum) throws Exception { + log.info("{}", threadNum); + Thread.sleep(1000); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java new file mode 100755 index 0000000..fad1bea --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@ThreadSafe +public class AtomicExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static AtomicInteger count = new AtomicInteger(0); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count.get()); + } + + private static void add() { + count.incrementAndGet(); + // count.getAndIncrement(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java new file mode 100755 index 0000000..03660b3 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicLong; + +@Slf4j +@ThreadSafe +public class AtomicExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static AtomicLong count = new AtomicLong(0); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count.get()); + } + + private static void add() { + count.incrementAndGet(); + // count.getAndIncrement(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java new file mode 100755 index 0000000..561fd4a --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; + +@Slf4j +@ThreadSafe +public class AtomicExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static LongAdder count = new LongAdder(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count.increment(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java new file mode 100755 index 0000000..e8ec003 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java @@ -0,0 +1,27 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.LongAdder; + +@Slf4j +@ThreadSafe +public class AtomicExample4 { + + private static AtomicReference count = new AtomicReference<>(0); + + public static void main(String[] args) { + count.compareAndSet(0, 2); // 2 + count.compareAndSet(0, 1); // no + count.compareAndSet(1, 3); // no + count.compareAndSet(2, 4); // 4 + count.compareAndSet(3, 5); // no + log.info("count:{}", count.get()); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java new file mode 100755 index 0000000..f52635f --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java @@ -0,0 +1,34 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicReference; + +@Slf4j +@ThreadSafe +public class AtomicExample5 { + + private static AtomicIntegerFieldUpdater updater = + AtomicIntegerFieldUpdater.newUpdater(AtomicExample5.class, "count"); + + @Getter + public volatile int count = 100; + + public static void main(String[] args) { + + AtomicExample5 example5 = new AtomicExample5(); + + if (updater.compareAndSet(example5, 100, 120)) { + log.info("update success 1, {}", example5.getCount()); + } + + if (updater.compareAndSet(example5, 100, 120)) { + log.info("update success 2, {}", example5.getCount()); + } else { + log.info("update failed, {}", example5.getCount()); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java new file mode 100755 index 0000000..69fd3a6 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.atomic; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicBoolean; + +@Slf4j +@ThreadSafe +public class AtomicExample6 { + + private static AtomicBoolean isHappened = new AtomicBoolean(false); + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + test(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("isHappened:{}", isHappened.get()); + } + + private static void test() { + if (isHappened.compareAndSet(false, true)) { + log.info("execute"); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java new file mode 100755 index 0000000..0fa0f98 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class ArrayListExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = new ArrayList<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java new file mode 100755 index 0000000..0337434 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class DateFormatExample1 { + + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + } + + private static void update() { + try { + simpleDateFormat.parse("20180208"); + } catch (Exception e) { + log.error("parse exception", e); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java new file mode 100755 index 0000000..06c2596 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class DateFormatExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + } + + private static void update() { + try { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + simpleDateFormat.parse("20180208"); + } catch (Exception e) { + log.error("parse exception", e); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java new file mode 100755 index 0000000..9ea33c7 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class DateFormatExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyyMMdd"); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + } + + private static void update(int i) { + log.info("{}, {}", i, DateTime.parse("20180208", dateTimeFormatter).toDate()); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java new file mode 100755 index 0000000..861058c --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class HashMapExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new HashMap<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java new file mode 100755 index 0000000..3defb68 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class HashSetExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = new HashSet<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java new file mode 100755 index 0000000..efcf7a9 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class StringExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static StringBuilder stringBuilder = new StringBuilder(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", stringBuilder.length()); + } + + private static void update() { + stringBuilder.append("1"); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java new file mode 100755 index 0000000..c0e709d --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.commonUnsafe; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class StringExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static StringBuffer stringBuffer = new StringBuffer(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + update(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", stringBuffer.length()); + } + + private static void update() { + stringBuffer.append("1"); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java new file mode 100755 index 0000000..5cf7fe1 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class ConcurrentHashMapExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new ConcurrentHashMap<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java new file mode 100755 index 0000000..9aee082 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class ConcurrentSkipListMapExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new ConcurrentSkipListMap<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java new file mode 100755 index 0000000..5732bea --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class ConcurrentSkipListSetExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = new ConcurrentSkipListSet<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java new file mode 100755 index 0000000..1f265dc --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CopyOnWriteArrayListExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = new CopyOnWriteArrayList<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java new file mode 100755 index 0000000..81b7606 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.concurrent; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CopyOnWriteArraySetExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = new CopyOnWriteArraySet<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample1.java b/src/main/java/com/mmall/concurrency/example/count/CountExample1.java new file mode 100755 index 0000000..53c229e --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/count/CountExample1.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class CountExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count++; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample2.java b/src/main/java/com/mmall/concurrency/example/count/CountExample2.java new file mode 100755 index 0000000..0856d27 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/count/CountExample2.java @@ -0,0 +1,49 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@ThreadSafe +public class CountExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static AtomicInteger count = new AtomicInteger(0); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count.get()); + } + + private static void add() { + count.incrementAndGet(); + // count.getAndIncrement(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample3.java b/src/main/java/com/mmall/concurrency/example/count/CountExample3.java new file mode 100755 index 0000000..888ab0d --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/count/CountExample3.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CountExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private synchronized static void add() { + count++; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample4.java b/src/main/java/com/mmall/concurrency/example/count/CountExample4.java new file mode 100755 index 0000000..c8206ce --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/count/CountExample4.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.count; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@NotThreadSafe +public class CountExample4 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static volatile int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + count++; + // 1、count + // 2、+1 + // 3、count + } +} diff --git a/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java b/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java new file mode 100755 index 0000000..3c19f37 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java @@ -0,0 +1,59 @@ +package com.mmall.concurrency.example.deadLock; + +import lombok.extern.slf4j.Slf4j; + +/** + * 一个简单的死锁类 + * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 + * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 + * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定; + * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定; + * td1、td2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。 + */ + +@Slf4j +public class DeadLock implements Runnable { + public int flag = 1; + //静态对象是类的所有对象共享的 + private static Object o1 = new Object(), o2 = new Object(); + + @Override + public void run() { + log.info("flag:{}", flag); + if (flag == 1) { + synchronized (o1) { + try { + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } + synchronized (o2) { + log.info("1"); + } + } + } + if (flag == 0) { + synchronized (o2) { + try { + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } + synchronized (o1) { + log.info("0"); + } + } + } + } + + public static void main(String[] args) { + DeadLock td1 = new DeadLock(); + DeadLock td2 = new DeadLock(); + td1.flag = 1; + td2.flag = 0; + //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。 + //td2的run()可能在td1的run()之前运行 + new Thread(td1).start(); + new Thread(td2).start(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java b/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java new file mode 100755 index 0000000..49d588b --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java @@ -0,0 +1,34 @@ +package com.mmall.concurrency.example.immutable; + +import com.google.common.collect.Maps; +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; + +@Slf4j +@NotThreadSafe +public class ImmutableExample1 { + + private final static Integer a = 1; + private final static String b = "2"; + private final static Map map = Maps.newHashMap(); + + static { + map.put(1, 2); + map.put(3, 4); + map.put(5, 6); + } + + public static void main(String[] args) { +// a = 2; +// b = "3"; +// map = Maps.newHashMap(); + map.put(1, 3); + log.info("{}", map.get(1)); + } + + private void test(final int a) { +// a = 1; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java b/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java new file mode 100755 index 0000000..62bb525 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java @@ -0,0 +1,28 @@ +package com.mmall.concurrency.example.immutable; + +import com.google.common.collect.Maps; +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.Map; + +@Slf4j +@ThreadSafe +public class ImmutableExample2 { + + private static Map map = Maps.newHashMap(); + + static { + map.put(1, 2); + map.put(3, 4); + map.put(5, 6); + map = Collections.unmodifiableMap(map); + } + + public static void main(String[] args) { + map.put(1, 3); + log.info("{}", map.get(1)); + } + +} diff --git a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java b/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java new file mode 100755 index 0000000..2fc3fbb --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java @@ -0,0 +1,24 @@ +package com.mmall.concurrency.example.immutable; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.mmall.concurrency.annoations.ThreadSafe; + +@ThreadSafe +public class ImmutableExample3 { + + private final static ImmutableList list = ImmutableList.of(1, 2, 3); + + private final static ImmutableSet set = ImmutableSet.copyOf(list); + + private final static ImmutableMap map = ImmutableMap.of(1, 2, 3, 4); + + private final static ImmutableMap map2 = ImmutableMap.builder() + .put(1, 2).put(3, 4).put(5, 6).build(); + + + public static void main(String[] args) { + System.out.println(map2.get(3)); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java new file mode 100755 index 0000000..1c1e971 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java @@ -0,0 +1,47 @@ +package com.mmall.concurrency.example.lock; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class LockExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private synchronized static void add() { + count++; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java new file mode 100755 index 0000000..4c372f2 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java @@ -0,0 +1,56 @@ +package com.mmall.concurrency.example.lock; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Slf4j +@ThreadSafe +public class LockExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + private final static Lock lock = new ReentrantLock(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + lock.lock(); + try { + count++; + } finally { + lock.unlock(); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java new file mode 100755 index 0000000..d50d697 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java @@ -0,0 +1,52 @@ +package com.mmall.concurrency.example.lock; + +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +@Slf4j +public class LockExample3 { + + private final Map map = new TreeMap<>(); + + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + + private final Lock readLock = lock.readLock(); + + private final Lock writeLock = lock.writeLock(); + + public Data get(String key) { + readLock.lock(); + try { + return map.get(key); + } finally { + readLock.unlock(); + } + } + + public Set getAllKeys() { + readLock.lock(); + try { + return map.keySet(); + } finally { + readLock.unlock(); + } + } + + public Data put(String key, Data value) { + writeLock.lock(); + try { + return map.put(key, value); + } finally { + readLock.unlock(); + } + } + + class Data { + + } +} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java new file mode 100755 index 0000000..79305d2 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java @@ -0,0 +1,59 @@ +package com.mmall.concurrency.example.lock; + +import java.util.concurrent.locks.StampedLock; + +public class LockExample4 { + + class Point { + private double x, y; + private final StampedLock sl = new StampedLock(); + + void move(double deltaX, double deltaY) { // an exclusively locked method + long stamp = sl.writeLock(); + try { + x += deltaX; + y += deltaY; + } finally { + sl.unlockWrite(stamp); + } + } + + //下面看看乐观读锁案例 + double distanceFromOrigin() { // A read-only method + long stamp = sl.tryOptimisticRead(); //获得一个乐观读锁 + double currentX = x, currentY = y; //将两个字段读入本地局部变量 + if (!sl.validate(stamp)) { //检查发出乐观读锁后同时是否有其他写锁发生? + stamp = sl.readLock(); //如果没有,我们再次获得一个读悲观锁 + try { + currentX = x; // 将两个字段读入本地局部变量 + currentY = y; // 将两个字段读入本地局部变量 + } finally { + sl.unlockRead(stamp); + } + } + return Math.sqrt(currentX * currentX + currentY * currentY); + } + + //下面是悲观读锁案例 + void moveIfAtOrigin(double newX, double newY) { // upgrade + // Could instead start with optimistic, not read mode + long stamp = sl.readLock(); + try { + while (x == 0.0 && y == 0.0) { //循环,检查当前状态是否符合 + long ws = sl.tryConvertToWriteLock(stamp); //将读锁转为写锁 + if (ws != 0L) { //这是确认转为写锁是否成功 + stamp = ws; //如果成功 替换票据 + x = newX; //进行状态改变 + y = newY; //进行状态改变 + break; + } else { //如果不能成功转换为写锁 + sl.unlockRead(stamp); //我们显式释放读锁 + stamp = sl.writeLock(); //显式直接进行写锁 然后再通过循环再试 + } + } + } finally { + sl.unlock(stamp); //释放读锁或写锁 + } + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java new file mode 100755 index 0000000..97b4a83 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java @@ -0,0 +1,55 @@ +package com.mmall.concurrency.example.lock; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.StampedLock; + +@Slf4j +@ThreadSafe +public class LockExample5 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + public static int count = 0; + + private final static StampedLock lock = new StampedLock(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal ; i++) { + executorService.execute(() -> { + try { + semaphore.acquire(); + add(); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("count:{}", count); + } + + private static void add() { + long stamp = lock.writeLock(); + try { + count++; + } finally { + lock.unlock(stamp); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java new file mode 100755 index 0000000..31a3dd5 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java @@ -0,0 +1,40 @@ +package com.mmall.concurrency.example.lock; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +@Slf4j +public class LockExample6 { + + public static void main(String[] args) { + ReentrantLock reentrantLock = new ReentrantLock(); + Condition condition = reentrantLock.newCondition(); + + new Thread(() -> { + try { + reentrantLock.lock(); + log.info("wait signal"); // 1 + condition.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + log.info("get signal"); // 4 + reentrantLock.unlock(); + }).start(); + + new Thread(() -> { + reentrantLock.lock(); + log.info("get lock"); // 2 + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + condition.signalAll(); + log.info("send signal ~ "); // 3 + reentrantLock.unlock(); + }).start(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/package-info.java b/src/main/java/com/mmall/concurrency/example/package-info.java new file mode 100755 index 0000000..0affdfe --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/package-info.java @@ -0,0 +1 @@ +package com.mmall.concurrency.example; \ No newline at end of file diff --git a/src/main/java/com/mmall/concurrency/example/publish/Escape.java b/src/main/java/com/mmall/concurrency/example/publish/Escape.java new file mode 100755 index 0000000..3279644 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/publish/Escape.java @@ -0,0 +1,28 @@ +package com.mmall.concurrency.example.publish; + +import com.mmall.concurrency.annoations.NotRecommend; +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@NotThreadSafe +@NotRecommend +public class Escape { + + private int thisCanBeEscape = 0; + + public Escape () { + new InnerClass(); + } + + private class InnerClass { + + public InnerClass() { + log.info("{}", Escape.this.thisCanBeEscape); + } + } + + public static void main(String[] args) { + new Escape(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java b/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java new file mode 100755 index 0000000..20900ce --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java @@ -0,0 +1,25 @@ +package com.mmall.concurrency.example.publish; + +import com.mmall.concurrency.annoations.NotThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Arrays; + +@Slf4j +@NotThreadSafe +public class UnsafePublish { + + private String[] states = {"a", "b", "c"}; + + public String[] getStates() { + return states; + } + + public static void main(String[] args) { + UnsafePublish unsafePublish = new UnsafePublish(); + log.info("{}", Arrays.toString(unsafePublish.getStates())); + + unsafePublish.getStates()[0] = "d"; + log.info("{}", Arrays.toString(unsafePublish.getStates())); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java new file mode 100755 index 0000000..c0dc41e --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java @@ -0,0 +1,27 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.NotThreadSafe; + +/** + * 懒汉模式 + * 单例实例在第一次使用时进行创建 + */ +@NotThreadSafe +public class SingletonExample1 { + + // 私有构造函数 + private SingletonExample1() { + + } + + // 单例对象 + private static SingletonExample1 instance = null; + + // 静态的工厂方法 + public static SingletonExample1 getInstance() { + if (instance == null) { + instance = new SingletonExample1(); + } + return instance; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java new file mode 100755 index 0000000..28c0197 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java @@ -0,0 +1,24 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 饿汉模式 + * 单例实例在类装载时进行创建 + */ +@ThreadSafe +public class SingletonExample2 { + + // 私有构造函数 + private SingletonExample2() { + + } + + // 单例对象 + private static SingletonExample2 instance = new SingletonExample2(); + + // 静态的工厂方法 + public static SingletonExample2 getInstance() { + return instance; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java new file mode 100755 index 0000000..e10b0d9 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java @@ -0,0 +1,29 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.NotRecommend; +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 懒汉模式 + * 单例实例在第一次使用时进行创建 + */ +@ThreadSafe +@NotRecommend +public class SingletonExample3 { + + // 私有构造函数 + private SingletonExample3() { + + } + + // 单例对象 + private static SingletonExample3 instance = null; + + // 静态的工厂方法 + public static synchronized SingletonExample3 getInstance() { + if (instance == null) { + instance = new SingletonExample3(); + } + return instance; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java new file mode 100755 index 0000000..0ac3432 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java @@ -0,0 +1,41 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.NotThreadSafe; + +/** + * 懒汉模式 -》 双重同步锁单例模式 + * 单例实例在第一次使用时进行创建 + */ +@NotThreadSafe +public class SingletonExample4 { + + // 私有构造函数 + private SingletonExample4() { + + } + + // 1、memory = allocate() 分配对象的内存空间 + // 2、ctorInstance() 初始化对象 + // 3、instance = memory 设置instance指向刚分配的内存 + + // JVM和cpu优化,发生了指令重排 + + // 1、memory = allocate() 分配对象的内存空间 + // 3、instance = memory 设置instance指向刚分配的内存 + // 2、ctorInstance() 初始化对象 + + // 单例对象 + private static SingletonExample4 instance = null; + + // 静态的工厂方法 + public static SingletonExample4 getInstance() { + if (instance == null) { // 双重检测机制 // B + synchronized (SingletonExample4.class) { // 同步锁 + if (instance == null) { + instance = new SingletonExample4(); // A - 3 + } + } + } + return instance; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java new file mode 100755 index 0000000..b53df2a --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java @@ -0,0 +1,35 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 懒汉模式 -》 双重同步锁单例模式 + * 单例实例在第一次使用时进行创建 + */ +@ThreadSafe +public class SingletonExample5 { + + // 私有构造函数 + private SingletonExample5() { + + } + + // 1、memory = allocate() 分配对象的内存空间 + // 2、ctorInstance() 初始化对象 + // 3、instance = memory 设置instance指向刚分配的内存 + + // 单例对象 volatile + 双重检测机制 -> 禁止指令重排 + private volatile static SingletonExample5 instance = null; + + // 静态的工厂方法 + public static SingletonExample5 getInstance() { + if (instance == null) { // 双重检测机制 // B + synchronized (SingletonExample5.class) { // 同步锁 + if (instance == null) { + instance = new SingletonExample5(); // A - 3 + } + } + } + return instance; + } +} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java new file mode 100755 index 0000000..1755598 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java @@ -0,0 +1,33 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 饿汉模式 + * 单例实例在类装载时进行创建 + */ +@ThreadSafe +public class SingletonExample6 { + + // 私有构造函数 + private SingletonExample6() { + + } + + // 单例对象 + private static SingletonExample6 instance = null; + + static { + instance = new SingletonExample6(); + } + + // 静态的工厂方法 + public static SingletonExample6 getInstance() { + return instance; + } + + public static void main(String[] args) { + System.out.println(getInstance().hashCode()); + System.out.println(getInstance().hashCode()); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java new file mode 100755 index 0000000..982f5be --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java @@ -0,0 +1,36 @@ +package com.mmall.concurrency.example.singleton; + +import com.mmall.concurrency.annoations.Recommend; +import com.mmall.concurrency.annoations.ThreadSafe; + +/** + * 枚举模式:最安全 + */ +@ThreadSafe +@Recommend +public class SingletonExample7 { + + // 私有构造函数 + private SingletonExample7() { + + } + + public static SingletonExample7 getInstance() { + return Singleton.INSTANCE.getInstance(); + } + + private enum Singleton { + INSTANCE; + + private SingletonExample7 singleton; + + // JVM保证这个方法绝对只调用一次 + Singleton() { + singleton = new SingletonExample7(); + } + + public SingletonExample7 getInstance() { + return singleton; + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java b/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java new file mode 100755 index 0000000..36ba4ad --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java @@ -0,0 +1,38 @@ +package com.mmall.concurrency.example.sync; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class SynchronizedExample1 { + + // 修饰一个代码块 + public void test1(int j) { + synchronized (this) { + for (int i = 0; i < 10; i++) { + log.info("test1 {} - {}", j, i); + } + } + } + + // 修饰一个方法 + public synchronized void test2(int j) { + for (int i = 0; i < 10; i++) { + log.info("test2 {} - {}", j, i); + } + } + + public static void main(String[] args) { + SynchronizedExample1 example1 = new SynchronizedExample1(); + SynchronizedExample1 example2 = new SynchronizedExample1(); + ExecutorService executorService = Executors.newCachedThreadPool(); + executorService.execute(() -> { + example1.test2(1); + }); + executorService.execute(() -> { + example2.test2(2); + }); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java b/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java new file mode 100755 index 0000000..7478a89 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java @@ -0,0 +1,38 @@ +package com.mmall.concurrency.example.sync; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class SynchronizedExample2 { + + // 修饰一个类 + public static void test1(int j) { + synchronized (SynchronizedExample2.class) { + for (int i = 0; i < 10; i++) { + log.info("test1 {} - {}", j, i); + } + } + } + + // 修饰一个静态方法 + public static synchronized void test2(int j) { + for (int i = 0; i < 10; i++) { + log.info("test2 {} - {}", j, i); + } + } + + public static void main(String[] args) { + SynchronizedExample2 example1 = new SynchronizedExample2(); + SynchronizedExample2 example2 = new SynchronizedExample2(); + ExecutorService executorService = Executors.newCachedThreadPool(); + executorService.execute(() -> { + example1.test1(1); + }); + executorService.execute(() -> { + example2.test1(2); + }); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java b/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java new file mode 100755 index 0000000..071e096 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java @@ -0,0 +1,52 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.google.common.collect.Lists; +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CollectionsExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = Collections.synchronizedList(Lists.newArrayList()); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java b/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java new file mode 100755 index 0000000..7b571a0 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.google.common.collect.Sets; +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CollectionsExample2 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Set set = Collections.synchronizedSet(Sets.newHashSet()); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", set.size()); + } + + private static void update(int i) { + set.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java b/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java new file mode 100755 index 0000000..9978bd2 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class CollectionsExample3 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = Collections.synchronizedMap(new HashMap<>()); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java b/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java new file mode 100755 index 0000000..620f915 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java @@ -0,0 +1,51 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class HashTableExample { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static Map map = new Hashtable<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", map.size()); + } + + private static void update(int i) { + map.put(i, i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java b/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java new file mode 100755 index 0000000..2b622a3 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java @@ -0,0 +1,50 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.ThreadSafe; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Vector; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +@Slf4j +@ThreadSafe +public class VectorExample1 { + + // 请求总数 + public static int clientTotal = 5000; + + // 同时并发执行的线程数 + public static int threadTotal = 200; + + private static List list = new Vector<>(); + + public static void main(String[] args) throws Exception { + ExecutorService executorService = Executors.newCachedThreadPool(); + final Semaphore semaphore = new Semaphore(threadTotal); + final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); + for (int i = 0; i < clientTotal; i++) { + final int count = i; + executorService.execute(() -> { + try { + semaphore.acquire(); + update(count); + semaphore.release(); + } catch (Exception e) { + log.error("exception", e); + } + countDownLatch.countDown(); + }); + } + countDownLatch.await(); + executorService.shutdown(); + log.info("size:{}", list.size()); + } + + private static void update(int i) { + list.add(i); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java b/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java new file mode 100755 index 0000000..18a5528 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java @@ -0,0 +1,39 @@ +package com.mmall.concurrency.example.syncContainer; + +import com.mmall.concurrency.annoations.NotThreadSafe; + +import java.util.Vector; + +@NotThreadSafe +public class VectorExample2 { + + private static Vector vector = new Vector<>(); + + public static void main(String[] args) { + + while (true) { + + for (int i = 0; i < 10; i++) { + vector.add(i); + } + + Thread thread1 = new Thread() { + public void run() { + for (int i = 0; i < vector.size(); i++) { + vector.remove(i); + } + } + }; + + Thread thread2 = new Thread() { + public void run() { + for (int i = 0; i < vector.size(); i++) { + vector.get(i); + } + } + }; + thread1.start(); + thread2.start(); + } + } +} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java b/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java new file mode 100755 index 0000000..a56c854 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java @@ -0,0 +1,45 @@ +package com.mmall.concurrency.example.syncContainer; + +import java.util.Iterator; +import java.util.Vector; + +public class VectorExample3 { + + // java.util.ConcurrentModificationException + private static void test1(Vector v1) { // foreach + for(Integer i : v1) { + if (i.equals(3)) { + v1.remove(i); + } + } + } + + // java.util.ConcurrentModificationException + private static void test2(Vector v1) { // iterator + Iterator iterator = v1.iterator(); + while (iterator.hasNext()) { + Integer i = iterator.next(); + if (i.equals(3)) { + v1.remove(i); + } + } + } + + // success + private static void test3(Vector v1) { // for + for (int i = 0; i < v1.size(); i++) { + if (v1.get(i).equals(3)) { + v1.remove(i); + } + } + } + + public static void main(String[] args) { + + Vector vector = new Vector<>(); + vector.add(1); + vector.add(2); + vector.add(3); + test1(vector); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java b/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java new file mode 100755 index 0000000..89a785f --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java @@ -0,0 +1,18 @@ +package com.mmall.concurrency.example.threadLocal; + +public class RequestHolder { + + private final static ThreadLocal requestHolder = new ThreadLocal<>(); + + public static void add(Long id) { + requestHolder.set(id); + } + + public static Long getId() { + return requestHolder.get(); + } + + public static void remove() { + requestHolder.remove(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java b/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java new file mode 100755 index 0000000..fb400dd --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency.example.threadLocal; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping("/threadLocal") +public class ThreadLocalController { + + @RequestMapping("/test") + @ResponseBody + public Long test() { + return RequestHolder.getId(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java new file mode 100755 index 0000000..b2dbbc0 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java @@ -0,0 +1,26 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class ThreadPoolExample1 { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10; i++) { + final int index = i; + executorService.execute(new Runnable() { + @Override + public void run() { + log.info("task:{}", index); + } + }); + } + executorService.shutdown(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java new file mode 100755 index 0000000..b489ed3 --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java @@ -0,0 +1,26 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class ThreadPoolExample2 { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newFixedThreadPool(3); + + for (int i = 0; i < 10; i++) { + final int index = i; + executorService.execute(new Runnable() { + @Override + public void run() { + log.info("task:{}", index); + } + }); + } + executorService.shutdown(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java new file mode 100755 index 0000000..faf88ee --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java @@ -0,0 +1,26 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +public class ThreadPoolExample3 { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newSingleThreadExecutor(); + + for (int i = 0; i < 10; i++) { + final int index = i; + executorService.execute(new Runnable() { + @Override + public void run() { + log.info("task:{}", index); + } + }); + } + executorService.shutdown(); + } +} diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java new file mode 100755 index 0000000..111c2aa --- /dev/null +++ b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java @@ -0,0 +1,42 @@ +package com.mmall.concurrency.example.threadPool; + +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class ThreadPoolExample4 { + + public static void main(String[] args) { + + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); + +// executorService.schedule(new Runnable() { +// @Override +// public void run() { +// log.warn("schedule run"); +// } +// }, 3, TimeUnit.SECONDS); + + executorService.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + log.warn("schedule run"); + } + }, 1, 3, TimeUnit.SECONDS); +// executorService.shutdown(); + + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + log.warn("timer run"); + } + }, new Date(), 5 * 1000); + } +} diff --git a/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java b/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java new file mode 100755 index 0000000..f3b1f60 --- /dev/null +++ b/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java @@ -0,0 +1,16 @@ +package com.mmall.concurrency; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ConcurrencyApplicationTests { + + @Test + public void contextLoads() { + } + +} From da0582ee9acc8342e4aaf426b727cc7b0abd94ee Mon Sep 17 00:00:00 2001 From: Shusheng Shi <2855845850@qq.com> Date: Sun, 1 Apr 2018 06:32:27 +0800 Subject: [PATCH 03/24] Update README.md --- README.md | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4cbe3ec..804d18b 100755 --- a/README.md +++ b/README.md @@ -1,23 +1,12 @@ # Concurrency -## Jimin 微信公众号:TechDevPro +## 芥末无疆 sss 微信公众号:JavaProgrammer 不断更新,可以关注并留言自己希望学习的技术 -## Jimin 手记地址 +## 简书博客 -http://www.imooc.com/u/5980627/articles +http://www.shishusheng.com 不断更新 -## Jimin 实战课程【Java开发企业级权限管理系统】推荐 - -http://coding.imooc.com/class/149.html - - -## 课程专属的QQ学习群 - -Web端"进入课程",页面右侧会看到QQ群号,验证信息是:购买课程对应的订单号 - -进群可以额外获得学习一些【课外知识】及【面试知识】 - From d046ffd8256802250946bab48ff8a2eab5b9ced8 Mon Sep 17 00:00:00 2001 From: Shusheng Shi <2855845850@qq.com> Date: Mon, 9 Jul 2018 10:45:53 +0800 Subject: [PATCH 04/24] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 804d18b..a1c4bcc 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Concurrency -## 芥末无疆 sss 微信公众号:JavaProgrammer +## 芥末无疆 sss 微信公众号:JavaEdge 不断更新,可以关注并留言自己希望学习的技术 From d74acbc3ae233ec0f184e3e06ce75a9a91d73ff7 Mon Sep 17 00:00:00 2001 From: Shusheng Shi Date: Tue, 8 Jan 2019 10:51:49 +0800 Subject: [PATCH 05/24] Update README.md --- README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a1c4bcc..684ba5e 100755 --- a/README.md +++ b/README.md @@ -1,12 +1,20 @@ -# Concurrency +# Java 高并发理论 全基础覆盖 += + + + + + -## 芥末无疆 sss 微信公众号:JavaEdge -不断更新,可以关注并留言自己希望学习的技术 -## 简书博客 -http://www.shishusheng.com -不断更新 + + + + +# 简书博客 +http://www.shishusheng.com +# 微信公众号:JavaEdge From 2c578e47a980dc13bdb39a8da5743423c6047b7d Mon Sep 17 00:00:00 2001 From: Shusheng Shi Date: Tue, 8 Jan 2019 11:21:28 +0800 Subject: [PATCH 06/24] Update README.md --- README.md | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 684ba5e..0fcd4e9 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,110 @@ # Java 高并发理论 全基础覆盖 -= +# 以下为你将获得的知识点!!! + +# 第1章 准备(入门) +目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从课程重点、特点、适合人群及学习收获几个方面对课程进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 + +# 第2章 准备工作 +本章主要是为课程里代码演示做必要的准备。首先会基于SpringBoot快速搭建一个方便演示的Java项目,然后简单介绍一下码云及代码的管理。项目搭建好,我会使用简单的例子演示一下并发的模拟验证,主要包括对工具Postman、JMeter、Apache Bench(AB)的使用,以及使用并发的代码来验证并发处理的正确性 + 2-1 案例环境初始化 + 2-2 案例准备工作 + 2-3 并发模拟-工具 + 2-4 并发模拟-代码 +# 第3章 线程安全性讲解 +本章讲解线程安全性,主要从原子性、可见性、有序性三个方面进行讲解。原子性部分,会详细讲解atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项。可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性。有序性部分,则重点讲解了happens-before原则 + 3-1 线程安全性-原子性-atomic-1 + 3-2 线程安全性-原子性-atomic-2 + 3-3 线程安全性-原子性-synchronized + 3-4 线程安全性-可见性 + 3-5 线程安全性-有序性与总结 +# 第4章 安全发布对象讲解 +本章主要讲解安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义。这一章也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 + 4-1 安全发布对象-发布与逸出 + 4-2 安全发布对象-四种方法-1 + 4-3 安全发布对象-四种方法-2 +# 第5章 线程安全策略讲解 +本章主要讲解线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... + + 5-1 不可变对象-1 + 5-2 不可变对象-2 + 5-3 线程封闭 + 5-4 线程不安全类与写法-1 + 5-5 线程不安全类与写法-2 + 5-6 同步容器-1 + 5-7 同步容器-2 + 5-8 并发容器及安全共享策略总结 +# 第6章 J.U.C之AQS讲解 +AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点讲解AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... + + 6-1 J.U.C之AQS-介绍 + 6-2 J.U.C之AQS-CountDownLatch + 6-3 J.U.C之AQS-Semaphore + 6-4 J.U.C之AQS-CyclicBarrier + 6-5 J.U.C之AQS-ReentrantLock与锁-1 + 6-6 J.U.C之AQS-ReentrantLock与锁-2 +# 第7章 J.U.C组件拓展 +这一章继续讲解J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的。 + + 7-1 J.U.C-FutureTask-1 + 7-2 J.U.C-FutureTask-2 + 7-3 J.U.C-ForkJoin + 7-4 J.U.C-BlockingQueue +# 第8章 线程调度-线程池讲解 +本章讲解J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用。... + + 8-1 线程池-1 + 8-2 线程池-2 + 8-3 线程池-3 +# 第9章 多线程并发拓展讲解 +本章会对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的。... + + 9-1 死锁 + 9-2 并发最佳实践 + 9-3 Spring与线程安全 + 9-4 HashMap与ConcurrentHashMap解析 + 9-5 多线程并发与线程安全总结 +# 第10章 高并发之扩容思路 +高并发部分:主讲思路,侧重面试,本章主要讲扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 +10-1 扩容思路讲解 +# 第11章 高并发之缓存思路 +高并发部分:主讲思路,本章讲解高并发中缓存方案。包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis也做了... + + 11-1 缓存-特征、场景及组件介绍-1 + 11-2 缓存-特征、场景及组件介绍-2 + 11-3 缓存-redis的使用讲解-1 + 11-4 缓存-redis的使用讲解-2 + 11-5 缓存-高并发场景问题讲解 +# 第12章 高并发之消息队列思路 +高并发部分:主讲思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍,如需深入学习请移步:https://coding.imooc.com/class/262.html。... + + 12-1 消息队列介绍-1 + 12-2 消息队列介绍-2 + 12-3 消息队列介绍-3 +# 第13章 高并发之应用拆分思路 +本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍。... + + 13-1 应用拆分思路-1 + 13-2 应用拆分思路-2 +# 第14章 高并发之应用限流思路 +高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用。之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比。... + + 14-1 应用限流思路-1 + 14-2 应用限流思路-2 +14-3 应用限流思路-3 +# 第15章 服务降级与服务熔断思路 +主讲思路,本章首先通过举例让大家明白什么是服务降级和服务熔断,之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题。最后介绍了Hystrix在服务降... + + 15-1 服务降级与服务熔断思路-1 + 15-2 服务降级与服务熔断思路-2 +# 第16章 数据库分库分表与高可用手段 +高并发部分:主讲思路,本章从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别;最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表。之后介绍了高可用的三个常用手段:任务调度系统分布... + + 16-1 数据库切库分库分表思路 + 16-2 高可用一些手段 +# 第17章 课程总结 +本章首先对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题。 + + 17-1 总结 From 42590033f977dda44b6304629df652b541adc14c Mon Sep 17 00:00:00 2001 From: Shusheng Shi Date: Tue, 15 Jan 2019 23:30:37 +0800 Subject: [PATCH 07/24] Update README.md --- README.md | 131 ++++++++++++++++-------------------------------------- 1 file changed, 38 insertions(+), 93 deletions(-) diff --git a/README.md b/README.md index 0fcd4e9..e0e2a40 100755 --- a/README.md +++ b/README.md @@ -1,125 +1,70 @@ -# Java 高并发理论 全基础覆盖 -# 以下为你将获得的知识点!!! +# 0 联系我 +![](https://uploadfiles.nowcoder.com/images/20190115/7380095_1547532658211_BBDEA09F9E1DC6A4BC8855C7B0BD7ED6 "图片标题") +1.Q群【Java开发技术交流】:[https://jq.qq.com/?_wv=1027&k=5UB4P1T](https://jq.qq.com/?_wv=1027&k=5UB4P1T) + +2.完整博客链接:[www.shishusheng.com](http://www.shishusheng.com) + +3.知乎:[http://www.zhihu.com/people/shi-shu-sheng-](http://www.zhihu.com/people/shi-shu-sheng-) + +4.gayhub:[https://github.com/Wasabi1234](https://github.com/Wasabi1234) + +# Java 高并发理论 基础知识点全覆盖 博客阅读链接 +https://www.jianshu.com/p/8a3c6ac1e01e # 第1章 准备(入门) -目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从课程重点、特点、适合人群及学习收获几个方面对课程进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 +目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从重点、特点、适合人群及学习收获几个方面对知识体系进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 # 第2章 准备工作 -本章主要是为课程里代码演示做必要的准备。首先会基于SpringBoot快速搭建一个方便演示的Java项目,然后简单介绍一下码云及代码的管理。项目搭建好,我会使用简单的例子演示一下并发的模拟验证,主要包括对工具Postman、JMeter、Apache Bench(AB)的使用,以及使用并发的代码来验证并发处理的正确性 - 2-1 案例环境初始化 - 2-2 案例准备工作 - 2-3 并发模拟-工具 - 2-4 并发模拟-代码 +本章主要是为知识点里代码演示做必要的准备。首先会基于SpringBoot快速搭建一个方便演示的Java项目 +项目搭建好,我会使用简单的例子演示一下并发的模拟验证,主要包括对工具Postman、JMeter、Apache Bench(AB)的使用,以及使用并发的代码来验证并发处理的正确性 + # 第3章 线程安全性讲解 -本章讲解线程安全性,主要从原子性、可见性、有序性三个方面进行讲解。原子性部分,会详细讲解atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项。可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性。有序性部分,则重点讲解了happens-before原则 - 3-1 线程安全性-原子性-atomic-1 - 3-2 线程安全性-原子性-atomic-2 - 3-3 线程安全性-原子性-synchronized - 3-4 线程安全性-可见性 - 3-5 线程安全性-有序性与总结 +本章讲解线程安全性,主要从原子性、可见性、有序性三个方面进行讲解 +原子性部分,会详细讲解atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 +可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性 +有序性部分,则重点讲解了happens-before原则 + # 第4章 安全发布对象讲解 -本章主要讲解安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义。这一章也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 - 4-1 安全发布对象-发布与逸出 - 4-2 安全发布对象-四种方法-1 - 4-3 安全发布对象-四种方法-2 +本章主要讲解安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 +这一章也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 + # 第5章 线程安全策略讲解 本章主要讲解线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... - 5-1 不可变对象-1 - 5-2 不可变对象-2 - 5-3 线程封闭 - 5-4 线程不安全类与写法-1 - 5-5 线程不安全类与写法-2 - 5-6 同步容器-1 - 5-7 同步容器-2 - 5-8 并发容器及安全共享策略总结 # 第6章 J.U.C之AQS讲解 AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点讲解AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... - 6-1 J.U.C之AQS-介绍 - 6-2 J.U.C之AQS-CountDownLatch - 6-3 J.U.C之AQS-Semaphore - 6-4 J.U.C之AQS-CyclicBarrier - 6-5 J.U.C之AQS-ReentrantLock与锁-1 - 6-6 J.U.C之AQS-ReentrantLock与锁-2 # 第7章 J.U.C组件拓展 -这一章继续讲解J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的。 +这一章继续讲解J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 - 7-1 J.U.C-FutureTask-1 - 7-2 J.U.C-FutureTask-2 - 7-3 J.U.C-ForkJoin - 7-4 J.U.C-BlockingQueue # 第8章 线程调度-线程池讲解 -本章讲解J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用。... +本章讲解J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 + - 8-1 线程池-1 - 8-2 线程池-2 - 8-3 线程池-3 # 第9章 多线程并发拓展讲解 -本章会对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的。... +本章会对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 + - 9-1 死锁 - 9-2 并发最佳实践 - 9-3 Spring与线程安全 - 9-4 HashMap与ConcurrentHashMap解析 - 9-5 多线程并发与线程安全总结 # 第10章 高并发之扩容思路 高并发部分:主讲思路,侧重面试,本章主要讲扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 -10-1 扩容思路讲解 + # 第11章 高并发之缓存思路 -高并发部分:主讲思路,本章讲解高并发中缓存方案。包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis也做了... +高并发部分:主讲思路,本章讲解高并发中缓存方案。包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis - 11-1 缓存-特征、场景及组件介绍-1 - 11-2 缓存-特征、场景及组件介绍-2 - 11-3 缓存-redis的使用讲解-1 - 11-4 缓存-redis的使用讲解-2 - 11-5 缓存-高并发场景问题讲解 # 第12章 高并发之消息队列思路 -高并发部分:主讲思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍,如需深入学习请移步:https://coding.imooc.com/class/262.html。... +高并发部分:主讲思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 - 12-1 消息队列介绍-1 - 12-2 消息队列介绍-2 - 12-3 消息队列介绍-3 # 第13章 高并发之应用拆分思路 -本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍。... +本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 - 13-1 应用拆分思路-1 - 13-2 应用拆分思路-2 # 第14章 高并发之应用限流思路 -高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用。之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比。... +高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用。之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 - 14-1 应用限流思路-1 - 14-2 应用限流思路-2 -14-3 应用限流思路-3 # 第15章 服务降级与服务熔断思路 -主讲思路,本章首先通过举例让大家明白什么是服务降级和服务熔断,之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题。最后介绍了Hystrix在服务降... +主讲思路,本章首先通过举例让大家明白什么是服务降级和服务熔断,之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题。最后介绍了Hystrix - 15-1 服务降级与服务熔断思路-1 - 15-2 服务降级与服务熔断思路-2 # 第16章 数据库分库分表与高可用手段 -高并发部分:主讲思路,本章从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别;最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表。之后介绍了高可用的三个常用手段:任务调度系统分布... - - 16-1 数据库切库分库分表思路 - 16-2 高可用一些手段 -# 第17章 课程总结 -本章首先对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题。 - - 17-1 总结 - - - - - - - - - - - - - - +高并发部分:主讲思路,本章从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别;最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表。之后介绍了高可用的三个常用手段:任务调度系统分布 -# 简书博客 -http://www.shishusheng.com -# 微信公众号:JavaEdge +# 第17章 知识体系总结 +本章首先对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 From cc14489ba4d37f6f677d6715ffc83a11e438a0f8 Mon Sep 17 00:00:00 2001 From: Shusheng Shi Date: Tue, 5 Feb 2019 01:37:18 +0800 Subject: [PATCH 08/24] Update README.md --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e0e2a40..c590dc8 100755 --- a/README.md +++ b/README.md @@ -58,13 +58,23 @@ AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点 本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 # 第14章 高并发之应用限流思路 -高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用。之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 +高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 + +之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 # 第15章 服务降级与服务熔断思路 -主讲思路,本章首先通过举例让大家明白什么是服务降级和服务熔断,之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题。最后介绍了Hystrix +通过举例让大家明白什么是服务降级和服务熔断 + +之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 + +最后介绍了Hystrix # 第16章 数据库分库分表与高可用手段 -高并发部分:主讲思路,本章从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别;最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表。之后介绍了高可用的三个常用手段:任务调度系统分布 +高并发部分:主讲思路,从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别; + +最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表 + +之后介绍了高可用的三个常用手段:任务调度系统分布 # 第17章 知识体系总结 -本章首先对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 +对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 From 63477b12452d99de909538d0eeae7ac3cfa62935 Mon Sep 17 00:00:00 2001 From: Shusheng Shi Date: Wed, 6 Feb 2019 00:16:41 +0800 Subject: [PATCH 09/24] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c590dc8..bdc03a5 100755 --- a/README.md +++ b/README.md @@ -78,3 +78,5 @@ AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点 # 第17章 知识体系总结 对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 + +![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) From 4a1ca030743c8b97f134b840c566ca279c93f3a4 Mon Sep 17 00:00:00 2001 From: Shusheng Shi Date: Mon, 11 Feb 2019 17:15:53 +0800 Subject: [PATCH 10/24] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bdc03a5..a1998e1 100755 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -# 0 联系我 -![](https://uploadfiles.nowcoder.com/images/20190115/7380095_1547532658211_BBDEA09F9E1DC6A4BC8855C7B0BD7ED6 "图片标题") -1.Q群【Java开发技术交流】:[https://jq.qq.com/?_wv=1027&k=5UB4P1T](https://jq.qq.com/?_wv=1027&k=5UB4P1T) +# 联系我 +![](http://upload-images.jianshu.io/upload_images/4685968-6a8b28d2fd95e8b7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "图片标题") +1.[Java开发技术交流Q群](https://jq.qq.com/?_wv=1027&k=5UB4P1T) -2.完整博客链接:[www.shishusheng.com](http://www.shishusheng.com) +2.[完整博客链接](http://www.shishusheng.com) -3.知乎:[http://www.zhihu.com/people/shi-shu-sheng-](http://www.zhihu.com/people/shi-shu-sheng-) +3.[个人知乎](http://www.zhihu.com/people/shi-shu-sheng-) -4.gayhub:[https://github.com/Wasabi1234](https://github.com/Wasabi1234) +4.[gayhub](https://github.com/Wasabi1234) -# Java 高并发理论 基础知识点全覆盖 博客阅读链接 -https://www.jianshu.com/p/8a3c6ac1e01e + +# [Java 高并发理论 基础知识点全覆盖](https://www.jianshu.com/p/8a3c6ac1e01e) # 第1章 准备(入门) 目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从重点、特点、适合人群及学习收获几个方面对知识体系进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 From b58f3d5b2acd98da2bbe1ca250dd867d719a0618 Mon Sep 17 00:00:00 2001 From: ShiShusheng <2855845850@qq.com> Date: Wed, 20 Feb 2019 17:01:47 +0800 Subject: [PATCH 11/24] =?UTF-8?q?=E9=AB=98=E5=B9=B6=E5=8F=91=E4=B9=8B?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=98=9F=E5=88=97=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/artifacts/concurrency_war.xml | 6 + .idea/artifacts/concurrency_war_exploded.xml | 24 +- ...aven__org_projectlombok_lombok_1_16_10.xml | 13 - .idea/misc.xml | 1 + HighConcurrency/README.md | 30 --- HighConcurrency/concurrency.iml | 123 ---------- HighConcurrency/mvnw | 225 ------------------ HighConcurrency/mvnw.cmd | 143 ----------- HighConcurrency/pom.xml | 104 -------- .../concurrency/ConcurrencyApplication.java | 33 --- .../com/mmall/concurrency/HttpFilter.java | 35 --- .../mmall/concurrency/HttpInterceptor.java | 25 -- .../mmall/concurrency/ServletInitializer.java | 13 - .../com/mmall/concurrency/TestController.java | 17 -- .../concurrency/annoations/ThreadSafe.java | 16 -- .../example/aqs/CyclicBarrierExample2.java | 43 ---- .../example/aqs/ForkJoinTaskExample.java | 66 ----- .../example/aqs/FutureExample.java | 31 --- .../example/aqs/FutureTaskExample.java | 27 --- .../example/aqs/SemaphoreExample1.java | 40 ---- .../example/aqs/SemaphoreExample2.java | 39 --- .../example/atomic/AtomicExample2.java | 49 ---- .../example/atomic/AtomicExample3.java | 49 ---- .../example/atomic/AtomicExample5.java | 34 --- .../example/atomic/AtomicExample6.java | 50 ---- .../commonUnsafe/DateFormatExample3.java | 50 ---- .../example/commonUnsafe/HashMapExample.java | 50 ---- .../example/commonUnsafe/HashSetExample.java | 50 ---- .../example/commonUnsafe/StringExample1.java | 47 ---- .../CopyOnWriteArrayListExample.java | 51 ---- .../CopyOnWriteArraySetExample.java | 50 ---- .../example/count/CountExample1.java | 47 ---- .../example/count/CountExample2.java | 49 ---- .../example/count/CountExample3.java | 47 ---- .../example/count/CountExample4.java | 50 ---- .../example/hystrix/HystrixController1.java | 51 ---- .../example/hystrix/HystrixController2.java | 48 ---- .../example/hystrix/HystrixController3.java | 39 --- .../example/immutable/ImmutableExample1.java | 34 --- .../example/immutable/ImmutableExample3.java | 24 -- .../example/lock/LockExample2.java | 56 ----- .../example/lock/LockExample6.java | 40 ---- .../concurrency/example/package-info.java | 1 - .../concurrency/example/publish/Escape.java | 28 --- .../rateLimiter/RateLimiterExample1.java | 25 -- .../rateLimiter/RateLimiterExample2.java | 24 -- .../example/singleton/SingletonExample1.java | 27 --- .../example/singleton/SingletonExample5.java | 35 --- .../example/singleton/SingletonExample6.java | 33 --- .../syncContainer/CollectionsExample1.java | 52 ---- .../syncContainer/CollectionsExample2.java | 51 ---- .../syncContainer/CollectionsExample3.java | 51 ---- .../syncContainer/HashTableExample.java | 51 ---- .../example/syncContainer/VectorExample1.java | 50 ---- .../example/syncContainer/VectorExample2.java | 39 --- .../example/threadLocal/RequestHolder.java | 18 -- .../threadPool/ThreadPoolExample2.java | 26 -- .../threadPool/ThreadPoolExample4.java | 42 ---- HighConcurrency/src/main/main.iml | 11 - HighConcurrency/src/test/test.iml | 11 - README.md | 190 ++++++++------- concurrency.iml | 29 ++- .../concurrency/ConcurrencyApplication.java | 5 +- .../concurrency/ConcurrencyTest.java | 7 +- .../com/javaedge}/concurrency/HttpFilter.java | 4 +- .../concurrency/HttpInterceptor.java | 4 +- .../concurrency/ServletInitializer.java | 2 +- .../javaedge}/concurrency/TestController.java | 2 +- .../concurrency/annoations/NotRecommend.java | 2 +- .../concurrency/annoations/NotThreadSafe.java | 2 +- .../concurrency/annoations/Recommend.java | 2 +- .../concurrency/annoations/ThreadSafe.java | 2 +- .../example/aqs/CountDownLatchExample1.java | 2 +- .../example/aqs/CountDownLatchExample2.java | 2 +- .../example/aqs/CyclicBarrierExample1.java | 2 +- .../example/aqs/CyclicBarrierExample2.java | 2 +- .../example/aqs/CyclicBarrierExample3.java | 2 +- .../example/aqs/ForkJoinTaskExample.java | 2 +- .../example/aqs/FutureExample.java | 2 +- .../example/aqs/FutureTaskExample.java | 2 +- .../example/aqs/SemaphoreExample1.java | 2 +- .../example/aqs/SemaphoreExample2.java | 2 +- .../example/aqs/SemaphoreExample3.java | 2 +- .../example/aqs/SemaphoreExample4.java | 2 +- .../example/atomic/AtomicExample1.java | 4 +- .../example/atomic/AtomicExample2.java | 4 +- .../example/atomic/AtomicExample3.java | 5 +- .../example/atomic/AtomicExample4.java | 9 +- .../example/atomic/AtomicExample5.java | 5 +- .../example/atomic/AtomicExample6.java | 4 +- .../example/cache/CacheController.java | 5 +- .../example/cache/GuavaCacheExample1.java | 2 +- .../example/cache/GuavaCacheExample2.java | 2 +- .../example/cache/RedisClient.java | 8 +- .../example/cache/RedisConfig.java | 5 +- .../commonUnsafe/ArrayListExample.java | 4 +- .../commonUnsafe/DateFormatExample1.java | 4 +- .../commonUnsafe/DateFormatExample2.java | 4 +- .../commonUnsafe/DateFormatExample3.java | 4 +- .../example/commonUnsafe/HashMapExample.java | 4 +- .../example/commonUnsafe/HashSetExample.java | 4 +- .../example/commonUnsafe/StringExample1.java | 4 +- .../example/commonUnsafe/StringExample2.java | 4 +- .../concurrent/ConcurrentHashMapExample.java | 4 +- .../ConcurrentSkipListMapExample.java | 5 +- .../ConcurrentSkipListSetExample.java | 4 +- .../CopyOnWriteArrayListExample.java | 5 +- .../CopyOnWriteArraySetExample.java | 4 +- .../example/count/CountExample1.java | 4 +- .../example/count/CountExample2.java | 4 +- .../example/count/CountExample3.java | 4 +- .../example/count/CountExample4.java | 4 +- .../example/deadLock/DeadLock.java | 2 +- .../example/immutable/ImmutableExample1.java | 4 +- .../example/immutable/ImmutableExample2.java | 4 +- .../example/immutable/ImmutableExample3.java | 4 +- .../example/lock/LockExample1.java | 4 +- .../example/lock/LockExample2.java | 4 +- .../example/lock/LockExample3.java | 2 +- .../example/lock/LockExample4.java | 2 +- .../example/lock/LockExample5.java | 4 +- .../example/lock/LockExample6.java | 2 +- .../concurrency/example/mq/Message.java | 19 ++ .../concurrency/example/mq/MqController.java | 33 +++ .../example/mq/kafka/KafkaReceiver.java | 20 ++ .../example/mq/kafka/KafkaSender.java | 32 +++ .../example/mq/kafka/TopicConstants.java | 12 + .../example/mq/rabbitmq/QueueConstants.java | 12 + .../example/mq/rabbitmq/RabbitMqClient.java | 26 ++ .../example/mq/rabbitmq/RabbitMqConfig.java | 21 ++ .../example/mq/rabbitmq/RabbitMqServer.java | 19 ++ .../concurrency/example/package-info.java | 1 + .../concurrency/example/publish/Escape.java | 6 +- .../example/publish/UnsafePublish.java | 4 +- .../example/singleton/SingletonExample1.java | 4 +- .../example/singleton/SingletonExample2.java | 4 +- .../example/singleton/SingletonExample3.java | 6 +- .../example/singleton/SingletonExample4.java | 4 +- .../example/singleton/SingletonExample5.java | 4 +- .../example/singleton/SingletonExample6.java | 4 +- .../example/singleton/SingletonExample7.java | 6 +- .../example/sync/SynchronizedExample1.java | 2 +- .../example/sync/SynchronizedExample2.java | 2 +- .../syncContainer/CollectionsExample1.java | 5 +- .../syncContainer/CollectionsExample2.java | 4 +- .../syncContainer/CollectionsExample3.java | 4 +- .../syncContainer/HashTableExample.java | 5 +- .../example/syncContainer/VectorExample1.java | 4 +- .../example/syncContainer/VectorExample2.java | 4 +- .../example/syncContainer/VectorExample3.java | 2 +- .../example/threadLocal/RequestHolder.java | 2 +- .../threadLocal/ThreadLocalController.java | 2 +- .../threadPool/ThreadPoolExample1.java | 2 +- .../threadPool/ThreadPoolExample2.java | 2 +- .../threadPool/ThreadPoolExample3.java | 2 +- .../threadPool/ThreadPoolExample4.java | 2 +- .../src/main/resources/application.properties | 4 + .../ConcurrencyApplicationTests.java | 2 +- pom.xml | 133 ++++++----- .../mmall/concurrency/ConcurrencyTest.java | 47 ---- .../concurrency/annoations/NotRecommend.java | 16 -- .../concurrency/annoations/NotThreadSafe.java | 16 -- .../concurrency/annoations/Recommend.java | 16 -- .../example/aqs/CountDownLatchExample1.java | 42 ---- .../example/aqs/CountDownLatchExample2.java | 42 ---- .../example/aqs/CyclicBarrierExample1.java | 38 --- .../example/aqs/CyclicBarrierExample3.java | 40 ---- .../example/aqs/SemaphoreExample3.java | 41 ---- .../example/aqs/SemaphoreExample4.java | 41 ---- .../example/atomic/AtomicExample1.java | 49 ---- .../example/atomic/AtomicExample4.java | 27 --- .../commonUnsafe/ArrayListExample.java | 50 ---- .../commonUnsafe/DateFormatExample1.java | 51 ---- .../commonUnsafe/DateFormatExample2.java | 50 ---- .../example/commonUnsafe/StringExample2.java | 47 ---- .../concurrent/ConcurrentHashMapExample.java | 50 ---- .../ConcurrentSkipListMapExample.java | 51 ---- .../ConcurrentSkipListSetExample.java | 50 ---- .../example/deadLock/DeadLock.java | 59 ----- .../example/immutable/ImmutableExample2.java | 28 --- .../example/lock/LockExample1.java | 47 ---- .../example/lock/LockExample3.java | 52 ---- .../example/lock/LockExample4.java | 59 ----- .../example/lock/LockExample5.java | 55 ----- .../concurrency/example/package-info.java | 1 - .../example/publish/UnsafePublish.java | 25 -- .../example/singleton/SingletonExample2.java | 24 -- .../example/singleton/SingletonExample3.java | 29 --- .../example/singleton/SingletonExample4.java | 41 ---- .../example/singleton/SingletonExample7.java | 36 --- .../example/sync/SynchronizedExample1.java | 38 --- .../example/sync/SynchronizedExample2.java | 38 --- .../example/syncContainer/VectorExample3.java | 45 ---- .../threadLocal/ThreadLocalController.java | 16 -- .../threadPool/ThreadPoolExample1.java | 26 -- .../threadPool/ThreadPoolExample3.java | 26 -- .../ConcurrencyApplicationTests.java | 16 -- 197 files changed, 588 insertions(+), 4281 deletions(-) delete mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml delete mode 100755 HighConcurrency/README.md delete mode 100755 HighConcurrency/concurrency.iml delete mode 100755 HighConcurrency/mvnw delete mode 100755 HighConcurrency/mvnw.cmd delete mode 100755 HighConcurrency/pom.xml delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java delete mode 100755 HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java delete mode 100755 HighConcurrency/src/main/main.iml delete mode 100755 HighConcurrency/src/test/test.iml rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/ConcurrencyApplication.java (94%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/ConcurrencyTest.java (91%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/HttpFilter.java (90%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/HttpInterceptor.java (87%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/ServletInitializer.java (91%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/TestController.java (91%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/annoations/NotRecommend.java (88%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/annoations/NotThreadSafe.java (88%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/annoations/Recommend.java (88%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/annoations/ThreadSafe.java (88%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/CountDownLatchExample1.java (96%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/CountDownLatchExample2.java (96%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/CyclicBarrierExample1.java (95%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/CyclicBarrierExample2.java (96%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/CyclicBarrierExample3.java (95%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/ForkJoinTaskExample.java (97%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/FutureExample.java (94%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/FutureTaskExample.java (94%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/SemaphoreExample1.java (95%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/SemaphoreExample2.java (95%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/SemaphoreExample3.java (96%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/aqs/SemaphoreExample4.java (96%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/atomic/AtomicExample1.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/atomic/AtomicExample2.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/atomic/AtomicExample3.java (90%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/atomic/AtomicExample4.java (62%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/atomic/AtomicExample5.java (84%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/atomic/AtomicExample6.java (93%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/cache/CacheController.java (91%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/cache/GuavaCacheExample1.java (97%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/cache/GuavaCacheExample2.java (97%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/cache/RedisClient.java (92%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/cache/RedisConfig.java (86%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/ArrayListExample.java (92%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/DateFormatExample1.java (92%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/DateFormatExample2.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/DateFormatExample3.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/HashMapExample.java (92%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/HashSetExample.java (92%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/StringExample1.java (92%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/commonUnsafe/StringExample2.java (92%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/concurrent/ConcurrentHashMapExample.java (93%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/concurrent/ConcurrentSkipListMapExample.java (90%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/concurrent/ConcurrentSkipListSetExample.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/concurrent/CopyOnWriteArrayListExample.java (91%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/concurrent/CopyOnWriteArraySetExample.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/count/CountExample1.java (92%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/count/CountExample2.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/count/CountExample3.java (92%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/count/CountExample4.java (92%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/deadLock/DeadLock.java (97%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/immutable/ImmutableExample1.java (85%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/immutable/ImmutableExample2.java (82%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/immutable/ImmutableExample3.java (86%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/lock/LockExample1.java (92%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/lock/LockExample2.java (93%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/lock/LockExample3.java (95%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/lock/LockExample4.java (98%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/lock/LockExample5.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/lock/LockExample6.java (95%) create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/Message.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/MqController.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaReceiver.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaSender.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/TopicConstants.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/QueueConstants.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqClient.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqConfig.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqServer.java create mode 100755 concurrency/src/main/java/com/javaedge/concurrency/example/package-info.java rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/publish/Escape.java (70%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/publish/UnsafePublish.java (82%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/singleton/SingletonExample1.java (81%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/singleton/SingletonExample2.java (78%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/singleton/SingletonExample3.java (75%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/singleton/SingletonExample4.java (90%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/singleton/SingletonExample5.java (89%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/singleton/SingletonExample6.java (84%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/singleton/SingletonExample7.java (78%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/sync/SynchronizedExample1.java (95%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/sync/SynchronizedExample2.java (95%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/syncContainer/CollectionsExample1.java (91%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/syncContainer/CollectionsExample2.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/syncContainer/CollectionsExample3.java (93%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/syncContainer/HashTableExample.java (91%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/syncContainer/VectorExample1.java (92%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/syncContainer/VectorExample2.java (88%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/syncContainer/VectorExample3.java (95%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/threadLocal/RequestHolder.java (86%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/threadLocal/ThreadLocalController.java (87%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/threadPool/ThreadPoolExample1.java (91%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/threadPool/ThreadPoolExample2.java (91%) rename {HighConcurrency/src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/threadPool/ThreadPoolExample3.java (92%) rename {src/main/java/com/mmall => concurrency/src/main/java/com/javaedge}/concurrency/example/threadPool/ThreadPoolExample4.java (95%) create mode 100644 concurrency/src/main/resources/application.properties rename {HighConcurrency/src/test/java/com/mmall => concurrency/src/test/java/com/javaedge}/concurrency/ConcurrencyApplicationTests.java (90%) delete mode 100755 src/main/java/com/mmall/concurrency/ConcurrencyTest.java delete mode 100755 src/main/java/com/mmall/concurrency/annoations/NotRecommend.java delete mode 100755 src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java delete mode 100755 src/main/java/com/mmall/concurrency/annoations/Recommend.java delete mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java delete mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java delete mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java delete mode 100755 src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java delete mode 100755 src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java delete mode 100755 src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java delete mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java delete mode 100755 src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java delete mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java delete mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java delete mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java delete mode 100755 src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java delete mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java delete mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java delete mode 100755 src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java delete mode 100755 src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java delete mode 100755 src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java delete mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample1.java delete mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample3.java delete mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample4.java delete mode 100755 src/main/java/com/mmall/concurrency/example/lock/LockExample5.java delete mode 100755 src/main/java/com/mmall/concurrency/example/package-info.java delete mode 100755 src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java delete mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java delete mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java delete mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java delete mode 100755 src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java delete mode 100755 src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java delete mode 100755 src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java delete mode 100755 src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java delete mode 100755 src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java delete mode 100755 src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java delete mode 100755 src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java delete mode 100755 src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java diff --git a/.idea/artifacts/concurrency_war.xml b/.idea/artifacts/concurrency_war.xml index 09c0531..c242efa 100644 --- a/.idea/artifacts/concurrency_war.xml +++ b/.idea/artifacts/concurrency_war.xml @@ -1,6 +1,12 @@ $PROJECT_DIR$/target + + + concurrency + war + + diff --git a/.idea/artifacts/concurrency_war_exploded.xml b/.idea/artifacts/concurrency_war_exploded.xml index 2f15d66..fc52b15 100644 --- a/.idea/artifacts/concurrency_war_exploded.xml +++ b/.idea/artifacts/concurrency_war_exploded.xml @@ -1,6 +1,13 @@ $PROJECT_DIR$/target/concurrency-0.0.1-SNAPSHOT + + + true + concurrency + war + + @@ -33,12 +40,10 @@ - - - + @@ -47,6 +52,19 @@ + + + + + + + + + + + + + diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml deleted file mode 100644 index 2c72884..0000000 --- a/.idea/libraries/Maven__org_projectlombok_lombok_1_16_10.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 5f61bad..7d01223 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -7,6 +7,7 @@ diff --git a/HighConcurrency/README.md b/HighConcurrency/README.md deleted file mode 100755 index f46c65b..0000000 --- a/HighConcurrency/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Concurrency - -## Jimin 微信公众号:TechDevPro - -不断更新,可以关注并留言自己希望学习的技术 - -## Jimin 手记地址 - -http://www.imooc.com/u/5980627/articles - -不断更新 - -## Jimin 实战课程【Java开发企业级权限管理系统】推荐 - -http://coding.imooc.com/class/149.html - - -## 课程专属的QQ学习群 - -Web端"进入课程",页面右侧会看到QQ群号,验证信息是:购买课程对应的订单号 - -进群可以额外获得学习一些【课外知识】及【面试知识】 - -## 课程脑图 - -### Java并发编程与高并发解决方案 -http://naotu.baidu.com/file/6808ea88451b49ba4964e2c81d0d2c8b?token=3a5de17f2ea7220d - -### Java开发企业级权限管理系统 -http://naotu.baidu.com/file/fe4d0ed0ce3b8dfd9b09263c0f7abf01?token=fdd400eba319d8b7 diff --git a/HighConcurrency/concurrency.iml b/HighConcurrency/concurrency.iml deleted file mode 100755 index 6818e80..0000000 --- a/HighConcurrency/concurrency.iml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/HighConcurrency/mvnw b/HighConcurrency/mvnw deleted file mode 100755 index 5bf251c..0000000 --- a/HighConcurrency/mvnw +++ /dev/null @@ -1,225 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -echo $MAVEN_PROJECTBASEDIR -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/HighConcurrency/mvnw.cmd b/HighConcurrency/mvnw.cmd deleted file mode 100755 index 019bd74..0000000 --- a/HighConcurrency/mvnw.cmd +++ /dev/null @@ -1,143 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/HighConcurrency/pom.xml b/HighConcurrency/pom.xml deleted file mode 100755 index 45cf822..0000000 --- a/HighConcurrency/pom.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - 4.0.0 - - com.mmall - concurrency - 0.0.1-SNAPSHOT - war - - concurrency - Demo project for Spring Boot - - - org.springframework.boot - spring-boot-starter-parent - 1.5.9.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - Edgware.RELEASE - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.projectlombok - lombok - 1.16.10 - - - - com.google.guava - guava - 23.0 - - - - joda-time - joda-time - 2.9 - - - - redis.clients - jedis - 2.8.2 - - - - - org.springframework.cloud - spring-cloud-starter-hystrix - - - - - org.springframework.cloud - spring-cloud-starter-hystrix-dashboard - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java b/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java deleted file mode 100755 index 40a57f6..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.mmall.concurrency; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; -import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; -import org.springframework.context.annotation.Bean; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -@SpringBootApplication -@EnableHystrixDashboard -@EnableCircuitBreaker -public class ConcurrencyApplication extends WebMvcConfigurerAdapter{ - - public static void main(String[] args) { - SpringApplication.run(ConcurrencyApplication.class, args); - } - - @Bean - public FilterRegistrationBean httpFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(new HttpFilter()); - registrationBean.addUrlPatterns("/threadLocal/*"); - return registrationBean; - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(new HttpInterceptor()).addPathPatterns("/**"); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java b/HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java deleted file mode 100755 index bf7b83c..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/HttpFilter.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.mmall.concurrency; - -import com.mmall.concurrency.example.threadLocal.RequestHolder; -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -@Slf4j -public class HttpFilter implements Filter { - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) servletRequest; -// log.info("do filter, {}, {}", Thread.currentThread().getId(), request.getServletPath()); - RequestHolder.add(Thread.currentThread().getId()); - filterChain.doFilter(servletRequest, servletResponse); - } - - @Override - public void destroy() { - - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java b/HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java deleted file mode 100755 index 737fb74..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/HttpInterceptor.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.mmall.concurrency; - -import com.mmall.concurrency.example.threadLocal.RequestHolder; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@Slf4j -public class HttpInterceptor extends HandlerInterceptorAdapter { - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { -// log.info("preHandle"); - return true; - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - RequestHolder.remove(); -// log.info("afterCompletion"); - return; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java b/HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java deleted file mode 100755 index e741569..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/ServletInitializer.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.mmall.concurrency; - -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.support.SpringBootServletInitializer; - -public class ServletInitializer extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(ConcurrencyApplication.class); - } - -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java b/HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java deleted file mode 100755 index cef6f01..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/TestController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mmall.concurrency; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -@Slf4j -public class TestController { - - @RequestMapping("/test") - @ResponseBody - public String test() { - return "test"; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java b/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java deleted file mode 100755 index e91e512..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mmall.concurrency.annoations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 课程里用来标记【线程安全】的类或者写法 - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) -public @interface ThreadSafe { - - String value() default ""; -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java deleted file mode 100755 index 1bbcf42..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -@Slf4j -public class CyclicBarrierExample2 { - - private static CyclicBarrier barrier = new CyclicBarrier(5); - - public static void main(String[] args) throws Exception { - - ExecutorService executor = Executors.newCachedThreadPool(); - - for (int i = 0; i < 10; i++) { - final int threadNum = i; - Thread.sleep(1000); - executor.execute(() -> { - try { - race(threadNum); - } catch (Exception e) { - log.error("exception", e); - } - }); - } - executor.shutdown(); - } - - private static void race(int threadNum) throws Exception { - Thread.sleep(1000); - log.info("{} is ready", threadNum); - try { - barrier.await(2000, TimeUnit.MILLISECONDS); - } catch (Exception e) { - log.warn("BarrierException", e); - } - log.info("{} continue", threadNum); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java deleted file mode 100755 index fba3af8..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.Future; -import java.util.concurrent.RecursiveTask; - -@Slf4j -public class ForkJoinTaskExample extends RecursiveTask { - - public static final int threshold = 2; - private int start; - private int end; - - public ForkJoinTaskExample(int start, int end) { - this.start = start; - this.end = end; - } - - @Override - protected Integer compute() { - int sum = 0; - - //如果任务足够小就计算任务 - boolean canCompute = (end - start) <= threshold; - if (canCompute) { - for (int i = start; i <= end; i++) { - sum += i; - } - } else { - // 如果任务大于阈值,就分裂成两个子任务计算 - int middle = (start + end) / 2; - ForkJoinTaskExample leftTask = new ForkJoinTaskExample(start, middle); - ForkJoinTaskExample rightTask = new ForkJoinTaskExample(middle + 1, end); - - // 执行子任务 - leftTask.fork(); - rightTask.fork(); - - // 等待任务执行结束合并其结果 - int leftResult = leftTask.join(); - int rightResult = rightTask.join(); - - // 合并子任务 - sum = leftResult + rightResult; - } - return sum; - } - - public static void main(String[] args) { - ForkJoinPool forkjoinPool = new ForkJoinPool(); - - //生成一个计算任务,计算1+2+3+4 - ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100); - - //执行一个任务 - Future result = forkjoinPool.submit(task); - - try { - log.info("result:{}", result.get()); - } catch (Exception e) { - log.error("exception", e); - } - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java deleted file mode 100755 index ee36b6e..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -@Slf4j -public class FutureExample { - - static class MyCallable implements Callable { - - @Override - public String call() throws Exception { - log.info("do something in callable"); - Thread.sleep(5000); - return "Done"; - } - } - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - Future future = executorService.submit(new MyCallable()); - log.info("do something in main"); - Thread.sleep(1000); - String result = future.get(); - log.info("result:{}", result); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java deleted file mode 100755 index 34479ad..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; - -@Slf4j -public class FutureTaskExample { - - public static void main(String[] args) throws Exception { - FutureTask futureTask = new FutureTask(new Callable() { - @Override - public String call() throws Exception { - log.info("do something in callable"); - Thread.sleep(5000); - return "Done"; - } - }); - - new Thread(futureTask).start(); - log.info("do something in main"); - Thread.sleep(1000); - String result = futureTask.get(); - log.info("result:{}", result); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java deleted file mode 100755 index 4a32ac9..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -public class SemaphoreExample1 { - - private final static int threadCount = 20; - - public static void main(String[] args) throws Exception { - - ExecutorService exec = Executors.newCachedThreadPool(); - - final Semaphore semaphore = new Semaphore(3); - - for (int i = 0; i < threadCount; i++) { - final int threadNum = i; - exec.execute(() -> { - try { - semaphore.acquire(); // 获取一个许可 - test(threadNum); - semaphore.release(); // 释放一个许可 - } catch (Exception e) { - log.error("exception", e); - } - }); - } - exec.shutdown(); - } - - private static void test(int threadNum) throws Exception { - log.info("{}", threadNum); - Thread.sleep(1000); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java deleted file mode 100755 index da24aff..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -public class SemaphoreExample2 { - - private final static int threadCount = 20; - - public static void main(String[] args) throws Exception { - - ExecutorService exec = Executors.newCachedThreadPool(); - - final Semaphore semaphore = new Semaphore(3); - - for (int i = 0; i < threadCount; i++) { - final int threadNum = i; - exec.execute(() -> { - try { - semaphore.acquire(3); // 获取多个许可 - test(threadNum); - semaphore.release(3); // 释放多个许可 - } catch (Exception e) { - log.error("exception", e); - } - }); - } - exec.shutdown(); - } - - private static void test(int threadNum) throws Exception { - log.info("{}", threadNum); - Thread.sleep(1000); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java deleted file mode 100755 index 03660b3..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mmall.concurrency.example.atomic; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicLong; - -@Slf4j -@ThreadSafe -public class AtomicExample2 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static AtomicLong count = new AtomicLong(0); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count.get()); - } - - private static void add() { - count.incrementAndGet(); - // count.getAndIncrement(); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java deleted file mode 100755 index 561fd4a..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mmall.concurrency.example.atomic; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.LongAdder; - -@Slf4j -@ThreadSafe -public class AtomicExample3 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static LongAdder count = new LongAdder(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private static void add() { - count.increment(); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java deleted file mode 100755 index f52635f..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.mmall.concurrency.example.atomic; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.concurrent.atomic.AtomicReference; - -@Slf4j -@ThreadSafe -public class AtomicExample5 { - - private static AtomicIntegerFieldUpdater updater = - AtomicIntegerFieldUpdater.newUpdater(AtomicExample5.class, "count"); - - @Getter - public volatile int count = 100; - - public static void main(String[] args) { - - AtomicExample5 example5 = new AtomicExample5(); - - if (updater.compareAndSet(example5, 100, 120)) { - log.info("update success 1, {}", example5.getCount()); - } - - if (updater.compareAndSet(example5, 100, 120)) { - log.info("update success 2, {}", example5.getCount()); - } else { - log.info("update failed, {}", example5.getCount()); - } - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java deleted file mode 100755 index 69fd3a6..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.atomic; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicBoolean; - -@Slf4j -@ThreadSafe -public class AtomicExample6 { - - private static AtomicBoolean isHappened = new AtomicBoolean(false); - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - test(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("isHappened:{}", isHappened.get()); - } - - private static void test() { - if (isHappened.compareAndSet(false, true)) { - log.info("execute"); - } - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java deleted file mode 100755 index 9ea33c7..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class DateFormatExample3 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyyMMdd"); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - } - - private static void update(int i) { - log.info("{}, {}", i, DateTime.parse("20180208", dateTimeFormatter).toDate()); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java deleted file mode 100755 index 861058c..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class HashMapExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Map map = new HashMap<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", map.size()); - } - - private static void update(int i) { - map.put(i, i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java deleted file mode 100755 index 3defb68..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class HashSetExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Set set = new HashSet<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", set.size()); - } - - private static void update(int i) { - set.add(i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java deleted file mode 100755 index efcf7a9..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class StringExample1 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static StringBuilder stringBuilder = new StringBuilder(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - update(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", stringBuilder.length()); - } - - private static void update() { - stringBuilder.append("1"); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java deleted file mode 100755 index 1f265dc..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mmall.concurrency.example.concurrent; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class CopyOnWriteArrayListExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static List list = new CopyOnWriteArrayList<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", list.size()); - } - - private static void update(int i) { - list.add(i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java deleted file mode 100755 index 81b7606..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.concurrent; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class CopyOnWriteArraySetExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Set set = new CopyOnWriteArraySet<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", set.size()); - } - - private static void update(int i) { - set.add(i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java deleted file mode 100755 index 53c229e..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample1.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mmall.concurrency.example.count; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class CountExample1 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static int count = 0; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private static void add() { - count++; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java deleted file mode 100755 index 0856d27..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample2.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mmall.concurrency.example.count; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicInteger; - -@Slf4j -@ThreadSafe -public class CountExample2 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static AtomicInteger count = new AtomicInteger(0); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count.get()); - } - - private static void add() { - count.incrementAndGet(); - // count.getAndIncrement(); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java deleted file mode 100755 index 888ab0d..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample3.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mmall.concurrency.example.count; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class CountExample3 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static int count = 0; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private synchronized static void add() { - count++; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java deleted file mode 100755 index c8206ce..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/count/CountExample4.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.count; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class CountExample4 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static volatile int count = 0; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private static void add() { - count++; - // 1、count - // 2、+1 - // 3、count - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java deleted file mode 100755 index d3d9b9f..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController1.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mmall.concurrency.example.hystrix; - -import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Slf4j -@Controller -@RequestMapping("/hystrix1") -@DefaultProperties(defaultFallback = "defaultFail") -public class HystrixController1 { - - @HystrixCommand(fallbackMethod = "fail1") - @RequestMapping("/test1") - @ResponseBody - public String test1() { - throw new RuntimeException(); - } - - private String fail1() { - log.warn("fail1"); - return "fail1"; - } - - @HystrixCommand(fallbackMethod = "fail2") - @RequestMapping("/test2") - @ResponseBody - public String test2() { - throw new RuntimeException(); - } - - @HystrixCommand(fallbackMethod = "fail3") - private String fail2() { - log.warn("fail2"); - throw new RuntimeException(); - } - - @HystrixCommand - private String fail3() { - log.warn("fail3"); - throw new RuntimeException(); - } - - private String defaultFail() { - log.warn("default fail"); - return "default fail"; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java deleted file mode 100755 index 582761a..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController2.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.mmall.concurrency.example.hystrix; - -import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Slf4j -@Controller -@RequestMapping("/hystrix2") -@DefaultProperties(defaultFallback = "defaultFail") -public class HystrixController2 { - - @HystrixCommand(commandProperties = { - @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500") - }) - @RequestMapping("/test1") - @ResponseBody - public String test1() throws Exception { - Thread.sleep(1000); - return "test1"; - } - - @HystrixCommand(commandProperties = { - @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")}, - threadPoolProperties = { - @HystrixProperty(name = "coreSize", value = "30"), - @HystrixProperty(name = "maxQueueSize", value = "101"), - @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"), - @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"), - @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"), - @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440") - }) - @RequestMapping("/test2") - @ResponseBody - public String test2() throws Exception { - Thread.sleep(1000); - return "test2"; - } - - private String defaultFail() { - log.warn("default fail"); - return "default fail"; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java deleted file mode 100755 index de5ab6b..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/hystrix/HystrixController3.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.mmall.concurrency.example.hystrix; - -import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; - -@Slf4j -@Controller -@RequestMapping("/hystrix3") -@DefaultProperties(defaultFallback = "defaultFail") -public class HystrixController3 { - - @HystrixCommand(commandProperties = { - @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 熔断器在整个统计时间内是否开启的阀值 - @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "3"), // 至少有3个请求才进行熔断错误比率计算 - @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"), //当出错率超过50%后熔断器启动 - @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"), // 熔断器工作时间,超过这个时间,先放一个请求进去,成功的话就关闭熔断,失败就再等一段时间 - @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000")// 统计滚动的时间窗口 - }) - @RequestMapping("/test1") - @ResponseBody - public String test1(@RequestParam("id") Integer id) { - log.info("id:{}", id); - if (id % 2 == 0) { - throw new RuntimeException(); - } - return "test_" + id; - } - - private String defaultFail() { - log.warn("default fail"); - return "default fail"; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java deleted file mode 100755 index 49d588b..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.mmall.concurrency.example.immutable; - -import com.google.common.collect.Maps; -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; - -@Slf4j -@NotThreadSafe -public class ImmutableExample1 { - - private final static Integer a = 1; - private final static String b = "2"; - private final static Map map = Maps.newHashMap(); - - static { - map.put(1, 2); - map.put(3, 4); - map.put(5, 6); - } - - public static void main(String[] args) { -// a = 2; -// b = "3"; -// map = Maps.newHashMap(); - map.put(1, 3); - log.info("{}", map.get(1)); - } - - private void test(final int a) { -// a = 1; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java deleted file mode 100755 index 2fc3fbb..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.mmall.concurrency.example.immutable; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.mmall.concurrency.annoations.ThreadSafe; - -@ThreadSafe -public class ImmutableExample3 { - - private final static ImmutableList list = ImmutableList.of(1, 2, 3); - - private final static ImmutableSet set = ImmutableSet.copyOf(list); - - private final static ImmutableMap map = ImmutableMap.of(1, 2, 3, 4); - - private final static ImmutableMap map2 = ImmutableMap.builder() - .put(1, 2).put(3, 4).put(5, 6).build(); - - - public static void main(String[] args) { - System.out.println(map2.get(3)); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java deleted file mode 100755 index 4c372f2..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.mmall.concurrency.example.lock; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -@Slf4j -@ThreadSafe -public class LockExample2 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static int count = 0; - - private final static Lock lock = new ReentrantLock(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private static void add() { - lock.lock(); - try { - count++; - } finally { - lock.unlock(); - } - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java deleted file mode 100755 index 31a3dd5..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mmall.concurrency.example.lock; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - -@Slf4j -public class LockExample6 { - - public static void main(String[] args) { - ReentrantLock reentrantLock = new ReentrantLock(); - Condition condition = reentrantLock.newCondition(); - - new Thread(() -> { - try { - reentrantLock.lock(); - log.info("wait signal"); // 1 - condition.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - log.info("get signal"); // 4 - reentrantLock.unlock(); - }).start(); - - new Thread(() -> { - reentrantLock.lock(); - log.info("get lock"); // 2 - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - condition.signalAll(); - log.info("send signal ~ "); // 3 - reentrantLock.unlock(); - }).start(); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java deleted file mode 100755 index 0affdfe..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.mmall.concurrency.example; \ No newline at end of file diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java deleted file mode 100755 index 3279644..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/Escape.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.mmall.concurrency.example.publish; - -import com.mmall.concurrency.annoations.NotRecommend; -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@NotThreadSafe -@NotRecommend -public class Escape { - - private int thisCanBeEscape = 0; - - public Escape () { - new InnerClass(); - } - - private class InnerClass { - - public InnerClass() { - log.info("{}", Escape.this.thisCanBeEscape); - } - } - - public static void main(String[] args) { - new Escape(); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java deleted file mode 100755 index 405d963..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample1.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.mmall.concurrency.example.rateLimiter; - -import com.google.common.util.concurrent.RateLimiter; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.TimeUnit; - -@Slf4j -public class RateLimiterExample1 { - - private static RateLimiter rateLimiter = RateLimiter.create(5); - - public static void main(String[] args) throws Exception { - - for (int index = 0; index < 100; index++) { - if (rateLimiter.tryAcquire(190, TimeUnit.MILLISECONDS)) { - handle(index); - } - } - } - - private static void handle(int i) { - log.info("{}", i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java deleted file mode 100755 index 297dbcb..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/rateLimiter/RateLimiterExample2.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.mmall.concurrency.example.rateLimiter; - -import com.google.common.util.concurrent.RateLimiter; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.TimeUnit; - -@Slf4j -public class RateLimiterExample2 { - - private static RateLimiter rateLimiter = RateLimiter.create(5); - - public static void main(String[] args) throws Exception { - - for (int index = 0; index < 100; index++) { - rateLimiter.acquire(); - handle(index); - } - } - - private static void handle(int i) { - log.info("{}", i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java deleted file mode 100755 index c0dc41e..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.mmall.concurrency.example.singleton; - -import com.mmall.concurrency.annoations.NotThreadSafe; - -/** - * 懒汉模式 - * 单例实例在第一次使用时进行创建 - */ -@NotThreadSafe -public class SingletonExample1 { - - // 私有构造函数 - private SingletonExample1() { - - } - - // 单例对象 - private static SingletonExample1 instance = null; - - // 静态的工厂方法 - public static SingletonExample1 getInstance() { - if (instance == null) { - instance = new SingletonExample1(); - } - return instance; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java deleted file mode 100755 index b53df2a..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.mmall.concurrency.example.singleton; - -import com.mmall.concurrency.annoations.ThreadSafe; - -/** - * 懒汉模式 -》 双重同步锁单例模式 - * 单例实例在第一次使用时进行创建 - */ -@ThreadSafe -public class SingletonExample5 { - - // 私有构造函数 - private SingletonExample5() { - - } - - // 1、memory = allocate() 分配对象的内存空间 - // 2、ctorInstance() 初始化对象 - // 3、instance = memory 设置instance指向刚分配的内存 - - // 单例对象 volatile + 双重检测机制 -> 禁止指令重排 - private volatile static SingletonExample5 instance = null; - - // 静态的工厂方法 - public static SingletonExample5 getInstance() { - if (instance == null) { // 双重检测机制 // B - synchronized (SingletonExample5.class) { // 同步锁 - if (instance == null) { - instance = new SingletonExample5(); // A - 3 - } - } - } - return instance; - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java deleted file mode 100755 index 1755598..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.mmall.concurrency.example.singleton; - -import com.mmall.concurrency.annoations.ThreadSafe; - -/** - * 饿汉模式 - * 单例实例在类装载时进行创建 - */ -@ThreadSafe -public class SingletonExample6 { - - // 私有构造函数 - private SingletonExample6() { - - } - - // 单例对象 - private static SingletonExample6 instance = null; - - static { - instance = new SingletonExample6(); - } - - // 静态的工厂方法 - public static SingletonExample6 getInstance() { - return instance; - } - - public static void main(String[] args) { - System.out.println(getInstance().hashCode()); - System.out.println(getInstance().hashCode()); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java deleted file mode 100755 index 071e096..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mmall.concurrency.example.syncContainer; - -import com.google.common.collect.Lists; -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Collections; -import java.util.List; -import java.util.Vector; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class CollectionsExample1 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static List list = Collections.synchronizedList(Lists.newArrayList()); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", list.size()); - } - - private static void update(int i) { - list.add(i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java deleted file mode 100755 index 7b571a0..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mmall.concurrency.example.syncContainer; - -import com.google.common.collect.Sets; -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Collections; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class CollectionsExample2 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Set set = Collections.synchronizedSet(Sets.newHashSet()); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", set.size()); - } - - private static void update(int i) { - set.add(i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java deleted file mode 100755 index 9978bd2..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mmall.concurrency.example.syncContainer; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class CollectionsExample3 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Map map = Collections.synchronizedMap(new HashMap<>()); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", map.size()); - } - - private static void update(int i) { - map.put(i, i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java deleted file mode 100755 index 620f915..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mmall.concurrency.example.syncContainer; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class HashTableExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Map map = new Hashtable<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", map.size()); - } - - private static void update(int i) { - map.put(i, i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java deleted file mode 100755 index 2b622a3..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.syncContainer; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.Vector; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class VectorExample1 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static List list = new Vector<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", list.size()); - } - - private static void update(int i) { - list.add(i); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java deleted file mode 100755 index 18a5528..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.mmall.concurrency.example.syncContainer; - -import com.mmall.concurrency.annoations.NotThreadSafe; - -import java.util.Vector; - -@NotThreadSafe -public class VectorExample2 { - - private static Vector vector = new Vector<>(); - - public static void main(String[] args) { - - while (true) { - - for (int i = 0; i < 10; i++) { - vector.add(i); - } - - Thread thread1 = new Thread() { - public void run() { - for (int i = 0; i < vector.size(); i++) { - vector.remove(i); - } - } - }; - - Thread thread2 = new Thread() { - public void run() { - for (int i = 0; i < vector.size(); i++) { - vector.get(i); - } - } - }; - thread1.start(); - thread2.start(); - } - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java deleted file mode 100755 index 89a785f..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mmall.concurrency.example.threadLocal; - -public class RequestHolder { - - private final static ThreadLocal requestHolder = new ThreadLocal<>(); - - public static void add(Long id) { - requestHolder.set(id); - } - - public static Long getId() { - return requestHolder.get(); - } - - public static void remove() { - requestHolder.remove(); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java deleted file mode 100755 index b489ed3..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.mmall.concurrency.example.threadPool; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class ThreadPoolExample2 { - - public static void main(String[] args) { - - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - final int index = i; - executorService.execute(new Runnable() { - @Override - public void run() { - log.info("task:{}", index); - } - }); - } - executorService.shutdown(); - } -} diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java b/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java deleted file mode 100755 index 111c2aa..0000000 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.mmall.concurrency.example.threadPool; - -import lombok.extern.slf4j.Slf4j; - -import java.util.Date; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -@Slf4j -public class ThreadPoolExample4 { - - public static void main(String[] args) { - - ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); - -// executorService.schedule(new Runnable() { -// @Override -// public void run() { -// log.warn("schedule run"); -// } -// }, 3, TimeUnit.SECONDS); - - executorService.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - log.warn("schedule run"); - } - }, 1, 3, TimeUnit.SECONDS); -// executorService.shutdown(); - - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - log.warn("timer run"); - } - }, new Date(), 5 * 1000); - } -} diff --git a/HighConcurrency/src/main/main.iml b/HighConcurrency/src/main/main.iml deleted file mode 100755 index 908ad4f..0000000 --- a/HighConcurrency/src/main/main.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/HighConcurrency/src/test/test.iml b/HighConcurrency/src/test/test.iml deleted file mode 100755 index a0e49a3..0000000 --- a/HighConcurrency/src/test/test.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index a1998e1..b2f6a53 100755 --- a/README.md +++ b/README.md @@ -1,82 +1,108 @@ -# 联系我 -![](http://upload-images.jianshu.io/upload_images/4685968-6a8b28d2fd95e8b7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "图片标题") -1.[Java开发技术交流Q群](https://jq.qq.com/?_wv=1027&k=5UB4P1T) - -2.[完整博客链接](http://www.shishusheng.com) - -3.[个人知乎](http://www.zhihu.com/people/shi-shu-sheng-) - -4.[gayhub](https://github.com/Wasabi1234) - - -# [Java 高并发理论 基础知识点全覆盖](https://www.jianshu.com/p/8a3c6ac1e01e) - -# 第1章 准备(入门) -目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从重点、特点、适合人群及学习收获几个方面对知识体系进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 - -# 第2章 准备工作 -本章主要是为知识点里代码演示做必要的准备。首先会基于SpringBoot快速搭建一个方便演示的Java项目 -项目搭建好,我会使用简单的例子演示一下并发的模拟验证,主要包括对工具Postman、JMeter、Apache Bench(AB)的使用,以及使用并发的代码来验证并发处理的正确性 - -# 第3章 线程安全性讲解 -本章讲解线程安全性,主要从原子性、可见性、有序性三个方面进行讲解 -原子性部分,会详细讲解atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 -可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性 -有序性部分,则重点讲解了happens-before原则 - -# 第4章 安全发布对象讲解 -本章主要讲解安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 -这一章也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 - -# 第5章 线程安全策略讲解 -本章主要讲解线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... - -# 第6章 J.U.C之AQS讲解 -AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点讲解AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... - -# 第7章 J.U.C组件拓展 -这一章继续讲解J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 - -# 第8章 线程调度-线程池讲解 -本章讲解J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 - - -# 第9章 多线程并发拓展讲解 -本章会对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 - - -# 第10章 高并发之扩容思路 -高并发部分:主讲思路,侧重面试,本章主要讲扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 - -# 第11章 高并发之缓存思路 -高并发部分:主讲思路,本章讲解高并发中缓存方案。包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis - -# 第12章 高并发之消息队列思路 -高并发部分:主讲思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 - -# 第13章 高并发之应用拆分思路 -本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 - -# 第14章 高并发之应用限流思路 -高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 - -之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 - -# 第15章 服务降级与服务熔断思路 -通过举例让大家明白什么是服务降级和服务熔断 - -之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 - -最后介绍了Hystrix - -# 第16章 数据库分库分表与高可用手段 -高并发部分:主讲思路,从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别; - -最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表 - -之后介绍了高可用的三个常用手段:任务调度系统分布 - -# 第17章 知识体系总结 -对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 - -![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +# 联系我 +![](http://upload-images.jianshu.io/upload_images/4685968-6a8b28d2fd95e8b7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "图片标题") +1.[Java开发技术交流Q群](https://jq.qq.com/?_wv=1027&k=5UB4P1T) + +2.[完整博客链接](http://www.shishusheng.com) + +3.[个人知乎](http://www.zhihu.com/people/shi-shu-sheng-) + +4.[gayhub](https://github.com/Wasabi1234) + + +# [Java 高并发理论 基础知识点全覆盖](https://www.jianshu.com/p/8a3c6ac1e01e) + +# 带你构建完整的并发与高并发知识体系 +## 一旦形成完整的知识体系,无论是跳槽面试还是开发,你都将是最快脱颖而出的那一个 + +![](https://upload-images.jianshu.io/upload_images/4685968-92447a24b4f8cf38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +# 掌握多线程并发与线程安全,让你的程序更可靠 +## 通过大量的图例和代码来讲解,你犯过的错都在这里了 +![](https://upload-images.jianshu.io/upload_images/4685968-6fc1465c0b063ef8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +# 学会高并发处理思路与手段,让跳槽面试从容不迫 +## 并发与高并发是面试的重要考察点,常问面试问题与答案都在这里了 +![](https://upload-images.jianshu.io/upload_images/4685968-7fd306f9bc9b4bec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +# 环境参数 +基础工具 Maven、JDK8、Tomcat、MySQL、Redis + +开发工具 Intellij IDEA + +演示工具 Postman、JMeter、Apache Bench + +项目框架 SpringBoot、Mybatis + +可选组件 Kafka、RabbitMQ、elastic-job等 + +# 教程目录 + +# 第1章 准备(入门) +目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从重点、特点、适合人群及学习收获几个方面对知识体系进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 + +# 第2章 准备工作 +本章主要是为知识点里代码演示做必要的准备。首先会基于SpringBoot快速搭建一个方便演示的Java项目 +项目搭建好,我会使用简单的例子演示一下并发的模拟验证,主要包括对工具Postman、JMeter、Apache Bench(AB)的使用,以及使用并发的代码来验证并发处理的正确性 + +# 第3章 线程安全性讲解 +本章讲解线程安全性,主要从原子性、可见性、有序性三个方面进行讲解 +原子性部分,会详细讲解atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 +可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性 +有序性部分,则重点讲解了happens-before原则 + +# 第4章 安全发布对象讲解 +本章主要讲解安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 +这一章也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 + +# 第5章 线程安全策略讲解 +本章主要讲解线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... + +# 第6章 J.U.C之AQS讲解 +AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点讲解AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... + +# 第7章 J.U.C组件拓展 +这一章继续讲解J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 + +# 第8章 线程调度-线程池讲解 +本章讲解J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 + + +# 第9章 多线程并发拓展讲解 +本章会对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 + + +# 第10章 高并发之扩容思路 +高并发部分:主讲思路,侧重面试,本章主要讲扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 + +# 第11章 高并发之缓存思路 +高并发部分:主讲思路,本章讲解高并发中缓存方案。包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis + +# 第12章 高并发之消息队列思路 +高并发部分:主讲思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 + +# 第13章 高并发之应用拆分思路 +本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 + +# 第14章 高并发之应用限流思路 +高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 + +之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 + +# 第15章 服务降级与服务熔断思路 +通过举例让大家明白什么是服务降级和服务熔断 + +之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 + +最后介绍了Hystrix + +# 第16章 数据库分库分表与高可用手段 +高并发部分:主讲思路,从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别; + +最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表 + +之后介绍了高可用的三个常用手段:任务调度系统分布 + +# 第17章 知识体系总结 +对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 + +![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) diff --git a/concurrency.iml b/concurrency.iml index 777de43..a91de9f 100644 --- a/concurrency.iml +++ b/concurrency.iml @@ -10,7 +10,10 @@ - + + + + @@ -19,8 +22,11 @@ - - + + + + + @@ -51,7 +57,6 @@ - @@ -61,7 +66,6 @@ - @@ -72,7 +76,7 @@ - + @@ -81,5 +85,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java similarity index 94% rename from src/main/java/com/mmall/concurrency/ConcurrencyApplication.java rename to concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java index 356d14d..d9e87b3 100755 --- a/src/main/java/com/mmall/concurrency/ConcurrencyApplication.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency; +package com.javaedge.concurrency; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,6 +7,9 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +/** + * @author sss + */ @SpringBootApplication public class ConcurrencyApplication extends WebMvcConfigurerAdapter{ diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyTest.java b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java similarity index 91% rename from HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyTest.java rename to concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java index 2399b85..ddf097e 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/ConcurrencyTest.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency; +package com.javaedge.concurrency; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; @@ -8,6 +8,9 @@ import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; +/** + * @author sss + */ @Slf4j @NotThreadSafe public class ConcurrencyTest { diff --git a/src/main/java/com/mmall/concurrency/HttpFilter.java b/concurrency/src/main/java/com/javaedge/concurrency/HttpFilter.java similarity index 90% rename from src/main/java/com/mmall/concurrency/HttpFilter.java rename to concurrency/src/main/java/com/javaedge/concurrency/HttpFilter.java index ab62a05..aec3df4 100755 --- a/src/main/java/com/mmall/concurrency/HttpFilter.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/HttpFilter.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency; +package com.javaedge.concurrency; -import com.mmall.concurrency.example.threadLocal.RequestHolder; +import com.javaedge.concurrency.example.threadLocal.RequestHolder; import lombok.extern.slf4j.Slf4j; import javax.servlet.Filter; diff --git a/src/main/java/com/mmall/concurrency/HttpInterceptor.java b/concurrency/src/main/java/com/javaedge/concurrency/HttpInterceptor.java similarity index 87% rename from src/main/java/com/mmall/concurrency/HttpInterceptor.java rename to concurrency/src/main/java/com/javaedge/concurrency/HttpInterceptor.java index 03d598c..4ed6d77 100755 --- a/src/main/java/com/mmall/concurrency/HttpInterceptor.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/HttpInterceptor.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency; +package com.javaedge.concurrency; -import com.mmall.concurrency.example.threadLocal.RequestHolder; +import com.javaedge.concurrency.example.threadLocal.RequestHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; diff --git a/src/main/java/com/mmall/concurrency/ServletInitializer.java b/concurrency/src/main/java/com/javaedge/concurrency/ServletInitializer.java similarity index 91% rename from src/main/java/com/mmall/concurrency/ServletInitializer.java rename to concurrency/src/main/java/com/javaedge/concurrency/ServletInitializer.java index e741569..67b0810 100755 --- a/src/main/java/com/mmall/concurrency/ServletInitializer.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/ServletInitializer.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency; +package com.javaedge.concurrency; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; diff --git a/src/main/java/com/mmall/concurrency/TestController.java b/concurrency/src/main/java/com/javaedge/concurrency/TestController.java similarity index 91% rename from src/main/java/com/mmall/concurrency/TestController.java rename to concurrency/src/main/java/com/javaedge/concurrency/TestController.java index cef6f01..bc49c01 100755 --- a/src/main/java/com/mmall/concurrency/TestController.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/TestController.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency; +package com.javaedge.concurrency; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java similarity index 88% rename from HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java index 07a140c..b1f1268 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java similarity index 88% rename from HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java index 9886fb9..3413bd8 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/Recommend.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/Recommend.java similarity index 88% rename from HighConcurrency/src/main/java/com/mmall/concurrency/annoations/Recommend.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/Recommend.java index 8a3a2bd..6e8c350 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/annoations/Recommend.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/Recommend.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java similarity index 88% rename from src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java index e91e512..c38ef6f 100755 --- a/src/main/java/com/mmall/concurrency/annoations/ThreadSafe.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample1.java similarity index 96% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample1.java index bbdf25d..ce28dda 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample1.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample2.java similarity index 96% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample2.java index 590ebb6..65dacf0 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample2.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample1.java similarity index 95% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample1.java index e9a888c..f117926 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample1.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample2.java similarity index 96% rename from src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample2.java index 1bbcf42..19024d8 100755 --- a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample2.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample3.java similarity index 95% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample3.java index 3105ce2..90663bc 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample3.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/ForkJoinTaskExample.java similarity index 97% rename from src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/ForkJoinTaskExample.java index fba3af8..5380f90 100755 --- a/src/main/java/com/mmall/concurrency/example/aqs/ForkJoinTaskExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/ForkJoinTaskExample.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureExample.java similarity index 94% rename from src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureExample.java index ee36b6e..54781b7 100755 --- a/src/main/java/com/mmall/concurrency/example/aqs/FutureExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureExample.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureTaskExample.java similarity index 94% rename from src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureTaskExample.java index 34479ad..2d41e2d 100755 --- a/src/main/java/com/mmall/concurrency/example/aqs/FutureTaskExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureTaskExample.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample1.java similarity index 95% rename from src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample1.java index 4a32ac9..62c25e2 100755 --- a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample1.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample2.java similarity index 95% rename from src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample2.java index da24aff..47ce2b4 100755 --- a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample2.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample3.java similarity index 96% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample3.java index 82c6073..9c0ebb7 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample3.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample4.java similarity index 96% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample4.java index 27ee7b8..c73e5af 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample4.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample1.java similarity index 93% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample1.java index fad1bea..eaba128 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample1.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.atomic; +package com.javaedge.concurrency.example.atomic; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample2.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample2.java index 03660b3..452bfb4 100755 --- a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample2.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.atomic; +package com.javaedge.concurrency.example.atomic; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample3.java similarity index 90% rename from src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample3.java index 561fd4a..c6e20d3 100755 --- a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample3.java @@ -1,13 +1,12 @@ -package com.mmall.concurrency.example.atomic; +package com.javaedge.concurrency.example.atomic; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.LongAdder; @Slf4j diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample4.java similarity index 62% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample4.java index e8ec003..d2b3c25 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample4.java @@ -1,14 +1,9 @@ -package com.mmall.concurrency.example.atomic; +package com.javaedge.concurrency.example.atomic; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.atomic.LongAdder; @Slf4j @ThreadSafe diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample5.java similarity index 84% rename from src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample5.java index f52635f..f4cc64c 100755 --- a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample5.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample5.java @@ -1,11 +1,10 @@ -package com.mmall.concurrency.example.atomic; +package com.javaedge.concurrency.example.atomic; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.concurrent.atomic.AtomicReference; @Slf4j @ThreadSafe diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample6.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample6.java index 69fd3a6..7d37d40 100755 --- a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample6.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample6.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.atomic; +package com.javaedge.concurrency.example.atomic; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/CacheController.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/CacheController.java similarity index 91% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/CacheController.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/CacheController.java index 2bd6a67..a0354ec 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/CacheController.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/CacheController.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.cache; +package com.javaedge.concurrency.example.cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -6,6 +6,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +/** + * @author sss + */ @Controller @RequestMapping("/cache") public class CacheController { diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample1.java similarity index 97% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample1.java index 3e06a8a..e66ca99 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample1.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.cache; +package com.javaedge.concurrency.example.cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample2.java similarity index 97% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample2.java index 9bf370d..9c192ab 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/GuavaCacheExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample2.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.cache; +package com.javaedge.concurrency.example.cache; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisClient.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisClient.java similarity index 92% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisClient.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisClient.java index 8979ce5..98381f5 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisClient.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisClient.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.cache; +package com.javaedge.concurrency.example.cache; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; @@ -6,7 +6,9 @@ import javax.annotation.Resource; -// http://redis.cn/ +/** + * @author sss + */ @Component public class RedisClient { @@ -25,7 +27,6 @@ public void set(String key, String value) throws Exception { } } - public String get(String key) throws Exception { Jedis jedis = null; try { @@ -38,3 +39,4 @@ public String get(String key) throws Exception { } } } + diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisConfig.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisConfig.java similarity index 86% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisConfig.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisConfig.java index e41179e..27b3e69 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/cache/RedisConfig.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisConfig.java @@ -1,10 +1,13 @@ -package com.mmall.concurrency.example.cache; +package com.javaedge.concurrency.example.cache; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import redis.clients.jedis.JedisPool; +/** + * @author sss + */ @Configuration public class RedisConfig { diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/ArrayListExample.java similarity index 92% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/ArrayListExample.java index 0fa0f98..b6c4b04 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/ArrayListExample.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample1.java similarity index 92% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample1.java index 0337434..e560455 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample1.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.text.SimpleDateFormat; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample2.java similarity index 93% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample2.java index 06c2596..cfdcad9 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample2.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.text.SimpleDateFormat; diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample3.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample3.java index 9ea33c7..c23d5fb 100755 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample3.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashMapExample.java similarity index 92% rename from src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashMapExample.java index 861058c..0220ee6 100755 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashMapExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashMapExample.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashSetExample.java similarity index 92% rename from src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashSetExample.java index 3defb68..8d1c90c 100755 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/HashSetExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashSetExample.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.HashSet; diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample1.java similarity index 92% rename from src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample1.java index efcf7a9..fc41eb8 100755 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample1.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample2.java similarity index 92% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample2.java index c0e709d..98c21ef 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample2.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.commonUnsafe; +package com.javaedge.concurrency.example.commonUnsafe; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentHashMapExample.java similarity index 93% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentHashMapExample.java index 5cf7fe1..b8c30c8 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentHashMapExample.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.concurrent; +package com.javaedge.concurrency.example.concurrent; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Map; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListMapExample.java similarity index 90% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListMapExample.java index 9aee082..b81407e 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListMapExample.java @@ -1,10 +1,9 @@ -package com.mmall.concurrency.example.concurrent; +package com.javaedge.concurrency.example.concurrent; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListSetExample.java similarity index 93% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListSetExample.java index 5732bea..1a1833c 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListSetExample.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.concurrent; +package com.javaedge.concurrency.example.concurrent; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Set; diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArrayListExample.java similarity index 91% rename from src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArrayListExample.java index 1f265dc..a47d3d6 100755 --- a/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArrayListExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArrayListExample.java @@ -1,9 +1,8 @@ -package com.mmall.concurrency.example.concurrent; +package com.javaedge.concurrency.example.concurrent; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArraySetExample.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArraySetExample.java index 81b7606..29d6aad 100755 --- a/src/main/java/com/mmall/concurrency/example/concurrent/CopyOnWriteArraySetExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArraySetExample.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.concurrent; +package com.javaedge.concurrency.example.concurrent; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Set; diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample1.java similarity index 92% rename from src/main/java/com/mmall/concurrency/example/count/CountExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample1.java index 53c229e..7cfc0c1 100755 --- a/src/main/java/com/mmall/concurrency/example/count/CountExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample1.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.count; +package com.javaedge.concurrency.example.count; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample2.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/count/CountExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample2.java index 0856d27..a386b11 100755 --- a/src/main/java/com/mmall/concurrency/example/count/CountExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample2.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.count; +package com.javaedge.concurrency.example.count; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample3.java similarity index 92% rename from src/main/java/com/mmall/concurrency/example/count/CountExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample3.java index 888ab0d..5a63a03 100755 --- a/src/main/java/com/mmall/concurrency/example/count/CountExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample3.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.count; +package com.javaedge.concurrency.example.count; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/count/CountExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample4.java similarity index 92% rename from src/main/java/com/mmall/concurrency/example/count/CountExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample4.java index c8206ce..0d961f0 100755 --- a/src/main/java/com/mmall/concurrency/example/count/CountExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample4.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.count; +package com.javaedge.concurrency.example.count; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java b/concurrency/src/main/java/com/javaedge/concurrency/example/deadLock/DeadLock.java similarity index 97% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/deadLock/DeadLock.java index 3c19f37..304ce17 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/deadLock/DeadLock.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.deadLock; +package com.javaedge.concurrency.example.deadLock; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample1.java similarity index 85% rename from src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample1.java index 49d588b..5797992 100755 --- a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample1.java @@ -1,7 +1,7 @@ -package com.mmall.concurrency.example.immutable; +package com.javaedge.concurrency.example.immutable; import com.google.common.collect.Maps; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Map; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample2.java similarity index 82% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample2.java index 62bb525..eeaf7e1 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample2.java @@ -1,7 +1,7 @@ -package com.mmall.concurrency.example.immutable; +package com.javaedge.concurrency.example.immutable; import com.google.common.collect.Maps; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Collections; diff --git a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample3.java similarity index 86% rename from src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample3.java index 2fc3fbb..587cd2d 100755 --- a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample3.java @@ -1,9 +1,9 @@ -package com.mmall.concurrency.example.immutable; +package com.javaedge.concurrency.example.immutable; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; @ThreadSafe public class ImmutableExample3 { diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample1.java similarity index 92% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample1.java index 1c1e971..942d26f 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample1.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.lock; +package com.javaedge.concurrency.example.lock; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample2.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/lock/LockExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample2.java index 4c372f2..ae631bb 100755 --- a/src/main/java/com/mmall/concurrency/example/lock/LockExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample2.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.lock; +package com.javaedge.concurrency.example.lock; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample3.java similarity index 95% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample3.java index d50d697..d6c0be0 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample3.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.lock; +package com.javaedge.concurrency.example.lock; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample4.java similarity index 98% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample4.java index 79305d2..b775e55 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample4.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.lock; +package com.javaedge.concurrency.example.lock; import java.util.concurrent.locks.StampedLock; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample5.java similarity index 93% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample5.java index 97b4a83..cbb9e12 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample5.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.lock; +package com.javaedge.concurrency.example.lock; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample6.java similarity index 95% rename from src/main/java/com/mmall/concurrency/example/lock/LockExample6.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample6.java index 31a3dd5..94fae7b 100755 --- a/src/main/java/com/mmall/concurrency/example/lock/LockExample6.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample6.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.lock; +package com.javaedge.concurrency.example.lock; import lombok.extern.slf4j.Slf4j; diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/Message.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/Message.java new file mode 100644 index 0000000..aa9320f --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/Message.java @@ -0,0 +1,19 @@ +package com.javaedge.concurrency.example.mq; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; + +/** + * @author sss + * @date 2019-02-20 + */ +@Data +public class Message { + private Long id; + private String msg; + private Date sendTime; +} diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/MqController.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/MqController.java new file mode 100644 index 0000000..debb914 --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/MqController.java @@ -0,0 +1,33 @@ +package com.javaedge.concurrency.example.mq; + +import com.javaedge.concurrency.example.mq.kafka.KafkaSender; +import com.javaedge.concurrency.example.mq.rabbitmq.RabbitMqClient; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; + +/** + * @author sss + * @date 2019-02-20 + */ +@Controller +@RequestMapping("/mq") +public class MqController { + + @Resource + private RabbitMqClient rabbitMqClient; + + @Resource + private KafkaSender kafkaSender; + + @RequestMapping("/send") + @ResponseBody + public String send(@RequestParam("message") String message) { + rabbitMqClient.send(message); + kafkaSender.send(message); + return "success"; + } +} diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaReceiver.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaReceiver.java new file mode 100644 index 0000000..4aafc4e --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaReceiver.java @@ -0,0 +1,20 @@ +package com.javaedge.concurrency.example.mq.kafka; + +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +/** + * @author sss + * @date 2019-02-20 + */ +@Component +@Slf4j +public class KafkaReceiver { + + @KafkaListener(topics = {TopicConstants.TEST}) + public void receive(ConsumerRecord record) { + log.info("record:{}", record); + } +} diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaSender.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaSender.java new file mode 100644 index 0000000..5cabdf7 --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaSender.java @@ -0,0 +1,32 @@ +package com.javaedge.concurrency.example.mq.kafka; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.javaedge.concurrency.example.mq.Message; +import lombok.extern.slf4j.Slf4j; +import org.springframework.kafka.core.KafkaTemplate; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * @author sss + * @date 2019-02-20 + */ +@Slf4j +public class KafkaSender { + + @Resource + private KafkaTemplate kafkaTemplate; + + private Gson gson = new GsonBuilder().create(); + + public void send(String msg) { + Message message = new Message(); + message.setId(System.currentTimeMillis()); + message.setMsg(msg); + message.setSendTime(new Date()); + log.info("send message:{}", message); + kafkaTemplate.send(TopicConstants.TEST, gson.toJson(message)); + } +} diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/TopicConstants.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/TopicConstants.java new file mode 100644 index 0000000..d1b8946 --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/TopicConstants.java @@ -0,0 +1,12 @@ +package com.javaedge.concurrency.example.mq.kafka; + +/** + * @author sss + * @date 2019-02-20 + */ +public interface TopicConstants { + + String TEST = "test"; + + String MESSAGE = "message"; +} diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/QueueConstants.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/QueueConstants.java new file mode 100644 index 0000000..208e40d --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/QueueConstants.java @@ -0,0 +1,12 @@ +package com.javaedge.concurrency.example.mq.rabbitmq; + +/** + * @author sss + * @date 2019-02-20 + */ +public interface QueueConstants { + + String TEST = "test"; + + String MESSAGE = "message"; +} diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqClient.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqClient.java new file mode 100644 index 0000000..629554f --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqClient.java @@ -0,0 +1,26 @@ +package com.javaedge.concurrency.example.mq.rabbitmq; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; + +/** + * @author sss + * @date 2019-02-20 + */ +@Slf4j +@Configuration +public class RabbitMqClient { + + @Resource + private RabbitTemplate rabbitTemplate; + + public void send(String message) { + rabbitTemplate.convertAndSend(QueueConstants.TEST,message); + } +} + + + diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqConfig.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqConfig.java new file mode 100644 index 0000000..5bb47ff --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqConfig.java @@ -0,0 +1,21 @@ +package com.javaedge.concurrency.example.mq.rabbitmq; + +import org.springframework.amqp.core.Queue; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author sss + * @date 2019-02-20 + */ +@Configuration +public class RabbitMqConfig { + + @Bean + public Queue queue() { + return new Queue(QueueConstants.TEST); + } +} + + + diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqServer.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqServer.java new file mode 100644 index 0000000..82f2bb9 --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqServer.java @@ -0,0 +1,19 @@ +package com.javaedge.concurrency.example.mq.rabbitmq; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.context.annotation.Configuration; + +/** + * @author sss + * @date 2019-02-20 + */ +@Slf4j +@Configuration +public class RabbitMqServer { + + @RabbitListener(queues = QueueConstants.TEST) + public void receive(String message) { + log.info("{}", message); + } +} diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/package-info.java b/concurrency/src/main/java/com/javaedge/concurrency/example/package-info.java new file mode 100755 index 0000000..c90d4ba --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/package-info.java @@ -0,0 +1 @@ +package com.javaedge.concurrency.example; \ No newline at end of file diff --git a/src/main/java/com/mmall/concurrency/example/publish/Escape.java b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/Escape.java similarity index 70% rename from src/main/java/com/mmall/concurrency/example/publish/Escape.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/publish/Escape.java index 3279644..7dec55b 100755 --- a/src/main/java/com/mmall/concurrency/example/publish/Escape.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/Escape.java @@ -1,7 +1,7 @@ -package com.mmall.concurrency.example.publish; +package com.javaedge.concurrency.example.publish; -import com.mmall.concurrency.annoations.NotRecommend; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotRecommend; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/UnsafePublish.java similarity index 82% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/publish/UnsafePublish.java index 20900ce..6c9522d 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/UnsafePublish.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.publish; +package com.javaedge.concurrency.example.publish; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Arrays; diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample1.java similarity index 81% rename from src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample1.java index c0dc41e..c4c3954 100755 --- a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample1.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.singleton; +package com.javaedge.concurrency.example.singleton; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; /** * 懒汉模式 diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample2.java similarity index 78% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample2.java index 28c0197..e19499c 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample2.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.singleton; +package com.javaedge.concurrency.example.singleton; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 饿汉模式 diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample3.java similarity index 75% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample3.java index e10b0d9..e0ca068 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample3.java @@ -1,7 +1,7 @@ -package com.mmall.concurrency.example.singleton; +package com.javaedge.concurrency.example.singleton; -import com.mmall.concurrency.annoations.NotRecommend; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.NotRecommend; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 懒汉模式 diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample4.java similarity index 90% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample4.java index 0ac3432..611278d 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample4.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.singleton; +package com.javaedge.concurrency.example.singleton; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; /** * 懒汉模式 -》 双重同步锁单例模式 diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample5.java similarity index 89% rename from src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample5.java index b53df2a..f4c6dfd 100755 --- a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample5.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample5.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.singleton; +package com.javaedge.concurrency.example.singleton; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 懒汉模式 -》 双重同步锁单例模式 diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample6.java similarity index 84% rename from src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample6.java index 1755598..8d02e5e 100755 --- a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample6.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample6.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.singleton; +package com.javaedge.concurrency.example.singleton; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 饿汉模式 diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample7.java similarity index 78% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample7.java index 982f5be..4475432 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample7.java @@ -1,7 +1,7 @@ -package com.mmall.concurrency.example.singleton; +package com.javaedge.concurrency.example.singleton; -import com.mmall.concurrency.annoations.Recommend; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.Recommend; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 枚举模式:最安全 diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample1.java similarity index 95% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample1.java index 36ba4ad..a5335c5 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample1.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.sync; +package com.javaedge.concurrency.example.sync; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample2.java similarity index 95% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample2.java index 7478a89..36f74a9 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample2.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.sync; +package com.javaedge.concurrency.example.sync; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample1.java similarity index 91% rename from src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample1.java index 071e096..81acbb9 100755 --- a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample1.java @@ -1,12 +1,11 @@ -package com.mmall.concurrency.example.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.google.common.collect.Lists; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Collections; import java.util.List; -import java.util.Vector; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample2.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample2.java index 7b571a0..951cfbb 100755 --- a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample2.java @@ -1,7 +1,7 @@ -package com.mmall.concurrency.example.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.google.common.collect.Sets; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Collections; diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample3.java similarity index 93% rename from src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample3.java index 9978bd2..e4a7bce 100755 --- a/src/main/java/com/mmall/concurrency/example/syncContainer/CollectionsExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample3.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.syncContainer; +package com.javaedge.concurrency.example.syncContainer; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Collections; diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/HashTableExample.java similarity index 91% rename from src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/HashTableExample.java index 620f915..fa11482 100755 --- a/src/main/java/com/mmall/concurrency/example/syncContainer/HashTableExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/HashTableExample.java @@ -1,9 +1,8 @@ -package com.mmall.concurrency.example.syncContainer; +package com.javaedge.concurrency.example.syncContainer; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample1.java similarity index 92% rename from src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample1.java index 2b622a3..9a3251e 100755 --- a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample1.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.syncContainer; +package com.javaedge.concurrency.example.syncContainer; -import com.mmall.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.List; diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample2.java similarity index 88% rename from src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample2.java index 18a5528..80273bd 100755 --- a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample2.java @@ -1,6 +1,6 @@ -package com.mmall.concurrency.example.syncContainer; +package com.javaedge.concurrency.example.syncContainer; -import com.mmall.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import java.util.Vector; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample3.java similarity index 95% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample3.java index a56c854..427a7ef 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample3.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import java.util.Iterator; import java.util.Vector; diff --git a/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/RequestHolder.java similarity index 86% rename from src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/RequestHolder.java index 89a785f..31cada4 100755 --- a/src/main/java/com/mmall/concurrency/example/threadLocal/RequestHolder.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/RequestHolder.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.threadLocal; +package com.javaedge.concurrency.example.threadLocal; public class RequestHolder { diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/ThreadLocalController.java similarity index 87% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/ThreadLocalController.java index fb400dd..2332505 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/ThreadLocalController.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.threadLocal; +package com.javaedge.concurrency.example.threadLocal; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample1.java similarity index 91% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample1.java index b2dbbc0..dad8010 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample1.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.threadPool; +package com.javaedge.concurrency.example.threadPool; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample2.java similarity index 91% rename from src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample2.java index b489ed3..4340b90 100755 --- a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample2.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.threadPool; +package com.javaedge.concurrency.example.threadPool; import lombok.extern.slf4j.Slf4j; diff --git a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample3.java similarity index 92% rename from HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample3.java index faf88ee..b8f69b7 100755 --- a/HighConcurrency/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample3.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.threadPool; +package com.javaedge.concurrency.example.threadPool; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample4.java similarity index 95% rename from src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample4.java index 111c2aa..865d9c2 100755 --- a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadPool/ThreadPoolExample4.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency.example.threadPool; +package com.javaedge.concurrency.example.threadPool; import lombok.extern.slf4j.Slf4j; diff --git a/concurrency/src/main/resources/application.properties b/concurrency/src/main/resources/application.properties new file mode 100644 index 0000000..c628fd1 --- /dev/null +++ b/concurrency/src/main/resources/application.properties @@ -0,0 +1,4 @@ +# redis conf +jedis.host=127.0.0.1 +jedis.port=6379 + diff --git a/HighConcurrency/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java b/concurrency/src/test/java/com/javaedge/concurrency/ConcurrencyApplicationTests.java similarity index 90% rename from HighConcurrency/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java rename to concurrency/src/test/java/com/javaedge/concurrency/ConcurrencyApplicationTests.java index f3b1f60..ccd5c26 100755 --- a/HighConcurrency/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java +++ b/concurrency/src/test/java/com/javaedge/concurrency/ConcurrencyApplicationTests.java @@ -1,4 +1,4 @@ -package com.mmall.concurrency; +package com.javaedge.concurrency; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/pom.xml b/pom.xml index 4d43433..0f49396 100755 --- a/pom.xml +++ b/pom.xml @@ -1,46 +1,47 @@ - 4.0.0 - - com.mmall - concurrency - 0.0.1-SNAPSHOT - war - - concurrency - Demo project for Spring Boot - - - org.springframework.boot - spring-boot-starter-parent - 1.5.9.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.projectlombok - lombok - 1.16.10 - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + com.mmall + concurrency + 0.0.1-SNAPSHOT + war + + concurrency + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + 1.18.4 + com.google.guava @@ -54,22 +55,46 @@ 2.9 - - redis.clients - jedis - 2.8.2 - + + redis.clients + jedis + 2.8.2 + + + + org.springframework.kafka + spring-kafka + 2.1.5.RELEASE + + + + com.google.code.gson + gson + 2.8.5 + + + + com.rabbitmq + amqp-client + 5.6.0 + + + + org.springframework.amqp + spring-rabbit + 2.1.4.RELEASE + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/src/main/java/com/mmall/concurrency/ConcurrencyTest.java b/src/main/java/com/mmall/concurrency/ConcurrencyTest.java deleted file mode 100755 index 404a893..0000000 --- a/src/main/java/com/mmall/concurrency/ConcurrencyTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mmall.concurrency; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class git ConcurrencyTest { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static int count = 0; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private static void add() { - count++; - } -} diff --git a/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java b/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java deleted file mode 100755 index 07a140c..0000000 --- a/src/main/java/com/mmall/concurrency/annoations/NotRecommend.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mmall.concurrency.annoations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 课程里用来标记【不推荐】的类或者写法 - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) -public @interface NotRecommend { - - String value() default ""; -} diff --git a/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java b/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java deleted file mode 100755 index 9886fb9..0000000 --- a/src/main/java/com/mmall/concurrency/annoations/NotThreadSafe.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mmall.concurrency.annoations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 课程里用来标记【线程不安全】的类或者写法 - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) -public @interface NotThreadSafe { - - String value() default ""; -} diff --git a/src/main/java/com/mmall/concurrency/annoations/Recommend.java b/src/main/java/com/mmall/concurrency/annoations/Recommend.java deleted file mode 100755 index 8a3a2bd..0000000 --- a/src/main/java/com/mmall/concurrency/annoations/Recommend.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mmall.concurrency.annoations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 课程里用来标记【推荐】的类或者写法 - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) -public @interface Recommend { - - String value() default ""; -} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java b/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java deleted file mode 100755 index bbdf25d..0000000 --- a/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample1.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class CountDownLatchExample1 { - - private final static int threadCount = 200; - - public static void main(String[] args) throws Exception { - - ExecutorService exec = Executors.newCachedThreadPool(); - - final CountDownLatch countDownLatch = new CountDownLatch(threadCount); - - for (int i = 0; i < threadCount; i++) { - final int threadNum = i; - exec.execute(() -> { - try { - test(threadNum); - } catch (Exception e) { - log.error("exception", e); - } finally { - countDownLatch.countDown(); - } - }); - } - countDownLatch.await(); - log.info("finish"); - exec.shutdown(); - } - - private static void test(int threadNum) throws Exception { - Thread.sleep(100); - log.info("{}", threadNum); - Thread.sleep(100); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java b/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java deleted file mode 100755 index 590ebb6..0000000 --- a/src/main/java/com/mmall/concurrency/example/aqs/CountDownLatchExample2.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -@Slf4j -public class CountDownLatchExample2 { - - private final static int threadCount = 200; - - public static void main(String[] args) throws Exception { - - ExecutorService exec = Executors.newCachedThreadPool(); - - final CountDownLatch countDownLatch = new CountDownLatch(threadCount); - - for (int i = 0; i < threadCount; i++) { - final int threadNum = i; - exec.execute(() -> { - try { - test(threadNum); - } catch (Exception e) { - log.error("exception", e); - } finally { - countDownLatch.countDown(); - } - }); - } - countDownLatch.await(10, TimeUnit.MILLISECONDS); - log.info("finish"); - exec.shutdown(); - } - - private static void test(int threadNum) throws Exception { - Thread.sleep(100); - log.info("{}", threadNum); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java deleted file mode 100755 index e9a888c..0000000 --- a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample1.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class CyclicBarrierExample1 { - - private static CyclicBarrier barrier = new CyclicBarrier(5); - - public static void main(String[] args) throws Exception { - - ExecutorService executor = Executors.newCachedThreadPool(); - - for (int i = 0; i < 10; i++) { - final int threadNum = i; - Thread.sleep(1000); - executor.execute(() -> { - try { - race(threadNum); - } catch (Exception e) { - log.error("exception", e); - } - }); - } - executor.shutdown(); - } - - private static void race(int threadNum) throws Exception { - Thread.sleep(1000); - log.info("{} is ready", threadNum); - barrier.await(); - log.info("{} continue", threadNum); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java b/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java deleted file mode 100755 index 3105ce2..0000000 --- a/src/main/java/com/mmall/concurrency/example/aqs/CyclicBarrierExample3.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class CyclicBarrierExample3 { - - private static CyclicBarrier barrier = new CyclicBarrier(5, () -> { - log.info("callback is running"); - }); - - public static void main(String[] args) throws Exception { - - ExecutorService executor = Executors.newCachedThreadPool(); - - for (int i = 0; i < 10; i++) { - final int threadNum = i; - Thread.sleep(1000); - executor.execute(() -> { - try { - race(threadNum); - } catch (Exception e) { - log.error("exception", e); - } - }); - } - executor.shutdown(); - } - - private static void race(int threadNum) throws Exception { - Thread.sleep(1000); - log.info("{} is ready", threadNum); - barrier.await(); - log.info("{} continue", threadNum); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java deleted file mode 100755 index 82c6073..0000000 --- a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample3.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -@Slf4j -public class SemaphoreExample3 { - - private final static int threadCount = 20; - - public static void main(String[] args) throws Exception { - - ExecutorService exec = Executors.newCachedThreadPool(); - - final Semaphore semaphore = new Semaphore(3); - - for (int i = 0; i < threadCount; i++) { - final int threadNum = i; - exec.execute(() -> { - try { - if (semaphore.tryAcquire()) { // 尝试获取一个许可 - test(threadNum); - semaphore.release(); // 释放一个许可 - } - } catch (Exception e) { - log.error("exception", e); - } - }); - } - exec.shutdown(); - } - - private static void test(int threadNum) throws Exception { - log.info("{}", threadNum); - Thread.sleep(1000); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java b/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java deleted file mode 100755 index 27ee7b8..0000000 --- a/src/main/java/com/mmall/concurrency/example/aqs/SemaphoreExample4.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mmall.concurrency.example.aqs; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -@Slf4j -public class SemaphoreExample4 { - - private final static int threadCount = 20; - - public static void main(String[] args) throws Exception { - - ExecutorService exec = Executors.newCachedThreadPool(); - - final Semaphore semaphore = new Semaphore(3); - - for (int i = 0; i < threadCount; i++) { - final int threadNum = i; - exec.execute(() -> { - try { - if (semaphore.tryAcquire(5000, TimeUnit.MILLISECONDS)) { // 尝试获取一个许可 - test(threadNum); - semaphore.release(); // 释放一个许可 - } - } catch (Exception e) { - log.error("exception", e); - } - }); - } - exec.shutdown(); - } - - private static void test(int threadNum) throws Exception { - log.info("{}", threadNum); - Thread.sleep(1000); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java deleted file mode 100755 index fad1bea..0000000 --- a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample1.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mmall.concurrency.example.atomic; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicInteger; - -@Slf4j -@ThreadSafe -public class AtomicExample1 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static AtomicInteger count = new AtomicInteger(0); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count.get()); - } - - private static void add() { - count.incrementAndGet(); - // count.getAndIncrement(); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java b/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java deleted file mode 100755 index e8ec003..0000000 --- a/src/main/java/com/mmall/concurrency/example/atomic/AtomicExample4.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.mmall.concurrency.example.atomic; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.atomic.LongAdder; - -@Slf4j -@ThreadSafe -public class AtomicExample4 { - - private static AtomicReference count = new AtomicReference<>(0); - - public static void main(String[] args) { - count.compareAndSet(0, 2); // 2 - count.compareAndSet(0, 1); // no - count.compareAndSet(1, 3); // no - count.compareAndSet(2, 4); // 4 - count.compareAndSet(3, 5); // no - log.info("count:{}", count.get()); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java deleted file mode 100755 index 0fa0f98..0000000 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/ArrayListExample.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class ArrayListExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static List list = new ArrayList<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", list.size()); - } - - private static void update(int i) { - list.add(i); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java deleted file mode 100755 index 0337434..0000000 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample1.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.text.SimpleDateFormat; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@NotThreadSafe -public class DateFormatExample1 { - - private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - update(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - } - - private static void update() { - try { - simpleDateFormat.parse("20180208"); - } catch (Exception e) { - log.error("parse exception", e); - } - } -} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java deleted file mode 100755 index 06c2596..0000000 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/DateFormatExample2.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.text.SimpleDateFormat; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class DateFormatExample2 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - update(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - } - - private static void update() { - try { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); - simpleDateFormat.parse("20180208"); - } catch (Exception e) { - log.error("parse exception", e); - } - } -} diff --git a/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java b/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java deleted file mode 100755 index c0e709d..0000000 --- a/src/main/java/com/mmall/concurrency/example/commonUnsafe/StringExample2.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mmall.concurrency.example.commonUnsafe; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class StringExample2 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static StringBuffer stringBuffer = new StringBuffer(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - update(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", stringBuffer.length()); - } - - private static void update() { - stringBuffer.append("1"); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java deleted file mode 100755 index 5cf7fe1..0000000 --- a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentHashMapExample.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.concurrent; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class ConcurrentHashMapExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Map map = new ConcurrentHashMap<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", map.size()); - } - - private static void update(int i) { - map.put(i, i); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java deleted file mode 100755 index 9aee082..0000000 --- a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListMapExample.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mmall.concurrency.example.concurrent; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentSkipListMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class ConcurrentSkipListMapExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Map map = new ConcurrentSkipListMap<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", map.size()); - } - - private static void update(int i) { - map.put(i, i); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java b/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java deleted file mode 100755 index 5732bea..0000000 --- a/src/main/java/com/mmall/concurrency/example/concurrent/ConcurrentSkipListSetExample.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mmall.concurrency.example.concurrent; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class ConcurrentSkipListSetExample { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - private static Set set = new ConcurrentSkipListSet<>(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { - final int count = i; - executorService.execute(() -> { - try { - semaphore.acquire(); - update(count); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("size:{}", set.size()); - } - - private static void update(int i) { - set.add(i); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java b/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java deleted file mode 100755 index 3c19f37..0000000 --- a/src/main/java/com/mmall/concurrency/example/deadLock/DeadLock.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.mmall.concurrency.example.deadLock; - -import lombok.extern.slf4j.Slf4j; - -/** - * 一个简单的死锁类 - * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 - * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 - * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定; - * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定; - * td1、td2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。 - */ - -@Slf4j -public class DeadLock implements Runnable { - public int flag = 1; - //静态对象是类的所有对象共享的 - private static Object o1 = new Object(), o2 = new Object(); - - @Override - public void run() { - log.info("flag:{}", flag); - if (flag == 1) { - synchronized (o1) { - try { - Thread.sleep(500); - } catch (Exception e) { - e.printStackTrace(); - } - synchronized (o2) { - log.info("1"); - } - } - } - if (flag == 0) { - synchronized (o2) { - try { - Thread.sleep(500); - } catch (Exception e) { - e.printStackTrace(); - } - synchronized (o1) { - log.info("0"); - } - } - } - } - - public static void main(String[] args) { - DeadLock td1 = new DeadLock(); - DeadLock td2 = new DeadLock(); - td1.flag = 1; - td2.flag = 0; - //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。 - //td2的run()可能在td1的run()之前运行 - new Thread(td1).start(); - new Thread(td2).start(); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java b/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java deleted file mode 100755 index 62bb525..0000000 --- a/src/main/java/com/mmall/concurrency/example/immutable/ImmutableExample2.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.mmall.concurrency.example.immutable; - -import com.google.common.collect.Maps; -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Collections; -import java.util.Map; - -@Slf4j -@ThreadSafe -public class ImmutableExample2 { - - private static Map map = Maps.newHashMap(); - - static { - map.put(1, 2); - map.put(3, 4); - map.put(5, 6); - map = Collections.unmodifiableMap(map); - } - - public static void main(String[] args) { - map.put(1, 3); - log.info("{}", map.get(1)); - } - -} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java deleted file mode 100755 index 1c1e971..0000000 --- a/src/main/java/com/mmall/concurrency/example/lock/LockExample1.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mmall.concurrency.example.lock; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; - -@Slf4j -@ThreadSafe -public class LockExample1 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static int count = 0; - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private synchronized static void add() { - count++; - } -} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java deleted file mode 100755 index d50d697..0000000 --- a/src/main/java/com/mmall/concurrency/example/lock/LockExample3.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mmall.concurrency.example.lock; - -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -@Slf4j -public class LockExample3 { - - private final Map map = new TreeMap<>(); - - private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); - - private final Lock readLock = lock.readLock(); - - private final Lock writeLock = lock.writeLock(); - - public Data get(String key) { - readLock.lock(); - try { - return map.get(key); - } finally { - readLock.unlock(); - } - } - - public Set getAllKeys() { - readLock.lock(); - try { - return map.keySet(); - } finally { - readLock.unlock(); - } - } - - public Data put(String key, Data value) { - writeLock.lock(); - try { - return map.put(key, value); - } finally { - readLock.unlock(); - } - } - - class Data { - - } -} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java deleted file mode 100755 index 79305d2..0000000 --- a/src/main/java/com/mmall/concurrency/example/lock/LockExample4.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.mmall.concurrency.example.lock; - -import java.util.concurrent.locks.StampedLock; - -public class LockExample4 { - - class Point { - private double x, y; - private final StampedLock sl = new StampedLock(); - - void move(double deltaX, double deltaY) { // an exclusively locked method - long stamp = sl.writeLock(); - try { - x += deltaX; - y += deltaY; - } finally { - sl.unlockWrite(stamp); - } - } - - //下面看看乐观读锁案例 - double distanceFromOrigin() { // A read-only method - long stamp = sl.tryOptimisticRead(); //获得一个乐观读锁 - double currentX = x, currentY = y; //将两个字段读入本地局部变量 - if (!sl.validate(stamp)) { //检查发出乐观读锁后同时是否有其他写锁发生? - stamp = sl.readLock(); //如果没有,我们再次获得一个读悲观锁 - try { - currentX = x; // 将两个字段读入本地局部变量 - currentY = y; // 将两个字段读入本地局部变量 - } finally { - sl.unlockRead(stamp); - } - } - return Math.sqrt(currentX * currentX + currentY * currentY); - } - - //下面是悲观读锁案例 - void moveIfAtOrigin(double newX, double newY) { // upgrade - // Could instead start with optimistic, not read mode - long stamp = sl.readLock(); - try { - while (x == 0.0 && y == 0.0) { //循环,检查当前状态是否符合 - long ws = sl.tryConvertToWriteLock(stamp); //将读锁转为写锁 - if (ws != 0L) { //这是确认转为写锁是否成功 - stamp = ws; //如果成功 替换票据 - x = newX; //进行状态改变 - y = newY; //进行状态改变 - break; - } else { //如果不能成功转换为写锁 - sl.unlockRead(stamp); //我们显式释放读锁 - stamp = sl.writeLock(); //显式直接进行写锁 然后再通过循环再试 - } - } - } finally { - sl.unlock(stamp); //释放读锁或写锁 - } - } - } -} diff --git a/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java b/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java deleted file mode 100755 index 97b4a83..0000000 --- a/src/main/java/com/mmall/concurrency/example/lock/LockExample5.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.mmall.concurrency.example.lock; - -import com.mmall.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.locks.StampedLock; - -@Slf4j -@ThreadSafe -public class LockExample5 { - - // 请求总数 - public static int clientTotal = 5000; - - // 同时并发执行的线程数 - public static int threadTotal = 200; - - public static int count = 0; - - private final static StampedLock lock = new StampedLock(); - - public static void main(String[] args) throws Exception { - ExecutorService executorService = Executors.newCachedThreadPool(); - final Semaphore semaphore = new Semaphore(threadTotal); - final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal ; i++) { - executorService.execute(() -> { - try { - semaphore.acquire(); - add(); - semaphore.release(); - } catch (Exception e) { - log.error("exception", e); - } - countDownLatch.countDown(); - }); - } - countDownLatch.await(); - executorService.shutdown(); - log.info("count:{}", count); - } - - private static void add() { - long stamp = lock.writeLock(); - try { - count++; - } finally { - lock.unlock(stamp); - } - } -} diff --git a/src/main/java/com/mmall/concurrency/example/package-info.java b/src/main/java/com/mmall/concurrency/example/package-info.java deleted file mode 100755 index 0affdfe..0000000 --- a/src/main/java/com/mmall/concurrency/example/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.mmall.concurrency.example; \ No newline at end of file diff --git a/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java b/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java deleted file mode 100755 index 20900ce..0000000 --- a/src/main/java/com/mmall/concurrency/example/publish/UnsafePublish.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.mmall.concurrency.example.publish; - -import com.mmall.concurrency.annoations.NotThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import java.util.Arrays; - -@Slf4j -@NotThreadSafe -public class UnsafePublish { - - private String[] states = {"a", "b", "c"}; - - public String[] getStates() { - return states; - } - - public static void main(String[] args) { - UnsafePublish unsafePublish = new UnsafePublish(); - log.info("{}", Arrays.toString(unsafePublish.getStates())); - - unsafePublish.getStates()[0] = "d"; - log.info("{}", Arrays.toString(unsafePublish.getStates())); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java deleted file mode 100755 index 28c0197..0000000 --- a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample2.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.mmall.concurrency.example.singleton; - -import com.mmall.concurrency.annoations.ThreadSafe; - -/** - * 饿汉模式 - * 单例实例在类装载时进行创建 - */ -@ThreadSafe -public class SingletonExample2 { - - // 私有构造函数 - private SingletonExample2() { - - } - - // 单例对象 - private static SingletonExample2 instance = new SingletonExample2(); - - // 静态的工厂方法 - public static SingletonExample2 getInstance() { - return instance; - } -} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java deleted file mode 100755 index e10b0d9..0000000 --- a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample3.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.mmall.concurrency.example.singleton; - -import com.mmall.concurrency.annoations.NotRecommend; -import com.mmall.concurrency.annoations.ThreadSafe; - -/** - * 懒汉模式 - * 单例实例在第一次使用时进行创建 - */ -@ThreadSafe -@NotRecommend -public class SingletonExample3 { - - // 私有构造函数 - private SingletonExample3() { - - } - - // 单例对象 - private static SingletonExample3 instance = null; - - // 静态的工厂方法 - public static synchronized SingletonExample3 getInstance() { - if (instance == null) { - instance = new SingletonExample3(); - } - return instance; - } -} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java deleted file mode 100755 index 0ac3432..0000000 --- a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample4.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mmall.concurrency.example.singleton; - -import com.mmall.concurrency.annoations.NotThreadSafe; - -/** - * 懒汉模式 -》 双重同步锁单例模式 - * 单例实例在第一次使用时进行创建 - */ -@NotThreadSafe -public class SingletonExample4 { - - // 私有构造函数 - private SingletonExample4() { - - } - - // 1、memory = allocate() 分配对象的内存空间 - // 2、ctorInstance() 初始化对象 - // 3、instance = memory 设置instance指向刚分配的内存 - - // JVM和cpu优化,发生了指令重排 - - // 1、memory = allocate() 分配对象的内存空间 - // 3、instance = memory 设置instance指向刚分配的内存 - // 2、ctorInstance() 初始化对象 - - // 单例对象 - private static SingletonExample4 instance = null; - - // 静态的工厂方法 - public static SingletonExample4 getInstance() { - if (instance == null) { // 双重检测机制 // B - synchronized (SingletonExample4.class) { // 同步锁 - if (instance == null) { - instance = new SingletonExample4(); // A - 3 - } - } - } - return instance; - } -} diff --git a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java b/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java deleted file mode 100755 index 982f5be..0000000 --- a/src/main/java/com/mmall/concurrency/example/singleton/SingletonExample7.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.mmall.concurrency.example.singleton; - -import com.mmall.concurrency.annoations.Recommend; -import com.mmall.concurrency.annoations.ThreadSafe; - -/** - * 枚举模式:最安全 - */ -@ThreadSafe -@Recommend -public class SingletonExample7 { - - // 私有构造函数 - private SingletonExample7() { - - } - - public static SingletonExample7 getInstance() { - return Singleton.INSTANCE.getInstance(); - } - - private enum Singleton { - INSTANCE; - - private SingletonExample7 singleton; - - // JVM保证这个方法绝对只调用一次 - Singleton() { - singleton = new SingletonExample7(); - } - - public SingletonExample7 getInstance() { - return singleton; - } - } -} diff --git a/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java b/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java deleted file mode 100755 index 36ba4ad..0000000 --- a/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample1.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.mmall.concurrency.example.sync; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class SynchronizedExample1 { - - // 修饰一个代码块 - public void test1(int j) { - synchronized (this) { - for (int i = 0; i < 10; i++) { - log.info("test1 {} - {}", j, i); - } - } - } - - // 修饰一个方法 - public synchronized void test2(int j) { - for (int i = 0; i < 10; i++) { - log.info("test2 {} - {}", j, i); - } - } - - public static void main(String[] args) { - SynchronizedExample1 example1 = new SynchronizedExample1(); - SynchronizedExample1 example2 = new SynchronizedExample1(); - ExecutorService executorService = Executors.newCachedThreadPool(); - executorService.execute(() -> { - example1.test2(1); - }); - executorService.execute(() -> { - example2.test2(2); - }); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java b/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java deleted file mode 100755 index 7478a89..0000000 --- a/src/main/java/com/mmall/concurrency/example/sync/SynchronizedExample2.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.mmall.concurrency.example.sync; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class SynchronizedExample2 { - - // 修饰一个类 - public static void test1(int j) { - synchronized (SynchronizedExample2.class) { - for (int i = 0; i < 10; i++) { - log.info("test1 {} - {}", j, i); - } - } - } - - // 修饰一个静态方法 - public static synchronized void test2(int j) { - for (int i = 0; i < 10; i++) { - log.info("test2 {} - {}", j, i); - } - } - - public static void main(String[] args) { - SynchronizedExample2 example1 = new SynchronizedExample2(); - SynchronizedExample2 example2 = new SynchronizedExample2(); - ExecutorService executorService = Executors.newCachedThreadPool(); - executorService.execute(() -> { - example1.test1(1); - }); - executorService.execute(() -> { - example2.test1(2); - }); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java b/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java deleted file mode 100755 index a56c854..0000000 --- a/src/main/java/com/mmall/concurrency/example/syncContainer/VectorExample3.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.mmall.concurrency.example.syncContainer; - -import java.util.Iterator; -import java.util.Vector; - -public class VectorExample3 { - - // java.util.ConcurrentModificationException - private static void test1(Vector v1) { // foreach - for(Integer i : v1) { - if (i.equals(3)) { - v1.remove(i); - } - } - } - - // java.util.ConcurrentModificationException - private static void test2(Vector v1) { // iterator - Iterator iterator = v1.iterator(); - while (iterator.hasNext()) { - Integer i = iterator.next(); - if (i.equals(3)) { - v1.remove(i); - } - } - } - - // success - private static void test3(Vector v1) { // for - for (int i = 0; i < v1.size(); i++) { - if (v1.get(i).equals(3)) { - v1.remove(i); - } - } - } - - public static void main(String[] args) { - - Vector vector = new Vector<>(); - vector.add(1); - vector.add(2); - vector.add(3); - test1(vector); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java b/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java deleted file mode 100755 index fb400dd..0000000 --- a/src/main/java/com/mmall/concurrency/example/threadLocal/ThreadLocalController.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mmall.concurrency.example.threadLocal; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -@RequestMapping("/threadLocal") -public class ThreadLocalController { - - @RequestMapping("/test") - @ResponseBody - public Long test() { - return RequestHolder.getId(); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java deleted file mode 100755 index b2dbbc0..0000000 --- a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample1.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.mmall.concurrency.example.threadPool; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class ThreadPoolExample1 { - - public static void main(String[] args) { - - ExecutorService executorService = Executors.newCachedThreadPool(); - - for (int i = 0; i < 10; i++) { - final int index = i; - executorService.execute(new Runnable() { - @Override - public void run() { - log.info("task:{}", index); - } - }); - } - executorService.shutdown(); - } -} diff --git a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java b/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java deleted file mode 100755 index faf88ee..0000000 --- a/src/main/java/com/mmall/concurrency/example/threadPool/ThreadPoolExample3.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.mmall.concurrency.example.threadPool; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Slf4j -public class ThreadPoolExample3 { - - public static void main(String[] args) { - - ExecutorService executorService = Executors.newSingleThreadExecutor(); - - for (int i = 0; i < 10; i++) { - final int index = i; - executorService.execute(new Runnable() { - @Override - public void run() { - log.info("task:{}", index); - } - }); - } - executorService.shutdown(); - } -} diff --git a/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java b/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java deleted file mode 100755 index f3b1f60..0000000 --- a/src/test/java/com/mmall/concurrency/ConcurrencyApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mmall.concurrency; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class ConcurrencyApplicationTests { - - @Test - public void contextLoads() { - } - -} From d33d5c8afe736056a83c555f49070d39d47b7a8e Mon Sep 17 00:00:00 2001 From: JavaEdge Date: Thu, 14 Mar 2019 16:53:35 +0800 Subject: [PATCH 12/24] Update README.md --- README.md | 91 +------------------------------------------------------ 1 file changed, 1 insertion(+), 90 deletions(-) diff --git a/README.md b/README.md index b2f6a53..3bc635e 100755 --- a/README.md +++ b/README.md @@ -7,102 +7,13 @@ 3.[个人知乎](http://www.zhihu.com/people/shi-shu-sheng-) 4.[gayhub](https://github.com/Wasabi1234) - - -# [Java 高并发理论 基础知识点全覆盖](https://www.jianshu.com/p/8a3c6ac1e01e) - -# 带你构建完整的并发与高并发知识体系 -## 一旦形成完整的知识体系,无论是跳槽面试还是开发,你都将是最快脱颖而出的那一个 +# 构建完整的并发与高并发知识体系 ![](https://upload-images.jianshu.io/upload_images/4685968-92447a24b4f8cf38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -# 掌握多线程并发与线程安全,让你的程序更可靠 -## 通过大量的图例和代码来讲解,你犯过的错都在这里了 ![](https://upload-images.jianshu.io/upload_images/4685968-6fc1465c0b063ef8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -# 学会高并发处理思路与手段,让跳槽面试从容不迫 -## 并发与高并发是面试的重要考察点,常问面试问题与答案都在这里了 ![](https://upload-images.jianshu.io/upload_images/4685968-7fd306f9bc9b4bec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -# 环境参数 -基础工具 Maven、JDK8、Tomcat、MySQL、Redis - -开发工具 Intellij IDEA - -演示工具 Postman、JMeter、Apache Bench - -项目框架 SpringBoot、Mybatis - -可选组件 Kafka、RabbitMQ、elastic-job等 - -# 教程目录 - -# 第1章 准备(入门) -目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从重点、特点、适合人群及学习收获几个方面对知识体系进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 - -# 第2章 准备工作 -本章主要是为知识点里代码演示做必要的准备。首先会基于SpringBoot快速搭建一个方便演示的Java项目 -项目搭建好,我会使用简单的例子演示一下并发的模拟验证,主要包括对工具Postman、JMeter、Apache Bench(AB)的使用,以及使用并发的代码来验证并发处理的正确性 - -# 第3章 线程安全性讲解 -本章讲解线程安全性,主要从原子性、可见性、有序性三个方面进行讲解 -原子性部分,会详细讲解atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 -可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性 -有序性部分,则重点讲解了happens-before原则 - -# 第4章 安全发布对象讲解 -本章主要讲解安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 -这一章也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 - -# 第5章 线程安全策略讲解 -本章主要讲解线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... - -# 第6章 J.U.C之AQS讲解 -AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点讲解AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... - -# 第7章 J.U.C组件拓展 -这一章继续讲解J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 - -# 第8章 线程调度-线程池讲解 -本章讲解J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 - - -# 第9章 多线程并发拓展讲解 -本章会对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 - - -# 第10章 高并发之扩容思路 -高并发部分:主讲思路,侧重面试,本章主要讲扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 - -# 第11章 高并发之缓存思路 -高并发部分:主讲思路,本章讲解高并发中缓存方案。包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis - -# 第12章 高并发之消息队列思路 -高并发部分:主讲思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 - -# 第13章 高并发之应用拆分思路 -本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 - -# 第14章 高并发之应用限流思路 -高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 - -之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 - -# 第15章 服务降级与服务熔断思路 -通过举例让大家明白什么是服务降级和服务熔断 - -之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 - -最后介绍了Hystrix - -# 第16章 数据库分库分表与高可用手段 -高并发部分:主讲思路,从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别; - -最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表 - -之后介绍了高可用的三个常用手段:任务调度系统分布 - -# 第17章 知识体系总结 -对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 ![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) From 59e72512db89ad2747aeadc0d28811e641bd2e26 Mon Sep 17 00:00:00 2001 From: JavaEdge Date: Thu, 21 Mar 2019 11:35:28 +0800 Subject: [PATCH 13/24] Update README.md --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 3bc635e..f51d139 100755 --- a/README.md +++ b/README.md @@ -1,12 +1,3 @@ -# 联系我 -![](http://upload-images.jianshu.io/upload_images/4685968-6a8b28d2fd95e8b7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "图片标题") -1.[Java开发技术交流Q群](https://jq.qq.com/?_wv=1027&k=5UB4P1T) - -2.[完整博客链接](http://www.shishusheng.com) - -3.[个人知乎](http://www.zhihu.com/people/shi-shu-sheng-) - -4.[gayhub](https://github.com/Wasabi1234) # 构建完整的并发与高并发知识体系 ![](https://upload-images.jianshu.io/upload_images/4685968-92447a24b4f8cf38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) From d810d4f4107053b934508b9c34425073901e10e4 Mon Sep 17 00:00:00 2001 From: Wasabi1234 Date: Sun, 4 Aug 2019 01:36:45 +0800 Subject: [PATCH 14/24] =?UTF-8?q?=E6=9B=B4=E6=96=B0READEME=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 124 +++++++++++++++++++++++++++++------------------------- 1 file changed, 67 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index b2f6a53..dd1cf25 100755 --- a/README.md +++ b/README.md @@ -1,108 +1,118 @@ -# 联系我 -![](http://upload-images.jianshu.io/upload_images/4685968-6a8b28d2fd95e8b7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "图片标题") -1.[Java开发技术交流Q群](https://jq.qq.com/?_wv=1027&k=5UB4P1T) +# 0 Java 高并发理论 基础知识点全覆盖 +## 无论跳槽面试 / 开发,技能都将高人一等 -2.[完整博客链接](http://www.shishusheng.com) -3.[个人知乎](http://www.zhihu.com/people/shi-shu-sheng-) +# 1 多线程并发与线程安全,让程序更可靠 +## 大量代码实例来讲解,深度掌握高并发编程 -4.[gayhub](https://github.com/Wasabi1234) +![](https://upload-images.jianshu.io/upload_images/4685968-6fc1465c0b063ef8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +# 2 高并发处理思路与手段,让跳槽面试从容不迫 -# [Java 高并发理论 基础知识点全覆盖](https://www.jianshu.com/p/8a3c6ac1e01e) +## 并发与高并发是面试的重要考察点,常问面试问题与答案都在这里了 -# 带你构建完整的并发与高并发知识体系 -## 一旦形成完整的知识体系,无论是跳槽面试还是开发,你都将是最快脱颖而出的那一个 +![](https://upload-images.jianshu.io/upload_images/4685968-7fd306f9bc9b4bec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -![](https://upload-images.jianshu.io/upload_images/4685968-92447a24b4f8cf38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +# 3 环境参数 -# 掌握多线程并发与线程安全,让你的程序更可靠 -## 通过大量的图例和代码来讲解,你犯过的错都在这里了 -![](https://upload-images.jianshu.io/upload_images/4685968-6fc1465c0b063ef8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +## 基本工具 -# 学会高并发处理思路与手段,让跳槽面试从容不迫 -## 并发与高并发是面试的重要考察点,常问面试问题与答案都在这里了 -![](https://upload-images.jianshu.io/upload_images/4685968-7fd306f9bc9b4bec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +- Maven 3.3.9 + +- JDK 8 -# 环境参数 -基础工具 Maven、JDK8、Tomcat、MySQL、Redis +- Tomcat -开发工具 Intellij IDEA +- MySQL 8.0.16 -演示工具 Postman、JMeter、Apache Bench +- Redis -项目框架 SpringBoot、Mybatis +## IDE +Intellij IDEA 2019.2 -可选组件 Kafka、RabbitMQ、elastic-job等 +## 测试工具 +Postman、JMeter -# 教程目录 +## 框架 +SpringBoot、Mybatis -# 第1章 准备(入门) -目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从重点、特点、适合人群及学习收获几个方面对知识体系进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发 +## 组件 +Kafka、RabbitMQ、elastic-job... -# 第2章 准备工作 -本章主要是为知识点里代码演示做必要的准备。首先会基于SpringBoot快速搭建一个方便演示的Java项目 -项目搭建好,我会使用简单的例子演示一下并发的模拟验证,主要包括对工具Postman、JMeter、Apache Bench(AB)的使用,以及使用并发的代码来验证并发处理的正确性 +# 4 知识点概要 -# 第3章 线程安全性讲解 -本章讲解线程安全性,主要从原子性、可见性、有序性三个方面进行讲解 -原子性部分,会详细讲解atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 +## 线程安全性 +线程安全性,主要从原子性、可见性、有序性三个方面 + +原子性部分, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性 有序性部分,则重点讲解了happens-before原则 -# 第4章 安全发布对象讲解 -本章主要讲解安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 -这一章也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 +## 安全发布对象 +安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 +这也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 + +## 线程安全策略 +线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。 + +同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... + +## J.U.C之AQS讲解 +AQS是J.U.C的重要组件,也是面试的重要考点。 + +AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。 + +这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... + +## J.U.C组件拓展 +J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。 -# 第5章 线程安全策略讲解 -本章主要讲解线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... +这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 -# 第6章 J.U.C之AQS讲解 -AQS是J.U.C的重要组件,也是面试的重要考点。这一章里将重点讲解AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... +## 线程调度-线程池 +J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。 -# 第7章 J.U.C组件拓展 -这一章继续讲解J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 +这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 -# 第8章 线程调度-线程池讲解 -本章讲解J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 +## 多线程并发拓展讲解 +对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 -# 第9章 多线程并发拓展讲解 -本章会对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 +## 高并发之扩容 +高并发部分:思路,侧重面试,扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 -# 第10章 高并发之扩容思路 -高并发部分:主讲思路,侧重面试,本章主要讲扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 +## 高并发之缓存 +思路,本章讲解高并发中缓存方案。 -# 第11章 高并发之缓存思路 -高并发部分:主讲思路,本章讲解高并发中缓存方案。包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis +包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis -# 第12章 高并发之消息队列思路 -高并发部分:主讲思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 +## 高并发之消息队列 +思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 -# 第13章 高并发之应用拆分思路 -本章直接从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 +## 高并发之应用拆分 +从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 -# 第14章 高并发之应用限流思路 -高并发部分:主讲思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 +## 高并发之应用限流 +思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 -# 第15章 服务降级与服务熔断思路 +## 服务降级与服务熔断 通过举例让大家明白什么是服务降级和服务熔断 之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 最后介绍了Hystrix -# 第16章 数据库分库分表与高可用手段 +## 数据库分库分表与高可用手段 高并发部分:主讲思路,从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别; 最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表 之后介绍了高可用的三个常用手段:任务调度系统分布 -# 第17章 知识体系总结 +## 知识体系总结 对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 ![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) From 5eab49afb97ecee22be0649564bdb33a29e3d831 Mon Sep 17 00:00:00 2001 From: JavaEdge Date: Sun, 4 Aug 2019 01:38:35 +0800 Subject: [PATCH 15/24] Update README.md --- README.md | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f51d139..dd1cf25 100755 --- a/README.md +++ b/README.md @@ -1,10 +1,118 @@ -# 构建完整的并发与高并发知识体系 +# 0 Java 高并发理论 基础知识点全覆盖 +## 无论跳槽面试 / 开发,技能都将高人一等 -![](https://upload-images.jianshu.io/upload_images/4685968-92447a24b4f8cf38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +# 1 多线程并发与线程安全,让程序更可靠 +## 大量代码实例来讲解,深度掌握高并发编程 ![](https://upload-images.jianshu.io/upload_images/4685968-6fc1465c0b063ef8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +# 2 高并发处理思路与手段,让跳槽面试从容不迫 + +## 并发与高并发是面试的重要考察点,常问面试问题与答案都在这里了 + ![](https://upload-images.jianshu.io/upload_images/4685968-7fd306f9bc9b4bec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +# 3 环境参数 + +## 基本工具 + +- Maven 3.3.9 + +- JDK 8 + +- Tomcat + +- MySQL 8.0.16 + +- Redis + +## IDE +Intellij IDEA 2019.2 + +## 测试工具 +Postman、JMeter + +## 框架 +SpringBoot、Mybatis + +## 组件 +Kafka、RabbitMQ、elastic-job... + +# 4 知识点概要 + +## 线程安全性 +线程安全性,主要从原子性、可见性、有序性三个方面 + +原子性部分, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 +可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性 +有序性部分,则重点讲解了happens-before原则 + +## 安全发布对象 +安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 +这也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 + +## 线程安全策略 +线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。 + +同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... + +## J.U.C之AQS讲解 +AQS是J.U.C的重要组件,也是面试的重要考点。 + +AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。 + +这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... + +## J.U.C组件拓展 +J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。 + +这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 + +## 线程调度-线程池 +J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。 + +这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 + + +## 多线程并发拓展讲解 +对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 + + +## 高并发之扩容 +高并发部分:思路,侧重面试,扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 + +## 高并发之缓存 +思路,本章讲解高并发中缓存方案。 + +包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis + +## 高并发之消息队列 +思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 + +## 高并发之应用拆分 +从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 + +## 高并发之应用限流 +思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 + +之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 + +## 服务降级与服务熔断 +通过举例让大家明白什么是服务降级和服务熔断 + +之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 + +最后介绍了Hystrix + +## 数据库分库分表与高可用手段 +高并发部分:主讲思路,从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别; + +最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表 + +之后介绍了高可用的三个常用手段:任务调度系统分布 + +## 知识体系总结 +对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 ![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) From fd5d35bcffd78d875d6f6277a6cd52f5830b0790 Mon Sep 17 00:00:00 2001 From: JavaEdge Date: Wed, 7 Aug 2019 15:40:04 +0800 Subject: [PATCH 16/24] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index dd1cf25..cefc5fb 100755 --- a/README.md +++ b/README.md @@ -116,3 +116,8 @@ J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的 对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 ![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +# 参考 +[Java并发编程入门与高并发面试](https://coding.imooc.com/class/195.html) +[Java并发编程的艺术](https://book.douban.com/subject/26591326/) +[深入理解Java虚拟机第二版](https://book.douban.com/subject/24722612/) From b0e9542f9e2173e589dce68933bcece698c17378 Mon Sep 17 00:00:00 2001 From: JavaEdge Date: Thu, 8 Aug 2019 09:07:20 +0800 Subject: [PATCH 17/24] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cefc5fb..eba6000 100755 --- a/README.md +++ b/README.md @@ -119,5 +119,7 @@ J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的 # 参考 [Java并发编程入门与高并发面试](https://coding.imooc.com/class/195.html) + [Java并发编程的艺术](https://book.douban.com/subject/26591326/) + [深入理解Java虚拟机第二版](https://book.douban.com/subject/24722612/) From 0ec5b4733faf9780677cc7d5ed4bfc02468281ac Mon Sep 17 00:00:00 2001 From: JavaEdge Date: Thu, 15 Aug 2019 00:48:24 +0800 Subject: [PATCH 18/24] Update README.md --- README.md | 114 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 96 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index eba6000..e225f10 100755 --- a/README.md +++ b/README.md @@ -3,43 +3,118 @@ # 1 多线程并发与线程安全,让程序更可靠 + ## 大量代码实例来讲解,深度掌握高并发编程 -![](https://upload-images.jianshu.io/upload_images/4685968-6fc1465c0b063ef8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +![](https://uploadfiles.nowcoder.com/files/20190815/5088755_1565799768157_4685968-6fc1465c0b063ef8.png) # 2 高并发处理思路与手段,让跳槽面试从容不迫 -## 并发与高并发是面试的重要考察点,常问面试问题与答案都在这里了 +## 2.1 接轨企业需求的并发技能 + +从真实应用场景出发,从0解构线程与并发 + +## 2.2 并发面试综合案例 + +并发面试必问考点,理清思路总结要点 + +## 2.3 设计巧妙易于理解 + +巧妙实例便于理解 + +![](https://uploadfiles.nowcoder.com/files/20190815/5088755_1565799768174_4685968-7fd306f9bc9b4bec.png) + +## 2.4 深入理解底层原理 解决企业级并发业务问题 翻越并发技术的大山 + +### 线程的核心 + +#### 工作/面试的利器 + +- 线程N种实现方式 +网络众口不一,真伪难辨,本教程直击本质 + +- 线程启动你真的会么? +启动线程,从错误到正确,带你从错误中总结真理 + +- 线程停止、中断的最佳实践 +把我线程停止原则 + +- 图解线程生命周期 +面试 show 出此图,优秀候选人非你莫属 + +- 趣解Thread和Object类中线程相关方法 +wait、notify、join、yield…各有千秋 + +- 一网打尽线程属性线程属性 +三大经典面试问题,你晓得么? + +- 线程异常处理 +无处不在的异常,只需一招自定义异常 + +- 线程安全与程序性能,取舍之道 +线程安全导致性能降低,看似无解,实则只是学艺不精 -![](https://upload-images.jianshu.io/upload_images/4685968-7fd306f9bc9b4bec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +# 3 精讲Java面试中的高频并发问题 +为什么wait必须在同步代码块中使用? -# 3 环境参数 +线程是如何在6种状态之间切换的? + +哪些场景需要额外注意线程安全问题? + +讲一讲什么是Java内存模型? + +happens-before、volatile和可见性的关系? + +实际开发中如何避免死锁? + +# 4 领悟Java大佬的学习方法与体系思想 +如何从宏观和微观两个方面来提高技术? + +提高技术的途径有哪些? + +如何了解技术领域的前沿动态? + +工作中业务缠身,如何在业务开发中得到更多成长? + +如何分析native的c/cpp代码,如何使用openJDK? + +“自顶向下”的学习方法以及好处? + +# 5 环境参数 ## 基本工具 -- Maven 3.3.9 +- Maven 3.3.9+ -- JDK 8 +- JDK 8+ -- Tomcat +- Tomcat 8+ -- MySQL 8.0.16 +- MySQL 8.0.16+ -- Redis +- Redis 5+ ## IDE -Intellij IDEA 2019.2 +Intellij IDEA 2019.2+ ## 测试工具 -Postman、JMeter +Postman + +JMeter ## 框架 -SpringBoot、Mybatis +SpringBoot + +Mybatis ## 组件 -Kafka、RabbitMQ、elastic-job... +Kafka -# 4 知识点概要 +RabbitMQ + +elastic-job... + +# 6 知识点概要 ## 线程安全性 线程安全性,主要从原子性、可见性、有序性三个方面 @@ -115,11 +190,14 @@ J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的 ## 知识体系总结 对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 -![](https://upload-images.jianshu.io/upload_images/4685968-76a236d781f7dee7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![](https://uploadfiles.nowcoder.com/files/20190815/5088755_1565799768221_4685968-76a236d781f7dee7.png) # 参考 -[Java并发编程入门与高并发面试](https://coding.imooc.com/class/195.html) +- [Java并发编程实战](https://book.douban.com/subject/10484692/) + +- [Java并发编程入门与高并发面试](https://coding.imooc.com/class/195.html) -[Java并发编程的艺术](https://book.douban.com/subject/26591326/) +- [Java并发编程的艺术](https://book.douban.com/subject/26591326/) -[深入理解Java虚拟机第二版](https://book.douban.com/subject/24722612/) +- [深入理解Java虚拟机第二版](https://book.douban.com/subject/24722612/) From f72f2328ec33f410c2193b964d900a6082ad6113 Mon Sep 17 00:00:00 2001 From: Wasabi1234 Date: Thu, 29 Aug 2019 22:49:14 +0800 Subject: [PATCH 19/24] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E7=8A=B6=E6=80=81,=E7=BB=88=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/inspectionProfiles/Project_Default.xml | 1 + .../concurrency/ConcurrencyApplication.java | 2 +- .../javaedge/concurrency/ConcurrencyTest.java | 2 +- .../concurrency/common/state/ThreadState.java | 75 +++++++++++++++++++ .../common/stop/FlagStopThread.java | 29 +++++++ .../concurrency/common/stop/StopThread.java | 33 ++++++++ .../concurrency/common/stop/ThreadStop.java | 26 +++++++ .../example/cache/CacheController.java | 2 +- .../example/cache/RedisClient.java | 2 +- .../example/cache/RedisConfig.java | 2 +- .../concurrency/example/mq/Message.java | 2 +- .../concurrency/example/mq/MqController.java | 2 +- .../example/mq/kafka/KafkaReceiver.java | 2 +- .../example/mq/kafka/KafkaSender.java | 2 +- .../example/mq/kafka/TopicConstants.java | 2 +- .../example/mq/rabbitmq/QueueConstants.java | 2 +- .../example/mq/rabbitmq/RabbitMqClient.java | 2 +- .../example/mq/rabbitmq/RabbitMqConfig.java | 2 +- .../example/mq/rabbitmq/RabbitMqServer.java | 2 +- 19 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/common/state/ThreadState.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/common/stop/FlagStopThread.java create mode 100755 concurrency/src/main/java/com/javaedge/concurrency/common/stop/StopThread.java create mode 100644 concurrency/src/main/java/com/javaedge/concurrency/common/stop/ThreadStop.java diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 6560a98..85193ab 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,6 +1,7 @@