{"id":1791,"date":"2021-09-22T22:41:00","date_gmt":"2021-09-22T14:41:00","guid":{"rendered":"https:\/\/199604.com\/?p=1791"},"modified":"2021-09-26T16:19:38","modified_gmt":"2021-09-26T08:19:38","slug":"java%e5%a4%9a%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0","status":"publish","type":"post","link":"https:\/\/199604.com\/1791","title":{"rendered":"Java\u591a\u7ebf\u7a0b\u7f16\u7a0b\u5b66\u4e60\u7b14\u8bb0"},"content":{"rendered":"<h1>Java\u591a\u7ebf\u7a0b\u7f16\u7a0b<\/h1>\n<h2>Java\u8fdb\u7a0b<\/h2>\n<p>\u8fdb\u7a0b(Process)\u662f\u8ba1\u7b97\u673a\u4e2d\u7684\u7a0b\u5e8f\u5173\u4e8e\u67d0\u6570\u636e\u96c6\u5408\u4e0a\u7684\u4e00\u6b21\u8fd0\u884c\u6d3b\u52a8,\u662f\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u884c\u8d44\u6e90\u5206\u914d\u4e0e\u8c03\u5ea6\u7684\u57fa\u672c\u5355\u4f4d\u3002<\/p>\n<p>\u53ef\u4ee5\u628a\u8fdb\u7a0b\u7b80\u5355\u7684\u7406\u89e3\u4e3a\u6b63\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u8fd0\u884c\u7684\u4e00\u4e2a\u7a0b\u5e8f\u3002<\/p>\n<h2>Java\u7ebf\u7a0b<\/h2>\n<p>\u7ebf\u7a0b(thread)\u662f\u8fdb\u7a0b\u7684\u4e00\u4e2a\u6267\u884c\u5355\u5143\u3002<\/p>\n<p>\u4e00\u4e2a\u7ebf\u7a0b\u5c31\u662f\u8fdb\u7a0b\u4e2d\u4e00\u4e2a\u5355\u4e00\u987a\u5e8f\u7684\u63a7\u5236\u6d41, \u8fdb\u7a0b\u7684\u4e00\u4e2a\u6267\u884c\u5206\u652f\u3002<\/p>\n<p>\u8fdb\u7a0b\u662f\u7ebf\u7a0b\u7684\u5bb9\u5668,\u4e00\u4e2a\u8fdb\u7a0b\u81f3\u5c11\u6709\u4e00\u4e2a\u7ebf\u7a0b.\u4e00\u4e2a\u8fdb\u7a0b\u4e2d\u4e5f\u53ef\u4ee5\u6709\u591a\u4e2a\u7ebf\u7a0b\u3002<\/p>\n<p>\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u662f\u4ee5\u8fdb\u7a0b\u4e3a\u5355\u4f4d\u5206\u914d\u8d44\u6e90,\u5982\u865a\u62df\u5b58\u50a8\u7a7a\u95f4,\u6587\u4ef6\u63cf\u8ff0\u7b26\u7b49. \u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u6709\u5404\u81ea\u7684\u7ebf\u7a0b\u6808,\u81ea\u5df1\u7684\u5bc4\u5b58\u5668\u73af\u5883,\u81ea\u5df1\u7684\u7ebf\u7a0b\u672c\u5730\u5b58\u50a8\u3002<\/p>\n<h2>Java\u4e3b\u7ebf\u7a0b\u4e0e\u5b50\u7ebf\u7a0b<\/h2>\n<p>JVM\u542f\u52a8\u65f6\u4f1a\u521b\u5efa\u4e00\u4e2a\u4e3b\u7ebf\u7a0b,\u8be5\u4e3b\u7ebf\u7a0b\u8d1f\u8d23\u6267\u884cmain\u65b9\u6cd5 . \u4e3b\u7ebf\u7a0b\u5c31\u662f\u8fd0\u884cmain\u65b9\u6cd5\u7684\u7ebf\u7a0b\u3002<\/p>\n<p>Java\u4e2d\u7684\u7ebf\u7a0b\u4e0d\u5b64\u7acb\u7684,\u7ebf\u7a0b\u4e4b\u95f4\u5b58\u5728\u4e00\u4e9b\u8054\u7cfb. \u5982\u679c\u5728A\u7ebf\u7a0b\u4e2d\u521b\u5efa\u4e86B\u7ebf\u7a0b, \u79f0B\u7ebf\u7a0b\u4e3aA\u7ebf\u7a0b\u7684\u5b50\u7ebf\u7a0b, \u76f8\u5e94\u7684A\u7ebf\u7a0b\u5c31\u662fB\u7ebf\u7a0b\u7684\u7236\u7ebf\u7a0b\u3002<\/p>\n<h2>Java\u4e32\u884c\u3001\u5e76\u53d1\u4e0e\u5e76\u884c<\/h2>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/\/typoraImg\/1588149067@1619112d5fad7066875d285b03650959.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/\/typoraImg\/1588149067@1619112d5fad7066875d285b03650959.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<p>\u5e76\u53d1\u53ef\u4ee5\u63d0\u9ad8\u4ee5\u4e8b\u7269\u7684\u5904\u7406\u6548\u7387, \u5373\u4e00\u6bb5\u65f6\u95f4\u5185\u53ef\u4ee5\u5904\u7406\u6216\u8005\u5b8c\u6210\u66f4\u591a\u7684\u4e8b\u60c5\u3002<\/p>\n<p>\u5e76\u884c\u662f\u4e00\u79cd\u66f4\u4e3a\u4e25\u683c,\u7406\u60f3\u7684\u5e76\u53d1\u3002<\/p>\n<p>\u4ece\u786c\u4ef6\u89d2\u5ea6\u6765\u8bf4, \u5982\u679c\u5355\u6838CPU,\u4e00\u4e2a\u5904\u7406\u5668\u4e00\u6b21\u53ea\u80fd\u6267\u884c\u4e00\u4e2a\u7ebf\u7a0b\u7684\u60c5\u51b5\u4e0b,\u5904\u7406\u5668\u53ef\u4ee5\u4f7f\u7528\u65f6\u95f4\u7247\u8f6e\u8f6c\u6280\u672f ,\u53ef\u4ee5\u8ba9CPU\u5feb\u901f\u7684\u5728\u5404\u4e2a\u7ebf\u7a0b\u4e4b\u95f4\u8fdb\u884c\u5207\u6362, \u5bf9\u4e8e\u7528\u6765\u6765\u8bf4,\u611f\u89c9\u662f\u4e09\u4e2a\u7ebf\u7a0b\u5728\u540c\u65f6\u6267\u884c.\u5982\u679c\u662f\u591a\u6838\u5fc3CPU,\u53ef\u4ee5\u4e3a\u4e0d\u540c\u7684\u7ebf\u7a0b\u5206\u914d\u4e0d\u540c\u7684CPU\u5185\u6838\u3002<\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u7684\u521b\u5efa\u4e0e\u542f\u52a8\u65b9\u5f0f<\/h1>\n<p>\u5728Java\u4e2d,\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b\u5c31\u662f\u521b\u5efa\u4e00\u4e2aThread\u7c7b(\u5b50\u7c7b)\u7684\u5bf9\u8c61(\u5b9e\u4f8b)\u3002<\/p>\n<p>Thread\u7c7b\u6709\u4e24\u4e2a\u5e38\u7528\u7684\u6784\u9020\u65b9\u6cd5:Thread()\u4e0eThread(Runnable).\u5bf9\u5e94\u7684\u521b\u5efa\u7ebf\u7a0b\u7684\u4e24\u79cd\u65b9\u5f0f\uff1a<\/p>\n<ul>\n<li>\u5b9a\u4e49Thread\u7c7b\u7684\u5b50\u7c7b<\/li>\n<li>\u5b9a\u4e49\u4e00\u4e2aRunnable\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b<\/li>\n<\/ul>\n<p>\u8fd9\u4e24\u79cd\u521b\u5efa\u7ebf\u7a0b\u7684\u65b9\u5f0f\u6ca1\u6709\u672c\u8d28\u7684\u533a\u522b\u3002<\/p>\n<h4>Thread\u7c7b\u5b50\u7c7b\uff1a<\/h4>\n<pre><code class=\"language-java line-numbers\">public class MyThread extends Thread{\n    @Override\n    public void run() {\n        System.out.println(\"\u8fd9\u662f\u5b50\u7ebf\u7a0b\u6253\u5370\u7684\u5185\u5bb9\");\n    }\n}\n---------\npublic class App\n{\n    public static void main( String[] args )\n    {\n        System.out.println(\"JVM\u542f\u52a8main\u7ebf\u7a0b,main\u7ebf\u7a0b\u6267\u884cmain\u65b9\u6cd5\");\n        \/\/ \u521b\u5efa\u5b50\u7ebf\u7a0b\u5bf9\u8c61\n        MyThread myThread = new MyThread();\n        \/*\n            \u8c03\u7528\u7ebf\u7a0b\u7684start()\u65b9\u6cd5\u6765\u542f\u52a8\u7ebf\u7a0b, \u542f\u52a8\u7ebf\u7a0b\u7684\u5b9e\u8d28\u5c31\u662f\u8bf7\u6c42JVM\u8fd0\u884c\u76f8\u5e94\u7684\u7ebf\u7a0b,\u8fd9\u4e2a\u7ebf\u7a0b\u5177\u4f53\u5728\u4ec0\u4e48\u65f6\u5019\u8fd0\u884c\u7531\u7ebf\u7a0b\u8c03\u5ea6\u5668(Scheduler)\u51b3\u5b9a\n            \u6ce8\u610f:\n                start()\u65b9\u6cd5\u8c03\u7528\u7ed3\u675f\u5e76\u4e0d\u610f\u5473\u7740\u5b50\u7ebf\u7a0b\u5f00\u59cb\u8fd0\u884c\n                \u65b0\u5f00\u542f\u7684\u7ebf\u7a0b\u4f1a\u6267\u884crun()\u65b9\u6cd5\n                \u5982\u679c\u5f00\u542f\u4e86\u591a\u4e2a\u7ebf\u7a0b,start()\u8c03\u7528\u7684\u987a\u5e8f\u5e76\u4e0d\u4e00\u5b9a\u5c31\u662f\u7ebf\u7a0b\u542f\u52a8\u7684\u987a\u5e8f\n                \u591a\u7ebf\u7a0b\u8fd0\u884c\u7ed3\u679c\u4e0e\u4ee3\u7801\u6267\u884c\u987a\u5e8f\u6216\u8c03\u7528\u987a\u5e8f\u65e0\u5173\n        *\/\n        \/\/ \u542f\u52a8\u7ebf\u7a0b\n        myThread.start();\n    }\n}\n<\/code><\/pre>\n<h4>Runnable\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b:<\/h4>\n<pre><code class=\"language-java line-numbers\">public class MyRunnable implements Runnable{\n    @Override\n    public void run() {\n        System.out.println(\"\u8fd9\u662f\u5b50\u7ebf\u7a0b\u6253\u5370\u7684\u5185\u5bb9\");\n    }\n}\n--------\npublic class App\n{\n    public static void main( String[] args )\n    {\n        \/\/ \u521b\u5efaRunnable\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b\u5bf9\u8c61\n        MyRunnable myRunnable = new MyRunnable();\n        \/\/ \u521b\u5efa\u7ebf\u7a0b\u5bf9\u8c61\n        Thread thread = new Thread(myRunnable);\n        \/\/ \u5f00\u542f\u7ebf\u7a0b\n        thread.start();\n\n\n        \/\/ \u6709\u65f6\u8c03\u7528Thread(Runnable)\u6784\u9020\u65b9\u6cd5\u65f6,\u5b9e\u53c2\u4e5f\u4f1a\u4f20\u9012\u533f\u540d\u5185\u90e8\u7c7b\u5bf9\u8c61\n        Thread thread1 = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(\"\u533f\u540d\u5185\u90e8\u7c7b\u5bf9\u8c61\u6253\u5370\u7684\u5185\u5bb9\");\n            }\n        });\n        thread1.start();\n    }\n}\n<\/code><\/pre>\n<h1>Java\u591a\u7ebf\u7a0b\u5e38\u7528\u7684\u65b9\u6cd5<\/h1>\n<h2>currentThread()\u65b9\u6cd5<\/h2>\n<p><code>Thread.currentThread()<\/code>\u65b9\u6cd5\u53ef\u4ee5\u83b7\u5f97\u5f53\u524d\u7ebf\u7a0b\u3002<\/p>\n<p>Java\u4e2d\u7684\u4efb\u4f55\u4e00\u6bb5\u4ee3\u7801\u90fd\u662f\u6267\u884c\u5728\u67d0\u4e2a\u7ebf\u7a0b\u5f53\u4e2d\u7684. \u6267\u884c\u5f53\u524d\u4ee3\u7801\u7684\u7ebf\u7a0b\u5c31\u662f\u5f53\u524d\u7ebf\u7a0b\u3002<\/p>\n<p>\u540c\u4e00\u6bb5\u4ee3\u7801\u53ef\u80fd\u88ab\u4e0d\u540c\u7684\u7ebf\u7a0b\u6267\u884c,\u56e0\u6b64\u5f53\u524d\u7ebf\u7a0b\u662f\u76f8\u5bf9\u7684,<code>Thread.currentThread()<\/code>\u65b9\u6cd5\u7684\u8fd4\u56de\u503c\u662f\u5728\u4ee3\u7801\u5b9e\u9645\u8fd0\u884c\u65f6\u5019\u7684\u7ebf\u7a0b\u5bf9\u8c61\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class SubThread extends Thread{\n\n    public SubThread() {\n        System.out.println(\"\u6784\u9020\u65b9\u6cd5\u6253\u5370\u5f53\u524d\u7ebf\u7a0b\u7684\u540d\u79f0:\"+Thread.currentThread().getName());\n    }\n\n    @Override\n    public void run() {\n        System.out.println(\"run\u65b9\u6cd5\u6253\u5370\u5f53\u524d\u7ebf\u7a0b\u540d\u79f0:\" + Thread.currentThread().getName());\n    }\n}\n\n------\n    @Test\n    public void Test01CurrentThread()\n    {\n        System.out.println(\"main\u65b9\u6cd5\u4e2d\u6253\u5370\u5f53\u524d\u7ebf\u7a0b:\"  + Thread.currentThread().getName());\n        \/\/\u521b\u5efa\u5b50\u7ebf\u7a0b, \u8c03\u7528SubThread1()\u6784\u9020\u65b9\u6cd5, \u5728main\u7ebf\u7a0b\u4e2d\u8c03\u7528\u6784\u9020\u65b9\u6cd5,\u6240\u4ee5\u6784\u9020\u65b9\u6cd5\u4e2d \u7684\u5f53\u524d\u7ebf\u7a0b\u5c31\u662fmain\u7ebf\u7a0b\n        SubThread subThread = new SubThread();\n        \/\/\u542f\u52a8\u5b50\u7ebf\u7a0b,\u5b50\u7ebf\u7a0b\u4f1a\u8c03\u7528run()\u65b9\u6cd5,\u6240\u4ee5run()\u65b9\u6cd5\u4e2d \u7684\u5f53\u524d\u7ebf\u7a0b\u5c31\u662fThread-0\u5b50\u7ebf\u7a0b\n        \/\/subThread.start();\n        \/\/\u5728main\u65b9\u6cd5\u4e2d\u76f4\u63a5\u8c03\u7528run()\u65b9\u6cd5,\u6ca1\u6709\u5f00\u542f\u65b0\u7684\u7ebf\u7a0b,\u6240\u4ee5\u5728run\u65b9\u6cd5\u4e2d\u7684\u5f53\u524d\u7ebf\u7a0b\u5c31\u662fmain\u7ebf\u7a0b\n        subThread.run();\n    }\n\nmain\u65b9\u6cd5\u4e2d\u6253\u5370\u5f53\u524d\u7ebf\u7a0b:main\n\u6784\u9020\u65b9\u6cd5\u6253\u5370\u5f53\u524d\u7ebf\u7a0b\u7684\u540d\u79f0:main\nrun\u65b9\u6cd5\u6253\u5370\u5f53\u524d\u7ebf\u7a0b\u540d\u79f0:main\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">public class SubThread2 extends Thread{\n\n    public SubThread2() {\n        System.out.println(\"\u6784\u9020\u65b9\u6cd5\u4e2d,Thread.currentThread().getName() : \" + Thread.currentThread().getName() );\n        System.out.println(\"\u6784\u9020\u65b9\u6cd5,this.getName() : \" + this.getName());\n    }\n\n    @Override\n    public void run() {\n        System.out.println(\"run\u65b9\u6cd5\u4e2d,Thread.currentThread().getName() : \" + Thread.currentThread().getName() );\n        System.out.println(\"run\u65b9\u6cd5,this.getName() : \" + this.getName());\n    }\n}\n\n    @Test\n    public void Test02CurrentThread() throws InterruptedException {\n\n        SubThread2 t2 = new SubThread2();\n        \/\/ \u8bbe\u7f6e\u7ebf\u7a0b\u540d\u79f0\n        t2.setName(\"t2\");\n        t2.start();\n\n        Thread.sleep(200);\n\n        \/\/Thread(Runnable)\u6784\u9020\u65b9\u6cd5\u5f62\u53c2\u662fRunnable\u63a5\u53e3,\u8c03\u7528\u65f6\u4f20\u9012\u7684\u5b9e\u53c2\u662f\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b\u5bf9\u8c61\n        Thread t3 = new Thread(t2);\n        t3.start();\n    }\n\n\u6784\u9020\u65b9\u6cd5\u4e2d,Thread.currentThread().getName() : main\n\u6784\u9020\u65b9\u6cd5,this.getName() : Thread-0\nrun\u65b9\u6cd5\u4e2d,Thread.currentThread().getName() : t2\nrun\u65b9\u6cd5,this.getName() : t2\nrun\u65b9\u6cd5\u4e2d,Thread.currentThread().getName() : Thread-1\nrun\u65b9\u6cd5,this.getName() : t2\n<\/code><\/pre>\n<p><code>thread.setName<\/code>(\u7ebf\u7a0b\u540d\u79f0), \u8bbe\u7f6e\u7ebf\u7a0b\u540d\u79f0\u3002<\/p>\n<p><code>thread.getName()<\/code>\u8fd4\u56de\u7ebf\u7a0b\u540d\u79f0\u3002<\/p>\n<p>\u901a\u8fc7\u8bbe\u7f6e\u7ebf\u7a0b\u540d\u79f0,\u6709\u52a9\u4e8e\u7a0b\u5e8f\u8c03\u8bd5,\u63d0\u9ad8\u7a0b\u5e8f\u7684\u53ef\u8bfb\u6027, \u5efa\u8bae\u4e3a\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u8bbe\u7f6e\u4e00\u4e2a\u80fd\u591f\u4f53\u73b0\u7ebf\u7a0b\u529f\u80fd\u7684\u540d\u79f0\u3002<\/p>\n<h2>isAlive()<\/h2>\n<p><code>thread.isAlive()<\/code>\u5224\u65ad\u5f53\u524d\u7ebf\u7a0b\u662f\u5426\u5904\u4e8e\u6d3b\u52a8\u72b6\u6001\u3002<\/p>\n<p>\u6d3b\u52a8\u72b6\u6001\u5c31\u662f\u7ebf\u7a0b\u5df2\u542f\u52a8\u5e76\u4e14\u5c1a\u672a\u7ec8\u6b62\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class SubThread3 extends Thread{\n    @Override\n    public void run() {\n        \/\/\u8fd0\u884c\u72b6\u6001,true\n        System.out.println(\"run\u65b9\u6cd5\uff0cisAlive = \"+this.isAlive());\n    }\n}\n\n\n    @Test\n    public void Test03CurrentThread() throws InterruptedException {\n        SubThread3 t3 = new SubThread3();\n        System.out.println(\"begin==\" + t3.isAlive());\/\/false,\u5728\u542f\u52a8\u7ebf\u7a0b\u4e4b\u524d\n        t3.start();\n        Thread.sleep(500);\n        \/\/ \u7ed3\u679c\u4e0d\u4e00\u5b9a,\u6253\u5370\u8fd9\u4e00\u884c\u65f6,\u5982\u679ct3\u7ebf\u7a0b\u8fd8\u6ca1\u7ed3\u675f\u5c31\u8fd4\u56detrue, \u5982\u679ct3\u7ebf\u7a0b\u5df2\u7ed3\u675f,\u8fd4\u56defalse\n        System.out.println(\"end==\" + t3.isAlive());\n    }\n\n<\/code><\/pre>\n<h2>sleep()<\/h2>\n<p><code>Thread.sleep(millis)<\/code>\u8ba9\u5f53\u524d\u7ebf\u7a0b\u4f11\u7720\u6307\u5b9a\u7684\u6beb\u79d2\u6570\u3002<\/p>\n<h2>getId()<\/h2>\n<p><code>thread.getId()<\/code>\u53ef\u4ee5\u83b7\u5f97\u7ebf\u7a0b\u7684\u552f\u4e00\u6807\u8bc6\u3002<\/p>\n<p>\u6ce8\u610f:<\/p>\n<p>\u67d0\u4e2a\u7f16\u53f7\u7684\u7ebf\u7a0b\u8fd0\u884c\u7ed3\u675f\u540e,\u8be5\u7f16\u53f7\u53ef\u80fd\u88ab\u540e\u7eed\u521b\u5efa\u7684\u7ebf\u7a0b\u4f7f\u7528\u3002<\/p>\n<p>\u91cd\u542f\u7684JVM\u540e,\u540c\u4e00\u4e2a\u7ebf\u7a0b\u7684\u7f16\u53f7\u53ef\u80fd\u4e0d\u4e00\u6837\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class SubThread5 extends Thread{\n    @Override\n    public void run() {\n        System.out.print(\"thread name = \"+ Thread.currentThread().getName());\n        System.out.println(\",thread id = \"+ this.getId());\n    }\n}\n\n    @Test\n    public void Test05CurrentThread() throws InterruptedException {\n\n        \/\/\u5b50\u7ebf\u7a0b\u7684id\n        for(int i = 1; i &lt;= 10; i++){\n            new SubThread5().start();\n            Thread.sleep(100);\n        }\n    }\n-----    \nthread name = Thread-0,thread id = 14\nthread name = Thread-1,thread id = 15\nthread name = Thread-2,thread id = 16\nthread name = Thread-3,thread id = 17\nthread name = Thread-4,thread id = 18\nthread name = Thread-5,thread id = 19\nthread name = Thread-6,thread id = 20\nthread name = Thread-7,thread id = 21\nthread name = Thread-8,thread id = 22\nthread name = Thread-9,thread id = 23\n\n<\/code><\/pre>\n<h2>yield()<\/h2>\n<p><code>Thread.yield()<\/code>\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u653e\u5f03\u5f53\u524d\u7684CPU\u8d44\u6e90\u3002\uff08\u7ebf\u7a0b\u8ba9\u6b65\uff09<\/p>\n<p>\u7528\u4e00\u4e2a\u7b80\u5355\u7684\u6bd4\u55bb\u6765\u5f62\u5bb9\u5c31\u662f\uff1a<\/p>\n<p><strong>\u4e09\u4e2a\u4eba\u585e\u7c73\u8d5b\u8dd1\uff0c\u4e09\u4eba\u90fd\u5feb\u8dd1\u523090m\u4f4d\u7f6e\u7684\u65f6\u5019\uff0c2\u53f7\u7a81\u7136\u88ab\u4f20\u9001\u5230\u4e86\u8d77\u70b9\uff0c\u4e09\u4eba\u7ee7\u7eed\u8dd1\uff0c\u8fd9\u68371\u53f7\u548c3\u53f7\u8d62\u7684\u673a\u4f1a\u5c31\u5927\u5f97\u591a<\/strong><\/p>\n<p>2\u53f7\u5c31\u76f8\u5f53\u4e8e\u8c03\u7528\u4e86<code>yield()<\/code>\u7684\u7ebf\u7a0b\uff0c\u7ebf\u7a0b\u8c03\u7528\u4e86<code>yiled()<\/code>\u4e4b\u540e\u56de\u9000\u5230\u53ef\u8fd0\u884c\u72b6\u6001\uff0c\u5c06\u62a2\u5360\u8d44\u6e90\u7684\u673a\u4f1a\u8ba9\u7ed9\u5176\u4ed6\u76f8\u540c\u4f18\u5148\u7ea7\u7684\u7ebf\u7a0b\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class SubThread6 extends Thread {\n    @Override\n    public void run() {\n        long begin = System.currentTimeMillis();\n        long sum = 0;\n        for (int i =1;i&lt;=100000;i++){\n            sum +=i;\n            \/\/\u7ebf\u7a0b\u8ba9\u6b65, \u653e\u5f03CPU\u6267\u884c\u6743\n            Thread.yield();\n        }\n        long end = System.currentTimeMillis();\n        System.out.println(\"\u7528\u65f6: \" + (end - begin)+\",sum=\"+sum);\n    }\n}\n--------\n    @Test\n    public void Test06CurrentThread(){\n        SubThread6 t6 = new SubThread6();\n        t6.start();\n\n        long begin = System.currentTimeMillis();\n        long sum = 0;\n        for(int i = 1; i &lt;= 1000000; i++){\n            sum += i;\n        }\n        long end = System.currentTimeMillis();\n        System.out.println(\"\u7528\u65f6: \" + (end - begin)+\",sum=\"+sum);\n    }\n<\/code><\/pre>\n<h2>setPriority()<\/h2>\n<p><code>thread.setPriority( num )<\/code> \u8bbe\u7f6e\u7ebf\u7a0b\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<p>Java\u7ebf\u7a0b\u7684\u4f18\u5148\u7ea7\u53d6\u503c\u8303\u56f4\u662f 1 ~ 10 , \u5982\u679c\u8d85\u51fa\u8fd9\u4e2a\u8303\u56f4\u4f1a\u629b\u51fa\u5f02\u5e38<code>IllegalArgumentException<\/code>\u3002<\/p>\n<p>\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d,\u4f18\u5148\u7ea7\u8f83\u9ad8\u7684\u7ebf\u7a0b\u83b7\u5f97CPU\u7684\u8d44\u6e90\u8d8a\u591a\u3002<\/p>\n<p>\u7ebf\u7a0b\u4f18\u5148\u7ea7\u672c\u8d28\u4e0a\u662f\u53ea\u662f\u7ed9\u7ebf\u7a0b\u8c03\u5ea6\u5668\u4e00\u4e2a\u63d0\u793a\u4fe1\u606f,\u4ee5\u4fbf\u4e8e\u8c03\u5ea6\u5668\u51b3\u5b9a\u5148\u8c03\u5ea6\u54ea\u4e9b\u7ebf\u7a0b. \u6ce8\u610f\u4e0d\u80fd\u4fdd\u8bc1\u4f18\u5148\u7ea7\u9ad8\u7684\u7ebf\u7a0b\u5148\u8fd0\u884c\u3002<\/p>\n<p>Java\u4f18\u5148\u7ea7\u8bbe\u7f6e\u4e0d\u5f53\u6216\u8005\u6ee5\u7528\u53ef\u80fd\u4f1a\u5bfc\u81f4\u67d0\u4e9b\u7ebf\u7a0b\u6c38\u8fdc\u65e0\u6cd5\u5f97\u5230\u8fd0\u884c,\u5373\u4ea7\u751f\u4e86\u7ebf\u7a0b\u9965\u997f\u3002<\/p>\n<p>\u7ebf\u7a0b\u7684\u4f18\u5148\u7ea7\u5e76\u4e0d\u662f\u8bbe\u7f6e\u7684\u8d8a\u9ad8\u8d8a\u597d,\u4e00\u822c\u60c5\u51b5\u4e0b\u4f7f\u7528\u666e\u901a\u7684\u4f18\u5148\u7ea7\u5373\u53ef,\u5373\u5728\u5f00\u53d1\u65f6\u4e0d\u5fc5\u8bbe\u7f6e\u7ebf\u7a0b\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<p>\u7ebf\u7a0b\u7684\u4f18\u5148\u7ea7\u5177\u6709\u7ee7\u627f\u6027, \u5728A\u7ebf\u7a0b\u4e2d\u521b\u5efa\u4e86B\u7ebf\u7a0b,\u5219B\u7ebf\u7a0b\u7684\u4f18\u5148\u7ea7\u4e0eA\u7ebf\u7a0b\u662f\u4e00\u6837\u7684\u3002<\/p>\n<h2>interrupt()<\/h2>\n<p>\u4e2d\u65ad\u7ebf\u7a0b\u3002<\/p>\n<p>\u6ce8\u610f\u8c03\u7528interrupt()\u65b9\u6cd5\u4ec5\u4ec5\u662f\u5728\u5f53\u524d\u7ebf\u7a0b\u6253\u4e00\u4e2a\u505c\u6b62\u6807\u5fd7,\u5e76\u4e0d\u662f\u771f\u6b63\u7684\u505c\u6b62\u7ebf\u7a0b\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class SubThread8 extends Thread{\n    @Override\n    public void run() {\n        super.run();\n        int i = 100000;\n        for (int i1 = 0; i1 &lt; i; i1++) {\n            \/\/\u5224\u65ad\u7ebf\u7a0b\u7684\u4e2d\u65ad\u6807\u5fd7,\u7ebf\u7a0b\u6709 isInterrupted()\u65b9\u6cd5,\u8be5\u65b9\u6cd5\u8fd4\u56de\u7ebf\u7a0b\u7684\u4e2d\u65ad\u6807\u5fd7\n            if (this.isInterrupted()) {\n                System.out.println(\"\u5f53\u524d\u7ebf\u7a0b\u7684\u4e2d\u65ad\u6807\u5fd7\u4e3atrue, \u6211\u8981\u9000\u51fa\u4e86\");\n                return;\n            }\n            System.out.println(\"sub thread --&gt; \" + i1);\n        }\n    }\n}\n\n    @Test\n    public void Test08CurrentThread(){\n        SubThread8 t8 = new SubThread8();\n        t8.start();\n\n        for (int i = 0;i&lt;10;i++){\n            System.out.println(\"main ==&gt; \" + i);\n        }\n        \/\/\u4e2d\u65ad\u5b50\u7ebf\u7a0b\n        t8.interrupt();\n    }\nmain ==&gt; 0\nmain ==&gt; 1\nmain ==&gt; 2\nmain ==&gt; 3\nmain ==&gt; 4\nmain ==&gt; 5\nmain ==&gt; 6\nmain ==&gt; 7\nsub thread --&gt; 0\nmain ==&gt; 8\nsub thread --&gt; 1\nmain ==&gt; 9\nsub thread --&gt; 2\n\u5f53\u524d\u7ebf\u7a0b\u7684\u4e2d\u65ad\u6807\u5fd7\u4e3atrue, \u6211\u8981\u9000\u51fa\u4e86\n<\/code><\/pre>\n<h2>setDaemon()<\/h2>\n<p>Java\u4e2d\u7684\u7ebf\u7a0b\u5206\u4e3a\u7528\u6237\u7ebf\u7a0b\u4e0e\u5b88\u62a4\u7ebf\u7a0b\u3002<\/p>\n<p>\u5b88\u62a4\u7ebf\u7a0b\u662f\u4e3a\u5176\u4ed6\u7ebf\u7a0b\u63d0\u4f9b\u670d\u52a1\u7684\u7ebf\u7a0b,\u5982\u5783\u573e\u56de\u6536\u5668(GC)\u5c31\u662f\u4e00\u4e2a\u5178\u578b\u7684\u5b88\u62a4\u7ebf\u7a0b\u3002<\/p>\n<p>\u5b88\u62a4\u7ebf\u7a0b\u4e0d\u80fd\u5355\u72ec\u8fd0\u884c, \u5f53JVM\u4e2d\u6ca1\u6709\u5176\u4ed6\u7528\u6237\u7ebf\u7a0b,\u53ea\u6709\u5b88\u62a4\u7ebf\u7a0b\u65f6,\u5b88\u62a4\u7ebf\u7a0b\u4f1a\u81ea\u52a8\u9500\u6bc1, JVM\u4f1a\u9000\u51fa\u3002<\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u7684\u751f\u547d\u5468\u671f<\/h1>\n<p>\u7ebf\u7a0b\u7684\u751f\u547d\u5468\u671f\u662f\u7ebf\u7a0b\u5bf9\u8c61\u7684\u751f\u8001\u75c5\u6b7b,\u5373\u7ebf\u7a0b\u7684\u72b6\u6001\u3002<\/p>\n<p>\u7ebf\u7a0b\u751f\u547d\u5468\u671f\u53ef\u4ee5\u901a\u8fc7<code>getState()<\/code>\u65b9\u6cd5\u83b7\u5f97, \u7ebf\u7a0b\u7684\u72b6\u6001\u662f<code>Thread.State<\/code>\u679a\u4e3e\u7c7b\u578b\u5b9a\u4e49\u7684, \u7531\u4ee5\u4e0b\u51e0\u79cd\uff1a<\/p>\n<ul>\n<li><code>NEW<\/code>,\u65b0\u5efa\u72b6\u6001. \u521b\u5efa\u4e86\u7ebf\u7a0b\u5bf9\u8c61,\u5728\u8c03\u7528<code>start()<\/code>\u542f\u52a8\u4e4b\u524d\u7684\u72b6\u6001\u3002<\/li>\n<li><code>RUNNABLE<\/code>,\u53ef\u8fd0\u884c\u72b6\u6001. \u5b83\u662f\u4e00\u4e2a\u590d\u5408\u72b6\u6001,\u5305\u542b:<code>READY<\/code>\u548c<code>RUNNING<\/code>\u4e24\u4e2a\u72b6\u6001. <code>READY<\/code>\u72b6\u6001\u8be5\u7ebf\u7a0b\u53ef\u4ee5\u88ab\u7ebf\u7a0b\u8c03\u5ea6\u5668\u8fdb\u884c\u8c03\u5ea6\u4f7f\u5b83\u5904\u4e8e<code>RUNNING<\/code>\u72b6\u6001,<code>RUNING<\/code>\u72b6\u6001\u8868\u793a\u8be5\u7ebf\u7a0b\u6b63\u5728\u6267\u884c. <code>Thread.yield()<\/code>\u65b9\u6cd5\u53ef\u4ee5\u628a\u7ebf\u7a0b\u7531RUNNING\u72b6\u6001\u8f6c\u6362\u4e3aREADY\u72b6\u6001<\/li>\n<li><code>BLOCKED<\/code>\u963b\u585e\u72b6\u6001.\u7ebf\u7a0b\u53d1\u8d77\u963b\u585e\u7684I\/O\u64cd\u4f5c,\u6216\u8005\u7533\u8bf7\u7531\u5176\u4ed6\u7ebf\u7a0b\u5360\u7528\u7684\u72ec\u5360\u8d44\u6e90,\u7ebf\u7a0b\u4f1a\u8f6c\u6362\u4e3a<code>BLOCKED<\/code>\u963b\u585e\u72b6\u6001. \u5904\u4e8e\u963b\u585e\u72b6\u6001\u7684\u7ebf\u7a0b\u4e0d\u4f1a\u5360\u7528CPU\u8d44\u6e90. \u5f53\u963b\u585eI\/O\u64cd\u4f5c\u6267\u884c\u5b8c,\u6216\u8005\u7ebf\u7a0b\u83b7\u5f97\u4e86\u5176\u7533\u8bf7\u7684\u8d44\u6e90,\u7ebf\u7a0b\u53ef\u4ee5\u8f6c\u6362\u4e3a<code>RUNNABLE<\/code>\u3002<\/li>\n<li><code>WAITING<\/code>\u7b49\u5f85\u72b6\u6001. \u7ebf\u7a0b\u6267\u884c\u4e86<code>object.wait(), thread.join()<\/code>\u65b9\u6cd5\u4f1a\u628a\u7ebf\u7a0b\u8f6c\u6362\u4e3a<code>WAITING<\/code>\u7b49\u5f85\u72b6\u6001, \u6267\u884c<code>object.notify()<\/code>\u65b9\u6cd5,\u6216\u8005\u52a0\u5165\u7684\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5,\u5f53\u524d\u7ebf\u7a0b\u4f1a\u8f6c\u6362\u4e3aRUNNABLE\u72b6\u6001\u3002<\/li>\n<li><code>TIMED_WAITING<\/code>\u72b6\u6001,\u4e0e<code>WAITING<\/code>\u72b6\u6001\u7c7b\u4f3c,\u90fd\u662f\u7b49\u5f85\u72b6\u6001.\u533a\u522b\u5728\u4e8e\u5904\u4e8e\u8be5\u72b6\u6001\u7684\u7ebf\u7a0b\u4e0d\u4f1a\u65e0\u9650\u7684\u7b49\u5f85,\u5982\u679c\u7ebf\u7a0b\u6ca1\u6709\u5728\u6307\u5b9a\u7684\u65f6\u95f4\u8303\u56f4\u5185\u5b8c\u6210\u671f\u671b\u7684\u64cd\u4f5c,\u8be5\u7ebf\u7a0b\u81ea\u52a8\u8f6c\u6362\u4e3a<code>RUNNABLE<\/code><\/li>\n<li><code>TERMINATED<\/code>\u7ec8\u6b62\u72b6\u6001,\u7ebf\u7a0b\u7ed3\u675f\u5904\u4e8e\u7ec8\u6b62\u72b6\u6001<\/li>\n<\/ul>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/typoraImg\/image-20210907211400969.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/typoraImg\/image-20210907211400969.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"image-20210907211400969\" \/><\/div><\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u7f16\u7a0b\u7684\u4f18\u52bf\u4e0e\u98ce\u9669<\/h1>\n<h3>Java\u591a\u7ebf\u7a0b\u7f16\u7a0b\u5177\u6709\u4ee5\u4e0b\u4f18\u52bf\uff1a<\/h3>\n<p>1\u3001\u63d0\u9ad8\u7cfb\u7edf\u7684\u541e\u5410\u7387(Throughout). \u591a\u7ebf\u7a0b\u7f16\u7a0b\u53ef\u4ee5\u4f7f\u4e00\u4e2a\u8fdb\u7a0b\u6709\u591a\u4e2a\u5e76\u53d1(concurrent,\u5373\u540c\u65f6\u8fdb\u884c\u7684)\u7684\u64cd\u4f5c\u3002<\/p>\n<p>2\u3001\u63d0\u9ad8\u54cd\u5e94\u6027(Responsiveness).Web\u670d\u52a1\u5668\u4f1a\u91c7\u7528\u4e00\u4e9b\u4e13\u95e8\u7684\u7ebf\u7a0b\u8d1f\u8d23\u7528\u6237\u7684\u8bf7\u6c42\u5904\u7406,\u7f29\u77ed\u4e86\u7528\u6237\u7684\u7b49\u5f85\u65f6\u95f4\u3002<\/p>\n<p>3\u3001\u5145\u5206\u5229\u7528\u591a\u6838(Multicore)\u5904\u7406\u5668\u8d44\u6e90. \u901a\u8fc7\u591a\u7ebf\u7a0b\u53ef\u4ee5\u5145\u5206\u7684\u5229\u7528CPU\u8d44\u6e90\u3002<\/p>\n<h3>Java\u591a\u7ebf\u7a0b\u7f16\u7a0b\u5b58\u5728\u7684\u95ee\u9898\u4e0e\u98ce\u9669\uff1a<\/h3>\n<p>1\u3001\u7ebf\u7a0b\u5b89\u5168(Thread safe)\u95ee\u9898.\u591a\u7ebf\u7a0b\u5171\u4eab\u6570\u636e\u65f6,\u5982\u679c\u6ca1\u6709\u91c7\u53d6\u6b63\u786e\u7684\u5e76\u53d1\u8bbf\u95ee\u63a7\u5236\u63aa\u65bd,\u5c31\u53ef\u80fd\u4f1a\u4ea7\u751f\u6570\u636e\u4e00\u81f4\u6027\u95ee\u9898,\u5982\u8bfb\u53d6\u810f\u6570\u636e(\u8fc7\u671f\u7684\u6570\u636e), \u5982\u4e22\u5931\u6570\u636e\u66f4\u65b0\u3002<\/p>\n<p>2\u3001\u7ebf\u7a0b\u6d3b\u6027(thread liveness)\u95ee\u9898.\u7531\u4e8e\u7a0b\u5e8f\u81ea\u8eab\u7684\u7f3a\u9677\u6216\u8005\u7531\u8d44\u6e90\u7a00\u7f3a\u6027\u5bfc\u81f4\u7ebf\u7a0b\u4e00\u76f4\u5904\u4e8e\u975eRUNNABLE\u72b6\u6001,\u8fd9\u5c31\u662f\u7ebf\u7a0b\u6d3b\u6027\u95ee\u9898,\u5e38\u89c1\u7684\u6d3b\u6027\u6545\u969c\u6709\u4ee5\u4e0b\u51e0\u79cd\uff1a<\/p>\n<ul>\n<li>\u6b7b\u9501(Deadlock). \u7c7b\u4f3c\u9e6c\u868c\u76f8\u4e89<\/li>\n<li>\u9501\u6b7b(Lockout), \u7c7b\u4f3c\u4e8e\u7761\u7f8e\u4eba\u6545\u4e8b\u4e2d\u738b\u5b50\u6302\u4e86<\/li>\n<li>\u6d3b\u9501(Livelock). \u7c7b\u4f3c\u4e8e\u5c0f\u732b\u54ac\u81ea\u5df1\u5c3e\u5df4<\/li>\n<li>\u9965\u997f(Starvation).\u7c7b\u4f3c\u4e8e\u5065\u58ee\u7684\u96cf\u9e1f\u603b\u662f\u4ece\u6bcd\u9e1f\u5634\u4e2d\u62a2\u5230\u98df\u7269<\/li>\n<\/ul>\n<p>3\u3001\u4e0a\u4e0b\u6587\u5207\u6362(Context Switch). \u5904\u7406\u5668\u4ece\u6267\u884c\u4e00\u4e2a\u7ebf\u7a0b\u5207\u6362\u5230\u6267\u884c\u53e6\u5916\u4e00\u4e2a\u7ebf\u7a0b\u3002<\/p>\n<p>4\u3001\u53ef\u9760\u6027. \u53ef\u80fd\u4f1a\u7531\u4e00\u4e2a\u7ebf\u7a0b\u5bfc\u81f4JVM\u610f\u5916\u7ec8\u6b62,\u5176\u4ed6\u7684\u7ebf\u7a0b\u4e5f\u65e0\u6cd5\u6267\u884c\u3002<\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u539f\u5b50\u6027\u4e0e\u53ef\u89c1\u6027<\/h1>\n<p>\u975e\u7ebf\u7a0b\u5b89\u5168\u4e3b\u8981\u662f\u6307\u591a\u4e2a\u7ebf\u7a0b\u5bf9\u540c\u4e00\u4e2a\u5bf9\u8c61\u7684\u5b9e\u4f8b\u53d8\u91cf\u8fdb\u884c\u64cd\u4f5c\u65f6,\u4f1a\u51fa\u73b0\u503c\u88ab\u66f4\u6539,\u503c\u4e0d\u540c\u6b65\u7684\u60c5\u51b5\u3002<\/p>\n<p>\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u8868\u73b0\u4e3a\u4e09\u4e2a\u65b9\u9762: <span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">\u539f\u5b50\u6027,\u53ef\u89c1\u6027\u548c\u6709\u5e8f\u6027<\/span>\u3002<\/p>\n<h2>\u539f\u5b50\u6027<\/h2>\n<p>\u539f\u5b50(Atomic)\u5c31\u662f\u4e0d\u53ef\u5206\u5272\u7684\u610f\u601d. \u539f\u5b50\u64cd\u4f5c\u7684\u4e0d\u53ef\u5206\u5272\u6709\u4e24\u5c42\u542b\u4e49\uff1a<\/p>\n<ul>\n<li>\u8bbf\u95ee(\u8bfb,\u5199)\u67d0\u4e2a\u5171\u4eab\u53d8\u91cf\u7684\u64cd\u4f5c\u4ece\u5176\u4ed6\u7ebf\u7a0b\u6765\u770b,\u8be5\u64cd\u4f5c\u8981\u4e48\u5df2\u7ecf\u6267\u884c\u5b8c\u6bd5,\u8981\u4e48\u5c1a\u672a\u53d1\u751f, \u5373\u5176\u4ed6\u7ebf\u7a0b\u5e74\u793a\u5230\u5f53\u524d\u64cd\u4f5c\u7684\u4e2d\u95f4\u7ed3\u679c\u3002<\/li>\n<li>\u8bbf\u95ee\u540c\u4e00\u7ec4\u5171\u4eab\u53d8\u91cf\u7684\u539f\u5b50\u64cd\u4f5c\u662f\u4e0d\u80fd\u591f\u4ea4\u9519\u7684\u3002<\/li>\n<\/ul>\n<p>\u5982\u73b0\u5b9e\u751f\u6d3b\u4e2d\u4eceATM\u673a\u53d6\u6b3e, \u5bf9\u4e8e\u7528\u6237\u6765\u8bf4,\u8981\u4e48\u64cd\u4f5c\u6210\u529f,\u7528\u6237\u62ff\u5230\u94b1, \u4f59\u989d\u51cf\u5c11\u4e86,\u589e\u52a0\u4e86\u4e00\u6761\u4ea4\u6613\u8bb0\u5f55; \u8981\u4e48\u6ca1\u62ff\u5230\u94b1,\u76f8\u5f53\u4e8e\u53d6\u6b3e\u64cd\u4f5c\u6ca1\u6709\u53d1\u751f\u3002<\/p>\n<p>Java\u6709\u4e24\u79cd\u65b9\u5f0f\u5b9e\u73b0\u539f\u5b50\u6027\uff1a<\/p>\n<p>\u4e00\u79cd\u662f\u4f7f\u7528\u9501; \u53e6\u4e00\u79cd\u5229\u7528\u5904\u7406\u5668\u7684CAS(Compare and Swap)\u6307\u4ee4\u3002<\/p>\n<p>\u9501\u5177\u6709\u6392\u5b83\u6027,\u4fdd\u8bc1\u5171\u4eab\u53d8\u91cf\u5728\u67d0\u4e00\u65f6\u523b\u53ea\u80fd\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u3002<\/p>\n<p>CAS\u6307\u4ee4\u76f4\u63a5\u5728\u786c\u4ef6(\u5904\u7406\u5668\u548c\u5185\u5b58)\u5c42\u6b21\u4e0a\u5b9e\u73b0,\u770b\u4f5c\u662f\u786c\u4ef6\u9501\u3002<\/p>\n<h2>\u53ef\u89c1\u6027<\/h2>\n<p>\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d, \u4e00\u4e2a\u7ebf\u7a0b\u5bf9\u67d0\u4e2a\u5171\u4eab\u53d8\u91cf\u8fdb\u884c\u66f4\u65b0\u4e4b\u540e , \u540e\u7eed\u5176\u4ed6\u7684\u7ebf\u7a0b\u53ef\u80fd\u65e0\u6cd5\u7acb\u5373\u8bfb\u5230\u8fd9\u4e2a\u66f4\u65b0\u7684\u7ed3\u679c, \u8fd9\u5c31\u662f\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u7684\u53e6\u5916\u4e00\u79cd\u5f62\u5f0f: \u53ef\u89c1\u6027(visibility)\u3002<\/p>\n<p>\u5982\u679c\u4e00\u4e2a\u7ebf\u7a0b\u5bf9\u5171\u4eab\u53d8\u91cf\u66f4\u65b0\u540e, \u540e\u7eed\u8bbf\u95ee\u8be5\u53d8\u91cf\u7684\u5176\u4ed6\u7ebf\u7a0b\u53ef\u4ee5\u8bfb\u5230\u66f4\u65b0\u7684\u7ed3\u679c, \u79f0\u8fd9\u4e2a\u7ebf\u7a0b\u5bf9\u5171\u4eab\u53d8\u91cf\u7684\u66f4\u65b0\u5bf9\u5176\u4ed6\u7ebf\u7a0b\u53ef\u89c1, \u5426\u5219\u79f0\u8fd9\u4e2a\u7ebf\u7a0b\u5bf9\u5171\u4eab\u53d8\u91cf\u7684\u66f4\u65b0\u5bf9\u5176\u4ed6\u7ebf\u7a0b\u4e0d\u53ef\u89c1\u3002<\/p>\n<p>\u591a\u7ebf\u7a0b\u7a0b\u5e8f\u56e0\u4e3a\u53ef\u89c1\u6027\u95ee\u9898\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5176\u4ed6\u7ebf\u7a0b\u8bfb\u53d6\u5230\u4e86\u65e7\u6570\u636e(\u810f\u6570\u636e)\u3002<\/p>\n<h2>\u6709\u5e8f\u6027<\/h2>\n<p>\u6709\u5e8f\u6027(Ordering)\u662f\u6307\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4e00\u4e2a\u5904\u7406\u5668\u4e0a\u8fd0\u884c\u7684\u4e00\u4e2a\u7ebf\u7a0b\u6240\u6267\u884c\u7684 \u5185\u5b58\u8bbf\u95ee\u64cd\u4f5c\u5728\u53e6\u5916\u4e00\u4e2a\u5904\u7406\u5668\u8fd0\u884c\u7684\u5176\u4ed6\u7ebf\u7a0b\u770b\u6765\u662f\u4e71\u5e8f\u7684(Out of Order)\u3002<\/p>\n<p>\u4e71\u5e8f\u662f\u6307\u5185\u5b58\u8bbf\u95ee\u64cd\u4f5c\u7684\u987a\u5e8f\u770b\u8d77\u6765\u53d1\u751f\u4e86\u53d8\u5316\u3002<\/p>\n<h3>\u91cd\u6392\u5e8f<\/h3>\n<h4>\u5728\u591a\u6838\u5904\u7406\u5668\u7684\u73af\u5883\u4e0b,\u7f16\u5199\u7684\u987a\u5e8f\u7ed3\u6784,\u8fd9\u79cd\u64cd\u4f5c\u6267\u884c\u7684\u987a\u5e8f\u53ef\u80fd\u662f\u6ca1\u6709\u4fdd\u969c\u7684\uff1a<\/h4>\n<p>1.\u7f16\u8bd1\u5668\u53ef\u80fd\u4f1a\u6539\u53d8\u4e24\u4e2a\u64cd\u4f5c\u7684\u5148\u540e\u987a\u5e8f;<\/p>\n<p>2.\u5904\u7406\u5668\u4e5f\u53ef\u80fd\u4e0d\u4f1a\u6309\u7167\u76ee\u6807\u4ee3\u7801\u7684\u987a\u5e8f\u6267\u884c;<\/p>\n<p>\u8fd9\u79cd\u4e00\u4e2a\u5904\u7406\u5668\u4e0a\u6267\u884c\u7684\u591a\u4e2a\u64cd\u4f5c,\u5728\u5176\u4ed6\u5904\u7406\u5668\u6765\u770b\u5b83\u7684\u987a\u5e8f\u4e0e\u76ee\u6807\u4ee3\u7801\u6307\u5b9a\u7684\u987a\u5e8f\u53ef\u80fd\u4e0d\u4e00\u6837,\u8fd9\u79cd\u73b0\u8c61\u79f0\u4e3a\u91cd\u6392\u5e8f<\/p>\n<p>\u91cd\u6392\u5e8f\u662f\u5bf9\u5185\u5b58\u8bbf\u95ee\u6709\u5e8f\u64cd\u4f5c\u7684\u4e00\u79cd\u4f18\u5316,\u53ef\u4ee5\u5728\u4e0d\u5f71\u54cd\u5355\u7ebf\u7a0b\u7a0b\u5e8f\u6b63\u786e\u7684\u60c5\u51b5\u4e0b\u63d0\u5347\u7a0b\u5e8f\u7684\u6027\u80fd.\u4f46\u662f,\u53ef\u80fd\u5bf9\u591a\u7ebf\u7a0b\u7a0b\u5e8f\u7684\u6b63\u786e\u6027\u4ea7\u751f\u5f71\u54cd,\u5373\u53ef\u80fd\u5bfc\u81f4\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u3002<\/p>\n<p><span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">\u91cd\u6392\u5e8f\u4e0e\u53ef\u89c1\u6027<\/span>\u95ee\u9898\u7c7b\u4f3c,\u4e0d\u662f\u5fc5\u7136\u51fa\u73b0\u7684\u3002<\/p>\n<h4>\u4e0e\u5185\u5b58\u64cd\u4f5c\u987a\u5e8f\u6709\u5173\u7684\u51e0\u4e2a\u6982\u5ff5:<\/h4>\n<p>\u6e90\u4ee3\u7801\u987a\u5e8f, \u5c31\u662f\u6e90\u7801\u4e2d\u6307\u5b9a\u7684\u5185\u5b58\u8bbf\u95ee\u987a\u5e8f\u3002<\/p>\n<p>\u7a0b\u5e8f\u987a\u5e8f, \u5904\u7406\u5668\u4e0a\u8fd0\u884c\u7684\u76ee\u6807\u4ee3\u7801\u6240\u6307\u5b9a\u7684\u5185\u5b58\u8bbf\u95ee\u987a\u5e8f\u3002<\/p>\n<p>\u6267\u884c\u987a\u5e8f,\u5185\u5b58\u8bbf\u95ee\u64cd\u4f5c\u5728\u5904\u7406\u5668\u4e0a\u7684\u5b9e\u9645\u6267\u884c\u987a\u5e8f\u3002<\/p>\n<p>\u611f\u77e5\u987a\u5e8f,\u7ed9\u5b9a\u5904\u7406\u5668\u6240\u611f\u77e5\u5230\u7684\u8be5\u5904\u7406\u5668\u53ca\u5176\u4ed6\u5904\u7406\u5668\u7684\u5185\u5b58\u8bbf\u95ee\u64cd\u4f5c\u7684\u987a\u5e8f\u3002<\/p>\n<h4>\u53ef\u4ee5\u628a\u91cd\u6392\u5e8f\u5206\u4e3a\u6307\u4ee4\u91cd\u6392\u5e8f\u4e0e\u5b58\u50a8\u5b50\u7cfb\u7edf\u91cd\u6392\u5e8f\u4e24\u79cd\uff1a<\/h4>\n<p>1.\u6307\u4ee4\u91cd\u6392\u5e8f\u4e3b\u8981\u662f\u7531JIT\u7f16\u8bd1\u5668,\u5904\u7406\u5668\u5f15\u8d77\u7684, \u6307\u7a0b\u5e8f\u987a\u5e8f\u4e0e\u6267\u884c\u987a\u5e8f\u4e0d\u4e00\u6837\u3002<\/p>\n<p>2.\u5b58\u50a8\u5b50\u7cfb\u7edf\u91cd\u6392\u5e8f\u662f\u7531\u9ad8\u901f\u7f13\u5b58,\u5199\u7f13\u51b2\u5668\u5f15\u8d77\u7684, \u611f\u77e5\u987a\u5e8f\u4e0e\u6267\u884c\u987a\u5e8f\u4e0d\u4e00\u81f4\u3002<\/p>\n<h3>\u6307\u4ee4\u91cd\u6392\u5e8f<\/h3>\n<p>\u5728\u6e90\u7801\u987a\u5e8f\u4e0e\u7a0b\u5e8f\u987a\u5e8f\u4e0d\u4e00\u81f4,\u6216\u8005 \u7a0b\u5e8f\u987a\u5e8f\u4e0e\u6267\u884c\u987a\u5e8f\u4e0d\u4e00\u81f4\u7684\u60c5\u51b5\u4e0b,\u6211\u4eec\u5c31\u8bf4\u53d1\u751f\u4e86\u6307\u4ee4\u91cd\u6392\u5e8f(Instruction Reorder)\u3002<\/p>\n<p>\u6307\u4ee4\u91cd\u6392\u662f\u4e00\u79cd\u52a8\u4f5c,\u786e\u5b9e\u5bf9\u6307\u4ee4\u7684\u987a\u5e8f\u505a\u4e86\u8c03\u6574, \u91cd\u6392\u5e8f\u7684\u5bf9\u8c61\u6307\u4ee4\u3002<\/p>\n<p>javac\u7f16\u8bd1\u5668\u4e00\u822c\u4e0d\u4f1a\u6267\u884c\u6307\u4ee4\u91cd\u6392\u5e8f, \u800cJIT\u7f16\u8bd1\u5668\u53ef\u80fd\u6267\u884c\u6307\u4ee4\u91cd\u6392\u5e8f\u3002<\/p>\n<p>\u5904\u7406\u5668\u4e5f\u53ef\u80fd\u6267\u884c\u6307\u4ee4\u91cd\u6392\u5e8f, \u4f7f\u5f97\u6267\u884c\u987a\u5e8f\u4e0e\u7a0b\u5e8f\u987a\u5e8f\u4e0d\u4e00\u81f4\u3002<\/p>\n<p>\u6307\u4ee4\u91cd\u6392\u4e0d\u4f1a\u5bf9\u5355\u7ebf\u7a0b\u7a0b\u5e8f\u7684\u7ed3\u679c\u6b63\u786e\u6027\u4ea7\u751f\u5f71\u54cd,\u53ef\u80fd\u5bfc\u81f4\u591a\u7ebf\u7a0b\u7a0b\u5e8f\u51fa\u73b0\u975e\u9884\u671f\u7684\u7ed3\u679c\u3002<\/p>\n<h3>\u5b58\u50a8\u5b50\u7cfb\u7edf\u91cd\u6392\u5e8f<\/h3>\n<p>\u5b58\u50a8\u5b50\u7cfb\u7edf\u662f\u6307\u5199\u7f13\u51b2\u5668\u4e0e\u9ad8\u901f\u7f13\u5b58\u3002<\/p>\n<p>\u9ad8\u901f\u7f13\u5b58(Cache)\u662fCPU\u4e2d\u4e3a\u4e86\u5339\u914d\u4e0e\u4e3b\u5185\u5b58\u5904\u7406\u901f\u5ea6\u4e0d\u5339\u914d\u800c\u8bbe\u8ba1\u7684\u4e00\u4e2a\u9ad8\u901f\u7f13\u5b58\u3002<\/p>\n<p>\u5199\u7f13\u51b2\u5668(Store buffer, Write buffer)\u7528\u6765\u63d0\u9ad8\u5199\u9ad8\u901f\u7f13\u5b58\u64cd\u4f5c\u7684\u6548\u7387\u3002<\/p>\n<p>\u5373\u4f7f\u5904\u7406\u5668\u4e25\u683c\u6309\u7167\u7a0b\u5e8f\u987a\u5e8f\u6267\u884c\u4e24\u4e2a\u5185\u5b58\u8bbf\u95ee\u64cd\u4f5c,\u5728\u5b58\u50a8\u5b50\u7cfb\u7edf\u7684\u4f5c\u7528\u4e0b, \u5176\u4ed6\u5904\u7406\u5668\u5bf9\u8fd9\u4e24\u4e2a\u64cd\u4f5c\u7684\u611f\u77e5\u987a\u5e8f\u4e0e\u7a0b\u5e8f\u987a\u5e8f\u4e0d\u4e00\u81f4,\u5373\u8fd9\u4e24\u4e2a\u64cd\u4f5c\u7684\u987a\u5e8f\u987a\u5e8f\u770b\u8d77\u6765\u50cf\u662f\u53d1\u751f\u4e86\u53d8\u5316, \u8fd9\u79cd\u73b0\u8c61\u79f0\u4e3a\u5b58\u50a8\u5b50\u7cfb\u7edf\u91cd\u6392\u5e8f\u3002<\/p>\n<p>\u5b58\u50a8\u5b50\u7cfb\u7edf\u91cd\u6392\u5e8f\u5e76\u6ca1\u6709\u771f\u6b63\u7684\u5bf9\u6307\u4ee4\u6267\u884c\u987a\u5e8f\u8fdb\u884c\u8c03\u6574,\u800c\u662f\u9020\u6210\u4e00\u79cd\u6307\u4ee4\u6267\u884c\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u73b0\u8c61\u3002<\/p>\n<p>\u5b58\u50a8\u5b50\u7cfb\u7edf\u91cd\u6392\u5e8f\u5bf9\u8c61\u662f\u5185\u5b58\u64cd\u4f5c\u7684\u7ed3\u679c\u3002<\/p>\n<h3>\u4fdd\u8bc1\u5185\u5b58\u8bbf\u95ee\u7684\u987a\u5e8f\u6027<\/h3>\n<p>\u53ef\u4ee5\u4f7f\u7528<code>volatile<\/code>\u5173\u952e\u5b57, <code>synchronized<\/code>\u5173\u952e\u5b57\u5b9e\u73b0\u6709\u5e8f\u6027\u3002<\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u5185\u5b58\u6a21\u578b<\/h1>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/typoraImg\/1588150327@aca685597a6a6ec8dfa91d41819febce.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/typoraImg\/1588150327@aca685597a6a6ec8dfa91d41819febce.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/typoraImg\/1588150337@c2c71bfa307489bf902104409b17dbc0.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/typoraImg\/1588150337@c2c71bfa307489bf902104409b17dbc0.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u540c\u6b65\u673a\u5236\u7b80\u4ecb<\/h1>\n<p>\u7ebf\u7a0b\u540c\u6b65\u673a\u5236\u662f\u4e00\u5957\u7528\u4e8e\u534f\u8c03\u7ebf\u7a0b\u4e4b\u95f4\u7684\u6570\u636e\u8bbf\u95ee\u7684\u673a\u5236.\u8be5\u673a\u5236\u53ef\u4ee5\u4fdd\u969c\u7ebf\u7a0b\u5b89\u5168\u3002<\/p>\n<p>Java\u5e73\u53f0\u63d0\u4f9b\u7684\u7ebf\u7a0b\u540c\u6b65\u673a\u5236\u5305\u62ec: \u9501, volatile\u5173\u952e\u5b57, final\u5173\u952e\u5b57,static\u5173\u952e\u5b57,\u4ee5\u53ca\u76f8\u5173\u7684API,\u5982<code>Object.wait()<\/code>\/<code>Object.notify()<\/code>\u7b49\u3002<\/p>\n<p>\u6bcf\u4e00\u4e2a\u670d\u52a1\u8fdb\u7a0b\u7684\u8fd0\u884c\uff0c\u90fd\u5305\u542b\u82e5\u5e72\u8fdb\u7a0b\uff08Thread\uff09\uff0c\u7ebf\u7a0b\u662f\u8c03\u5ea6\u7684\u57fa\u672c\u5355\u4f4d\uff0c\u8fdb\u7a0b\u5219\u662f\u8d44\u6e90\u62e5\u6709\u7684\u57fa\u672c\u5355\u4f4d\u3002<\/p>\n<p>\u7ebf\u7a0b\u6709\u81ea\u5df1\u7684\u79c1\u6709\u6570\u636e\uff0c\u6bd4\u5982\u6808\u548c\u5bc4\u5b58\u5668\uff0c\u540c\u65f6\u4e0e\u5176\u5b83\u7ebf\u7a0b\u5171\u4eab\u76f8\u540c\u7684\u865a\u62df\u5185\u5b58\u548c\u5168\u5c40\u53d8\u91cf\u7b49\u8d44\u6e90\uff0c\u5f53\u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u8bfb\u5199\u540c\u4e00\u4efd\u5171\u4eab\u8d44\u6e90\u7684\u65f6\u5019\uff0c\u4f1a\u5f15\u8d77\u51b2\u7a81\uff0c\u8fd9\u65f6\u5019\u5c31\u9700\u8981\u5f15\u5165\u7ebf\u7a0b\u540c\u6b65\u673a\u5236\u4f7f\u5404\u4e2a\u7ebf\u7a0b\u6392\u961f\u4e00\u4e2a\u4e00\u4e2a\u7684\u5bf9\u5171\u4eab\u8d44\u6e90\u8fdb\u884c\u64cd\u4f5c\uff0c\u800c\u4e0d\u662f\u540c\u65f6\u8fdb\u884c\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/typoraImg\/1589003255@e57329f35adf3eaa39ed2a3e2eaf105d.jpg'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/typoraImg\/1589003255@e57329f35adf3eaa39ed2a3e2eaf105d.jpg\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<ol>\n<li>\u7ebf\u7a0b\u540c\u6b65\u5176\u5b9e\u5b9e\u73b0\u7684\u662f\u7ebf\u7a0b\u6392\u961f<\/li>\n<li>\u9632\u6b62\u7ebf\u7a0b\u540c\u6b65\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\u9020\u6210\u51b2\u7a81<\/li>\n<li>\u53d8\u91cf\u9700\u8981\u540c\u6b65\uff0c\u5e38\u91cf\u4e0d\u9700\u8981\uff08\u5e38\u91cf\u5b58\u653e\u4e8e\u65b9\u6cd5\u533a\uff09\u3002<\/li>\n<li>\u591a\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\u7684\u4ee3\u7801\u6709\u53ef\u80fd\u662f\u540c\u4e00\u4efd\u4ee3\u7801\uff0c\u4e5f\u6709\u53ef\u80fd\u662f\u4e0d\u540c\u7684\u4ee3\u7801\uff1b\u65e0\u8bba\u662f\u5426\u6267\u884c\u540c\u4e00\u4efd\u4ee3\u7801\uff0c\u53ea\u8981\u8fd9\u4e9b\u7ebf\u7a0b\u7684\u4ee3\u7801\u8bbf\u95ee\u540c\u4e00\u4efd\u53ef\u53d8\u7684\u5171\u4eab\u8d44\u6e90\uff0c\u8fd9\u4e9b\u7ebf\u7a0b\u4e4b\u95f4\u5c31\u9700\u8981\u540c\u6b65\u3002<\/li>\n<\/ol>\n<h3>\u7ebf\u7a0b\u540c\u6b65\u597d\u5904\uff1a<\/h3>\n<p>\u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u8bbf\u95ee\u5171\u4eab\u6570\u636e\u65f6\uff0c\u9632\u6b62\u6570\u636e\u88ab\u635f\u574f\u3002<\/p>\n<h3>\u7ebf\u7a0b\u540c\u6b65\u5e26\u6765\u7684\u95ee\u9898\uff1a<\/h3>\n<p>1\u3001\u5b9e\u73b0\u6bd4\u8f83\u7e41\u7410\uff0c\u800c\u4e14\u5bb9\u6613\u51fa\u9519\u3002<\/p>\n<p>\u5fc5\u987b\u5bf9\u591a\u4e2a\u7ebf\u7a0b\u53ef\u80fd\u540c\u65f6\u8bbf\u95ee\u7684\u6240\u6709\u6570\u636e\uff0c\u7528\u989d\u5916\u7684\u4ee3\u7801\u5305\u56f4\u8d77\u6765\uff0c\u4ee5\u83b7\u5f97\u548c\u91ca\u653e\u4e00\u4e2a\u540c\u6b65\u9501\u3002\u8fd9\u9700\u8981\u7531\u7a0b\u5e8f\u5458\u6765\u4fdd\u8bc1\u6ca1\u6709\u9057\u6f0f\uff0c\u5bf9\u591a\u7ebf\u7a0b\u5171\u4eab\u7684\u6570\u636e\u7684\u52a0\u9501\u5de5\u4f5c\u3002\u5e76\u4e14\uff0c\u5728\u7a0b\u5e8f\u5b8c\u6210\u65f6\uff0c\u9700\u8981\u8fdb\u884c\u538b\u529b\u6d4b\u8bd5\u4ee5\u4fdd\u8bc1\u591a\u4e2a\u7ebf\u7a0b\u5e76\u53d1\u65f6\uff0c\u7ed3\u679c\u5982\u9884\u671f\u3002<\/p>\n<p>2\u3001\u5b83\u4f1a\u635f\u5bb3\u6027\u80fd\u3002<\/p>\n<p>\u83b7\u53d6\u548c\u91ca\u653e\u4e00\u4e2a\u9501\u662f\u9700\u8981\u65f6\u95f4\u7684\u3002\u56e0\u4e3a\u9700\u8981\u989d\u5916\u7684\u8c03\u7528\u4e00\u4e9b\u65b9\u6cd5\uff0c\u5e76\u4e14\u9700\u8981\u534f\u8c03\u8c03\u5ea6\u4e0b\u4e00\u4e2a\u83b7\u5f97\u9501\u7684\u7ebf\u7a0b\u3002<\/p>\n<p>3\u3001\u6bcf\u6b21\u53ea\u80fd\u5141\u8bb8\u4e00\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u8d44\u6e90\u3002\u8fd9\u662f\u9501\u7684\u5168\u90e8\u610f\u4e49\u6240\u5728\uff0c\u4f46\u4e5f\u662f\u95ee\u9898\u6240\u5728\uff0c\u56e0\u4e3a\u963b\u585e\u4e00\u4e2a\u7ebf\u7a0b\u53ef\u80fd\u4f1a\u9020\u6210\u66f4\u591a\u7684\u7ebf\u7a0b\u88ab\u521b\u5efa\u3002<\/p>\n<h3>\u7ebf\u7a0b\u540c\u6b65\u5efa\u8bae\uff1a<\/h3>\n<p>1\u3001\u7ebf\u7a0b\u540c\u6b65\u5e76\u4e0d\u662f\u4e00\u4ef6\u597d\u4e8b\uff0c\u8bbe\u8ba1\u81ea\u5df1\u7684\u5e94\u7528\u7a0b\u5e8f\u662f\u5e94\u914c\u60c5\u8003\u8651\uff0c\u5c3d\u91cf\u907f\u514d\u7ebf\u7a0b\u540c\u6b65\u3002<\/p>\n<p>2\u3001\u907f\u514d\u4f7f\u7528\u4e00\u4e9b\u5171\u4eab\u6570\u636e\uff0c\u5982\u9759\u6001\u5b57\u6bb5\u3002\uff08\u5982\u679c\u6709\u591a\u7ebf\u7a0b\u540c\u65f6\u8bfb\u5199\u8fd9\u4e2a\u9759\u6001\u5b57\u6bb5\u5c31\u6709\u95ee\u9898\uff09<\/p>\n<p>3\u3001\u8bd5\u7740\u7528\u503c\u7c7b\u578b\uff0c\u56e0\u4e3a\u503c\u7c7b\u578b\u603b\u662f\u4f1a\u88ab\u590d\u5236\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u64cd\u4f5c\u7684\u90fd\u662f\u81ea\u5df1\u7684\u90a3\u4e2a\u526f\u672c\u3002<\/p>\n<p>4\u3001\u591a\u7ebf\u7a0b\u5bf9\u5171\u4eab\u6570\u636e\u8fdb\u884c\u53ea\u8bfb\u8bbf\u95ee\u662f\u6ca1\u6709\u4efb\u4f55\u95ee\u9898\u7684\u3002<\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u9501<\/h1>\n<p>\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u7684\u4ea7\u751f\u524d\u63d0\u662f\u591a\u4e2a\u7ebf\u7a0b\u5e76\u53d1\u8bbf\u95ee\u5171\u4eab\u6570\u636e\u3002<\/p>\n<p>\u5c06\u591a\u4e2a\u7ebf\u7a0b\u5bf9\u5171\u4eab\u6570\u636e\u7684\u5e76\u53d1\u8bbf\u95ee\u8f6c\u6362\u4e3a\u4e32\u884c\u8bbf\u95ee,\u5373\u4e00\u4e2a\u5171\u4eab\u6570\u636e\u4e00\u6b21\u53ea\u80fd\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u8bbf\u95ee.\u9501\u5c31\u662f\u590d\u7528\u8fd9\u79cd\u601d\u8def\u6765\u4fdd\u969c\u7ebf\u7a0b\u5b89\u5168\u7684\u3002<\/p>\n<p>\u9501(Lock)\u53ef\u4ee5\u7406\u89e3\u4e3a\u5bf9\u5171\u4eab\u6570\u636e\u8fdb\u884c\u4fdd\u62a4\u7684\u4e00\u4e2a\u8bb8\u53ef\u8bc1. \u5bf9\u4e8e\u540c\u4e00\u4e2a\u8bb8\u53ef\u8bc1\u4fdd\u62a4\u7684\u5171\u4eab\u6570\u636e\u6765\u8bf4,\u4efb\u4f55\u7ebf\u7a0b\u60f3\u8981\u8bbf\u95ee\u8fd9\u4e9b\u5171\u4eab\u6570\u636e\u5fc5\u987b\u5148\u6301\u6709\u8be5\u8bb8\u53ef\u8bc1. \u4e00\u4e2a\u7ebf\u7a0b\u53ea\u6709\u5728\u6301\u6709\u8bb8\u53ef\u8bc1\u7684\u60c5\u51b5\u4e0b\u624d\u80fd\u5bf9\u8fd9\u4e9b\u5171\u4eab\u6570\u636e\u8fdb\u884c\u8bbf\u95ee; \u5e76\u4e14\u4e00\u4e2a\u8bb8\u53ef\u8bc1\u4e00\u6b21\u53ea\u80fd\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u6301\u6709; \u8bb8\u53ef\u8bc1\u7ebf\u7a0b\u5728\u7ed3\u675f\u5bf9\u5171\u4eab\u6570\u636e\u7684\u8bbf\u95ee\u540e\u5fc5\u987b\u91ca\u653e\u5176\u6301\u6709\u7684\u8bb8\u53ef\u8bc1\u3002<\/p>\n<p>\u4e00\u7ebf\u7a0b\u5728\u8bbf\u95ee\u5171\u4eab\u6570\u636e\u524d\u5fc5\u987b\u5148\u83b7\u5f97\u9501; \u83b7\u5f97\u9501\u7684\u7ebf\u7a0b\u79f0\u4e3a\u9501\u7684\u6301\u6709\u7ebf\u7a0b; \u4e00\u4e2a\u9501\u4e00\u6b21\u53ea\u80fd\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u6301\u6709. \u9501\u7684\u6301\u6709\u7ebf\u7a0b\u5728\u83b7\u5f97\u9501\u4e4b\u540e \u548c\u91ca\u653e\u9501\u4e4b\u524d\u8fd9\u6bb5\u65f6\u95f4\u6240\u6267\u884c\u7684\u4ee3\u7801\u79f0\u4e3a\u4e34\u754c\u533a(Critical Section)\u3002<\/p>\n<p>\u9501\u5177\u6709<span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">\u6392\u4ed6\u6027(Exclusive)<\/span>, \u5373\u4e00\u4e2a\u9501\u4e00\u6b21\u53ea\u80fd\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u6301\u6709.\u8fd9\u79cd\u9501\u79f0\u4e3a<span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">\u6392\u5b83\u9501\u6216\u4e92\u65a5\u9501(Mutex)<\/span>\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/typoraImg\/1588150459@6176b92a3663d18637f2ba180ef9ca61.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/typoraImg\/1588150459@6176b92a3663d18637f2ba180ef9ca61.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<p>JVM\u628a\u9501\u5206\u4e3a\u5185\u90e8\u9501\u548c\u663e\u793a\u9501\u4e24\u79cd. \u5185\u90e8\u9501\u901a\u8fc7<code>synchronized<\/code>\u5173\u952e\u5b57\u5b9e\u73b0; \u663e\u793a\u9501\u901a\u8fc7<code>java.concurrent.locks.Lock<\/code>\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b\u5b9e\u73b0\u7684\u3002<\/p>\n<h2>Java\u7ebf\u7a0b\u9501\u7684\u4f5c\u7528<\/h2>\n<p>\u9501\u53ef\u4ee5\u5b9e\u73b0\u5bf9\u5171\u4eab\u6570\u636e\u7684\u5b89\u5168\u8bbf\u95ee. \u4fdd\u969c\u7ebf\u7a0b\u7684\u539f\u5b50\u6027,\u53ef\u89c1\u6027\u4e0e\u6709\u5e8f\u6027\u3002<\/p>\n<p>\u9501\u662f\u901a\u8fc7\u4e92\u65a5\u4fdd\u969c\u539f\u5b50\u6027. \u4e00\u4e2a\u9501\u53ea\u80fd\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u6301\u6709, \u8fd9\u5c31\u4fdd\u8bc1\u4e34\u754c\u533a\u7684\u4ee3\u7801\u4e00\u6b21\u53ea\u80fd\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u6267\u884c.\u4f7f\u5f97\u4e34\u754c\u533a\u4ee3\u7801\u6240\u6267\u884c\u7684\u64cd\u4f5c\u81ea\u7136\u800c\u7136\u7684\u5177\u6709\u4e0d\u53ef\u5206\u5272\u7684\u7279\u6027,\u5373\u5177\u5907\u4e86<code>\u539f\u5b50\u6027<\/code>\u3002<\/p>\n<p>\u53ef\u89c1\u6027\u7684\u4fdd\u969c\u662f\u901a\u8fc7\u5199\u7ebf\u7a0b\u51b2\u5237\u5904\u7406\u5668\u7684\u7f13\u5b58\u548c\u8bfb\u7ebf\u7a0b\u5237\u65b0\u5904\u7406\u5668\u7f13\u5b58\u8fd9\u4e24\u4e2a\u52a8\u4f5c\u5b9e\u73b0\u7684. \u5728java\u5e73\u53f0\u4e2d,\u9501\u7684\u83b7\u5f97\u9690\u542b\u7740\u5237\u65b0\u5904\u7406\u5668\u7f13\u5b58\u7684\u52a8\u4f5c, \u9501\u7684\u91ca\u653e\u9690\u542b\u7740\u51b2\u5237\u5904\u7406\u5668\u7f13\u5b58\u7684\u52a8\u4f5c\u3002<\/p>\n<p>\u9501\u80fd\u591f\u4fdd\u969c\u6709\u5e8f\u6027.\u5199\u7ebf\u7a0b\u5728\u4e34\u754c\u533a\u6240\u6267\u884c\u7684\u5728\u8bfb\u7ebf\u7a0b\u6240\u6267\u884c\u7684\u4e34\u754c\u533a\u770b\u6765\u50cf\u662f\u5b8c\u5168\u6309\u7167\u6e90\u7801\u987a\u5e8f\u6267\u884c\u7684\u3002<\/p>\n<p>\u6ce8\u610f:<\/p>\n<p>\u4f7f\u7528\u9501\u4fdd\u969c\u7ebf\u7a0b\u7684\u5b89\u5168\u6027,\u5fc5\u987b\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6:<\/p>\n<ul>\n<li>\u8fd9\u4e9b\u7ebf\u7a0b\u5728\u8bbf\u95ee\u5171\u4eab\u6570\u636e\u65f6\u5fc5\u987b\u4f7f\u7528\u540c\u4e00\u4e2a\u9501\u3002<\/li>\n<li>\u5373\u4f7f\u662f\u8bfb\u53d6\u5171\u4eab\u6570\u636e\u7684\u7ebf\u7a0b\u4e5f\u9700\u8981\u4f7f\u7528\u540c\u6b65\u9501\u3002<\/li>\n<\/ul>\n<h2>\u7ebf\u7a0b\u9501\u76f8\u5173\u7684\u6982\u5ff5<\/h2>\n<h3>\u53ef\u91cd\u5165\u6027<\/h3>\n<p>\u53ef\u91cd\u5165\u6027(Reentrancy)\u63cf\u8ff0\u8fd9\u6837\u4e00\u4e2a\u95ee\u9898: \u4e00\u4e2a\u7ebf\u7a0b\u6301\u6709\u8be5\u9501\u7684\u65f6\u5019\u80fd\u518d\u6b21(\u591a\u6b21)\u7533\u8bf7\u8be5\u9501\u3002<\/p>\n<p>\u5982\u679c\u4e00\u4e2a\u7ebf\u7a0b\u6301\u6709\u4e00\u4e2a\u9501\u7684\u65f6\u5019\u8fd8\u80fd\u591f\u7ee7\u7eed\u6210\u529f\u7533\u8bf7\u8be5\u9501,\u79f0\u8be5\u9501\u662f\u53ef\u91cd\u5165\u7684, \u5426\u5219\u5c31\u79f0\u8be5\u9501\u4e3a\u4e0d\u53ef\u91cd\u5165\u7684\u3002<\/p>\n<h3>\u9501\u7684\u4e89\u7528\u4e0e\u8c03\u5ea6<\/h3>\n<p>Java\u5e73\u53f0\u4e2d\u5185\u90e8\u9501\u5c5e\u4e8e\u975e\u516c\u5e73\u9501, \u663e\u793aLock\u9501\u65e2\u652f\u6301\u516c\u5e73\u9501\u53c8\u652f\u6301\u975e\u516c\u5e73\u9501\u3002<\/p>\n<h3>\u9501\u7684\u7c92\u5ea6<\/h3>\n<p>\u4e00\u4e2a\u9501\u53ef\u4ee5\u4fdd\u62a4\u7684\u5171\u4eab\u6570\u636e\u7684\u6570\u91cf\u5927\u5c0f\u79f0\u4e3a\u9501\u7684\u7c92\u5ea6\u3002<\/p>\n<p>\u9501\u4fdd\u62a4\u5171\u4eab\u6570\u636e\u91cf\u5927,\u79f0\u8be5\u9501\u7684\u7c92\u5ea6\u7c97, \u5426\u5219\u5c31\u79f0\u8be5\u9501\u7684\u7c92\u5ea6\u7ec6\u3002<\/p>\n<p>\u9501\u7684\u7c92\u5ea6\u8fc7\u7c97\u4f1a\u5bfc\u81f4\u7ebf\u7a0b\u5728\u7533\u8bf7\u9501\u65f6\u4f1a\u8fdb\u884c\u4e0d\u5fc5\u8981\u7684\u7b49\u5f85.\u9501\u7684\u7c92\u5ea6\u8fc7\u7ec6\u4f1a\u589e\u52a0\u9501\u8c03\u5ea6\u7684\u5f00\u9500\u3002<\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u540c\u6b65\u4ee3\u7801\u5757Synchronized<\/h1>\n<p>Java\u4e2d\u7684\u6bcf\u4e2a\u5bf9\u8c61\u90fd\u6709\u4e00\u4e2a\u4e0e\u4e4b\u5173\u8054\u7684\u5185\u90e8\u9501(Intrinsic lock). \u8fd9\u79cd\u9501\u4e5f\u79f0\u4e3a\u76d1\u89c6\u5668(Monitor), \u8fd9\u79cd\u5185\u90e8\u9501\u662f\u4e00\u79cd\u6392\u4ed6\u9501,\u53ef\u4ee5\u4fdd\u969c\u539f\u5b50\u6027,\u53ef\u89c1\u6027\u4e0e\u6709\u5e8f\u6027\u3002<\/p>\n<p>\u5185\u90e8\u9501\u662f\u901a\u8fc7<code>synchronized<\/code>\u5173\u952e\u5b57\u5b9e\u73b0\u7684.<code>synchronized<\/code>\u5173\u952e\u5b57\u4fee\u9970\u4ee3\u7801\u5757,\u4fee\u9970\u8be5\u65b9\u6cd5\u3002<\/p>\n<p>\u4fee\u9970\u4ee3\u7801\u5757\u7684\u8bed\u6cd5:<\/p>\n<pre><code class=\"language-java line-numbers\">synchronized( \u5bf9\u8c61\u9501 ) {\n   \u540c\u6b65\u4ee3\u7801\u5757,\u53ef\u4ee5\u5728\u540c\u6b65\u4ee3\u7801\u5757\u4e2d\u8bbf\u95ee\u5171\u4eab\u6570\u636e\n}\n<\/code><\/pre>\n<p>\u4fee\u9970\u5b9e\u4f8b\u65b9\u6cd5\u5c31\u79f0\u4e3a<span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">\u540c\u6b65\u5b9e\u4f8b\u65b9\u6cd5<\/span><\/p>\n<p>\u4fee\u9970\u9759\u6001\u65b9\u6cd5\u79f0\u79f0\u4e3a<span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">\u540c\u6b65\u9759\u6001\u65b9\u6cd5<\/span><\/p>\n<h3>synchronized\u540c\u6b65\u4ee3\u7801\u5757\u5b9e\u4f8b\uff1a<\/h3>\n<h4>this\u9501\u5bf9\u8c61<\/h4>\n<pre><code class=\"language-java line-numbers\">public class Test01 {\n\n    public void mm(){\n        synchronized (this){\n            for (int i=0;i&lt;=100;i++){\n                System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n            }\n        }\n    }\n}\n    ---\n    @Test\n    public void Test10CurrentThread(){\n        \/\/\u521b\u5efa\u4e24\u4e2a\u7ebf\u7a0b,\u5206\u522b\u8c03\u7528mm()\u65b9\u6cd5\n        Test01 t1 = new Test01();\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft1\u5bf9\u8c61\n            }\n        }).start();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft1\u5bf9\u8c61\n            }\n        }).start();\n\n    }\n<\/code><\/pre>\n<p>\u5982\u679c\u7ebf\u7a0b\u7684\u9501\u4e0d\u540c, \u4e0d\u80fd\u5b9e\u73b0\u540c\u6b65,\u60f3\u8981\u540c\u6b65\u5fc5\u987b\u4f7f\u7528\u540c\u4e00\u4e2a\u9501\u5bf9\u8c61<\/p>\n<pre><code class=\"language-java line-numbers\">    @Test\n    public void Test11CurrentThread(){\n        \/\/\u521b\u5efa\u4e24\u4e2a\u7ebf\u7a0b,\u5206\u522b\u8c03\u7528mm()\u65b9\u6cd5\n        Test01 t1 = new Test01();\n        Test01 t2 = new Test01();\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft1\u5bf9\u8c61\n            }\n        }).start();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t2.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft2\u5bf9\u8c61\n            }\n        }).start();\n    }\n<\/code><\/pre>\n<h4>\u4f7f\u7528\u4e00\u4e2a\u5e38\u91cf\u5bf9\u8c61\u4f5c\u4e3a\u9501\u5bf9\u8c61<\/h4>\n<pre><code class=\"language-java line-numbers\">public class Test01 {\n\n    \/\/\u5b9a\u4e49\u4e00\u4e2a\u5e38\u91cf\n    public static final  Object obj = new Object();\n\n    public void mm(){\n        synchronized (obj){\n            for (int i=0;i&lt;=100;i++){\n                System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n            }\n        }\n    }\n}\n\n    @Test\n    public void Test12CurrentThread(){\n        \/\/\u521b\u5efa\u4e24\u4e2a\u7ebf\u7a0b,\u5206\u522b\u8c03\u7528mm()\u65b9\u6cd5\n        Test01 t1 = new Test01();\n        Test01 t2 = new Test01();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft1\u5bf9\u8c61\n            }\n        }).start();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t2.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft2\u5bf9\u8c61\n            }\n        }).start();\n    }\n<\/code><\/pre>\n<h4>\u4f7f\u7528\u4e00\u4e2a\u5e38\u91cf\u5bf9\u8c61\u4f5c\u4e3a\u9501\u5bf9\u8c61,\u4e0d\u540c\u65b9\u6cd5\u4e2d \u7684\u540c\u6b65\u4ee3\u7801\u5757\u4e5f\u53ef\u4ee5\u540c\u6b65<\/h4>\n<pre><code class=\"language-java line-numbers\">public class Test01 {\n\n    \/\/\u5b9a\u4e49\u4e00\u4e2a\u5e38\u91cf\n    public static final  Object obj = new Object();\n\n    \/\/\u65b9\u6cd51\n    public void mm(){\n        \/\/\u4f7f\u7528\u4e00\u4e2a\u5e38\u91cf\u5bf9\u8c61\u4f5c\u4e3a\u9501\u5bf9\u8c61\n        synchronized (obj){\n            for (int i=0;i&lt;=100;i++){\n                System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n            }\n        }\n    }\n    \/\/\u65b9\u6cd52\n    public void mmm(){\n        \/\/\u4f7f\u7528\u4e00\u4e2a\u5e38\u91cf\u5bf9\u8c61\u4f5c\u4e3a\u9501\u5bf9\u8c61\n        synchronized (obj){\n            for (int i=0;i&lt;=100;i++){\n                System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n            }\n        }\n    }\n}\n\n    @Test\n    public void Test13CurrentThread(){\n        \/\/\u521b\u5efa\u4e24\u4e2a\u7ebf\u7a0b,\u5206\u522b\u8c03\u7528mm()\u65b9\u6cd5\n        Test01 t1 = new Test01();\n        Test01 t2 = new Test01();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft1\u5bf9\u8c61\n            }\n        }).start();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t2.mmm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft2\u5bf9\u8c61\n            }\n        }).start();\n    }\n<\/code><\/pre>\n<h1>Java\u591a\u7ebf\u7a0b\u540c\u6b65\u65b9\u6cd5<\/h1>\n<h3>synchronized\u540c\u6b65\u5b9e\u4f8b\u65b9\u6cd5<\/h3>\n<h4>\u9ed8\u8ba4\u7684\u9501\u5bf9\u8c61\u662fthis\u5bf9\u8c61<\/h4>\n<pre><code class=\"language-java line-numbers\">public class Test02 {\n    public void mm(){\n        synchronized (this){\n            for (int i = 1; i &lt;= 100; i++){\n                System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n            }\n        }\n    }\n\n    public synchronized void mmm (){\n        for (int i = 1; i &lt;= 100; i++){\n            System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n        }\n    }\n}\n\n    @Test\n    public void Test14CurrentThread(){\n        \/\/\u521b\u5efa\u4e24\u4e2a\u7ebf\u7a0b,\u5206\u522b\u8c03\u7528mm()\u65b9\u6cd5\n        Test02 t1 = new Test02();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft1\u5bf9\u8c61\n            }\n        }).start();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n\/\/                t1.mmm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u4e5f\u662fobj\u5bf9\u8c61, \u53ef\u4ee5\u540c\u6b65\n                new Test02().mmm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u662f\u521a\u521anew\u521b\u5efa\u7684\u4e00\u4e2a\u65b0\u5bf9\u8c61,\u4e0d\u662f\u540c\u4e00\u4e2a\u9501\u5bf9\u8c61\u4e0d\u80fd\u540c\u6b65\n            }\n        }).start();\n    }\n<\/code><\/pre>\n<h3>synchronized\u540c\u6b65\u9759\u6001\u65b9\u6cd5<\/h3>\n<p>\u9ed8\u8ba4\u7684\u9501\u5bf9\u8c61\u662f\u5f53\u524d\u7c7b\u7684\u8fd0\u884c\u65f6\u7c7b\u5bf9\u8c61, <code>Test03.class<\/code>, \u6709\u4eba\u79f0\u5b83\u4e3a\u7c7b\u9501<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test02 {\n    public void mm(){\n        synchronized (this){\n            for (int i = 1; i &lt;= 100; i++){\n                System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n            }\n        }\n    }\n\n    public synchronized void mmm (){\n        for (int i = 1; i &lt;= 100; i++){\n            System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n        }\n    }\n}\n----------\n    @Test\n    public void Test14CurrentThread(){\n        \/\/\u521b\u5efa\u4e24\u4e2a\u7ebf\u7a0b,\u5206\u522b\u8c03\u7528mm()\u65b9\u6cd5\n        Test02 t1 = new Test02();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.mm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u5c31\u662ft1\u5bf9\u8c61\n            }\n        }).start();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n\/\/                t1.mmm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u4e5f\u662fobj\u5bf9\u8c61, \u53ef\u4ee5\u540c\u6b65\n                new Test02().mmm();\/\/\u4f7f\u7528\u7684\u9501\u5bf9\u8c61this\u662f\u521a\u521anew\u521b\u5efa\u7684\u4e00\u4e2a\u65b0\u5bf9\u8c61,\u4e0d\u662f\u540c\u4e00\u4e2a\u9501\u5bf9\u8c61\u4e0d\u80fd\u540c\u6b65\n            }\n        }).start();\n    }\n<\/code><\/pre>\n<p>\u540c\u6b65\u65b9\u6cd5\u4e0e\u540c\u6b65\u4ee3\u7801\u5757\u5982\u4f55\u9009\u62e9\uff1f&#8211;>\u540c\u6b65\u65b9\u6cd5\u9501\u7684\u7c92\u5ea6\u7c97, \u6267\u884c\u6548\u7387\u4f4e, \u540c\u6b65\u4ee3\u7801\u5757\u6267\u884c\u6548\u7387\u9ad8<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test03 {\n    \/**\n     * \u540c\u6b65\u65b9\u6cd5, \u6267\u884c\u6548\u7387\u4f4e\n     *\/\n    public synchronized void doLongTimeTask(){\n        try {\n            System.out.println(\"Task Begin\");\n            Thread.sleep(3000);\n            for(int i = 1; i &lt;= 100; i++){\n                System.out.println(Thread.currentThread().getName() + \"--&gt;\" + i);\n            }\n            System.out.println(\"Task end\");\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    \/**\n     * \u540c\u6b65\u4ee3\u7801\u5757,\u9501\u7684\u7c92\u5ea6\u7ec6, \u6267\u884c\u6548\u7387\u9ad8\n     *\/\n    public void doLongTimeTask2(){\n        try {\n            System.out.println(\"Task Begin\");\n            Thread.sleep(3000);\n            synchronized (this){\n                for(int i = 1; i &lt;= 100; i++){\n                    System.out.println(Thread.currentThread().getName() + \"--&gt;\" + i);\n                }\n            }\n            System.out.println(\"Task end\");\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}\n\n-----\n    @Test\n    public void Test15CurrentThread(){\n        Test03 t3 = new Test03();\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t3.doLongTimeTask();\n            }\n        }).start();\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t3.doLongTimeTask2();\n            }\n        }).start();\n    }\n<\/code><\/pre>\n<h1>Java\u591a\u7ebf\u7a0b\u810f\u8bfb<\/h1>\n<h3>\u810f\u8bfb:<\/h3>\n<p>\u51fa\u73b0\u8bfb\u53d6\u5c5e\u6027\u503c\u51fa\u73b0\u4e86\u4e00\u4e9b\u610f\u5916, \u8bfb\u53d6\u7684\u662f\u4e2d\u95f4\u503c,\u800c\u4e0d\u662f\u4fee\u6539\u4e4b\u540e\u7684\u503c.<\/p>\n<p>\u51fa\u73b0\u810f\u8bfb\u7684\u539f\u56e0\u662f:\u5bf9\u5171\u4eab\u6570\u636e\u7684\u4fee\u6539\u4e0e\u5bf9\u5171\u4eab\u6570\u636e\u7684\u8bfb\u53d6\u4e0d\u540c\u6b65<\/p>\n<p>\u89e3\u51b3\u65b9\u6cd5:<\/p>\n<p>\u4e0d\u4ec5\u5bf9\u4fee\u6539\u6570\u636e\u7684\u4ee3\u7801\u5757\u8fdb\u884c\u540c\u6b65,\u8fd8\u8981\u5bf9\u8bfb\u53d6\u6570\u636e\u7684\u4ee3\u7801\u5757\u540c\u6b65<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test04 {\n    public static void main(String[] args) throws InterruptedException {\n        PublicValue publicValue = new PublicValue();\n        SubThread thread = new SubThread(publicValue);\n        thread.start();\n\n        \/\/\u4e3a\u4e86\u786e\u5b9a\u8bbe\u7f6e\u6210\u529f\n        Thread.sleep(100);\n        \/\/\u5728main\u7ebf\u7a0b\u4e2d\u8bfb\u53d6\u7528\u6237\u540d,\u5bc6\u7801\n        publicValue.getValue();\n    }\n\n    \/**\n     * \u5b9a\u4e49\u7ebf\u7a0b,\u8bbe\u7f6e\u7528\u6237\u540d\u548c\u5bc6\u7801\n     *\/\n    static class SubThread extends Thread{\n        private PublicValue publicValue;\n        public SubThread( PublicValue publicValue){\n            this.publicValue = publicValue;\n        }\n\n        @Override\n        public void run() {\n            publicValue.setValue(\"test\", \"test\");\n        }\n    }\n\n    static class PublicValue{\n        private String name = \"glj\";\n        private String pwd = \"glj123\";\n\n        public synchronized void getValue(){\n            System.out.println(Thread.currentThread().getName() + \", getter -- name: \" + name + \",--pwd: \" + pwd);\n        }\n\n        public synchronized void setValue(String name, String pwd){\n            this.name = name;\n            try {\n                \/\/\u6a21\u62df\u64cd\u4f5cname\u5c5e\u6027\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\n                Thread.sleep(1000);\n                this.pwd = pwd;\n                System.out.println(Thread.currentThread().getName() + \", setter --name:\" + name + \", --pwd: \" + pwd );\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<h1>Java\u591a\u7ebf\u7a0b\u51fa\u73b0\u5f02\u5e38\u4f1a\u81ea\u52a8\u91ca\u653e\u9501<\/h1>\n<p>\u540c\u6b65\u8fc7\u7a0b\u4e2d\u7ebf\u7a0b\u51fa\u73b0\u5f02\u5e38, \u4f1a\u81ea\u52a8\u91ca\u653e\u9501\u5bf9\u8c61<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test05 {\n    public static void main(String[] args) {\n        Test05 t5 = new Test05();\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t5.m1();\n            }\n        }).start();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                Test05.m2();\n            }\n        }).start();\n    }\n    \/\/\u5b9a\u4e49\u65b9\u6cd5,\u6253\u5370100\u884c\u5b57\u7b26\u4e32\n    public void m1(){\n        \/\/\u4f7f\u7528\u5f53\u524d\u7c7b\u7684\u8fd0\u884c\u65f6\u7c7b\u5bf9\u8c61\u4f5c\u4e3a\u9501\u5bf9\u8c61,\u53ef\u4ee5\u7b80\u5355\u7684\u7406\u89e3\u4e3a\u628aTest05\u7c7b\u7684\u5b57\u8282\u7801\u6587\u4ef6\u4f5c\u4e3a\u9501\u5bf9\u8c61\n        synchronized (Test05.class){\n            for (int i = 1; i &lt;= 100; i++) {\n                System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n                if ( i == 50){\n                    \/\/\u628a\u5b57\u7b26\u4e32\u8f6c\u6362\u4e3aint\u7c7b\u578b\u65f6,\u5982\u679c\u5b57\u7b26\u4e32\u4e0d\u7b26\u5408 \u6570\u5b57\u683c\u5f0f\u4f1a\u4ea7\u751f\u5f02\u5e38\n                    Integer.parseInt(\"abc\");\n                }\n            }\n        }\n    }\n    \/\/\u4f7f\u7528synchronized\u4fee\u9970\u9759\u6001\u65b9\u6cd5,\u540c\u6b65\u9759\u6001\u65b9\u6cd5, \u9ed8\u8ba4\u8fd0\u884c\u65f6\u7c7bTest05.class\u4f5c\u4e3a\u9501\u5bf9\u8c61\n    public synchronized static void m2(){\n        for (int i = 1; i &lt;= 100; i++) {\n            System.out.println(Thread.currentThread().getName() + \" --&gt; \" + i);\n        }\n    }\n}\n<\/code><\/pre>\n<h1>Java\u591a\u7ebf\u7a0b\u6b7b\u9501<\/h1>\n<h3>\u6b7b\u9501\uff1a<\/h3>\n<p>\u5728\u591a\u7ebf\u7a0b\u7a0b\u5e8f\u4e2d,\u540c\u6b65\u65f6\u53ef\u80fd\u9700\u8981\u4f7f\u7528\u591a\u4e2a\u9501,\u5982\u679c\u83b7\u5f97\u9501\u7684\u987a\u5e8f\u4e0d\u4e00\u81f4,\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6b7b\u9501<\/p>\n<p>\u5982\u4f55\u907f\u514d\u6b7b\u9501?\u5f53\u9700\u8981\u83b7\u5f97\u591a\u4e2a\u9501\u65f6,\u6240\u6709\u7ebf\u7a0b\u83b7\u5f97\u9501\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u5373\u53ef<\/p>\n<p>\u4e0b\u9762\u4f8b\u5b50\u4f1a\u9020\u6210\u6b7b\u9501:<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test06 {\n\n    public static void main(String[] args) {\n        SubThread t1 = new SubThread();\n        t1.setName(\"a\");\n        t1.start();\n\n        SubThread t2 = new SubThread();\n        t2.setName(\"b\");\n        t2.start();\n    }\n\n    static class  SubThread  extends Thread{\n        private static final  Object lock1 = new Object();\n        private static final  Object lock2 = new Object();\n\n        @Override\n        public void run() {\n            if (\"a\".equals(Thread.currentThread().getName())){\n                synchronized (lock1){\n                    System.out.println(\"a\u7ebf\u7a0b\u83b7\u5f97\u4e86lock1\u9501,\u8fd8\u9700\u8981\u83b7\u5f97lock2\u9501\");\n                    synchronized (lock2){\n                        System.out.println(\"a\u7ebf\u7a0b\u83b7\u5f97lock1\u540e\u53c8\u83b7\u5f97\u4e86lock2,\u53ef\u4ee5\u60f3\u5e72\u4efb\u4f55\u60f3\u5e72\u7684\u4e8b\");\n                    }\n                }\n            }\n            if (\"b\".equals(Thread.currentThread().getName())){\n                synchronized (lock2){\n                    System.out.println(\"b\u7ebf\u7a0b\u83b7\u5f97\u4e86lock2\u9501,\u8fd8\u9700\u8981\u83b7\u5f97lock1\u9501\");\n                    synchronized (lock1){\n                        System.out.println(\"b\u7ebf\u7a0b\u83b7\u5f97lock2\u540e\u53c8\u83b7\u5f97\u4e86lock1,\u53ef\u4ee5\u60f3\u5e72\u4efb\u4f55\u60f3\u5e72\u7684\u4e8b\");\n                    }\n                }\n            }\n        }\n    }\n}\n\n--------\n<\/code><\/pre>\n<p>\u6240\u6709\u7ebf\u7a0b\u83b7\u5f97\u9501\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u5373\u53ef,\u5c31\u662f\u628a\u7ebf\u7a0bb\u4e5f\u662f\u5148\u83b7\u53d6lock1\u518d\u83b7\u53d6lock2\u5373\u53ef<\/p>\n<h1>Java volatile\u5173\u952e\u5b57\u7684\u4f5c\u7528<\/h1>\n<p>volatile\u7684\u4f5c\u7528\u53ef\u4ee5\u5f3a\u5236\u7ebf\u7a0b\u4ece\u516c\u5171\u5185\u5b58\u4e2d\u8bfb\u53d6\u53d8\u91cf\u7684\u503c,\u800c\u4e0d\u662f\u4ece\u5de5\u4f5c\u5185\u5b58\u4e2d\u8bfb\u53d6<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test7 {\n\n    public static void main(String[] args) throws InterruptedException {\n        \/\/\u521b\u5efaPrintString\u5bf9\u8c61\n        PrintString printString = new PrintString();\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                printString.printStringMethod();\n            }\n        }).start();\n\n        \/\/main\u7ebf\u7a0b\u7761\u77201000\u6beb\u79d2\n        Thread.sleep(1000);\n        System.out.println(\"\u5728main\u7ebf\u7a0b\u4e2d\u4fee\u6539\u6253\u5370\u6807\u5fd7\");\n        printString.setContinuePrint(false);\n    }\n\n    static class  PrintString{\n        private volatile boolean continuePrint = true;\n\n        public PrintString setContinuePrint(boolean continuePrint) {\n            this.continuePrint = continuePrint;\n            return this;\n        }\n\n        public void printStringMethod(){\n            System.out.println(Thread.currentThread().getName() + \"\u5f00\u59cb....\");\n            while ( continuePrint ){\n\n            }\n            System.out.println(Thread.currentThread().getName() + \"\u7ed3\u675f++++++++++++++\");\n        }\n\n    }\n\n}\n<\/code><\/pre>\n<h3>volatile\u4e0esynchronized\u6bd4\u8f83<\/h3>\n<p><code>volatile<\/code>\u5173\u952e\u5b57\u662f\u7ebf\u7a0b\u540c\u6b65\u7684\u8f7b\u91cf\u7ea7\u5b9e\u73b0,\u6240\u4ee5<code>volatile<\/code>\u6027\u80fd\u80af\u5b9a\u6bd4<code>synchronized<\/code>\u8981\u597d;<\/p>\n<p><code>volatile<\/code>\u53ea\u80fd\u4fee\u9970\u53d8\u91cf,\u800c<code>synchronized<\/code>\u53ef\u4ee5\u4fee\u9970\u65b9\u6cd5,\u4ee3\u7801\u5757. \u968f\u7740JDK\u65b0\u7248\u672c\u7684\u53d1\u5e03,<code>synchronized<\/code>\u7684\u6267\u884c\u6548\u7387\u4e5f\u6709\u8f83\u5927\u7684\u63d0\u5347,\u5728\u5f00\u53d1\u4e2d\u4f7f\u7528<code>sychronized<\/code>\u7684\u6bd4\u7387\u8fd8\u662f\u5f88\u5927\u7684\u3002<\/p>\n<p>\u591a\u7ebf\u7a0b\u8bbf\u95ee<code>volatile<\/code>\u53d8\u91cf\u4e0d\u4f1a\u53d1\u751f\u963b\u585e,\u800c<code>synchronized<\/code>\u53ef\u80fd\u4f1a\u963b\u585e\u3002<\/p>\n<p><code>volatile<\/code>\u80fd\u4fdd\u8bc1\u6570\u636e\u7684\u53ef\u89c1\u6027,\u4f46\u662f\u4e0d\u80fd\u4fdd\u8bc1\u539f\u5b50\u6027; \u800c<code>synchronized<\/code>\u53ef\u4ee5\u4fdd\u8bc1\u539f\u5b50\u6027,\u4e5f\u53ef\u4ee5\u4fdd\u8bc1\u53ef\u89c1\u6027\u3002<\/p>\n<p>\u5173\u952e\u5b57<code>volatile<\/code>\u89e3\u51b3\u7684\u662f\u53d8\u91cf\u5728\u591a\u4e2a\u7ebf\u7a0b\u4e4b\u95f4\u7684\u53ef\u89c1\u6027; <code>synchronized<\/code>\u5173\u952e\u5b57\u89e3\u51b3\u591a\u4e2a\u7ebf\u7a0b\u4e4b\u95f4\u8bbf\u95ee\u516c\u5171\u8d44\u6e90\u7684\u540c\u6b65\u6027\u3002<\/p>\n<h3>volatile\u5173\u952e\u5b57\u589e\u52a0\u4e86\u5b9e\u4f8b\u53d8\u91cf\u5728\u591a\u4e2a\u7ebf\u7a0b\u4e4b\u95f4\u7684\u53ef\u89c1\u6027,\u4f46\u662f\u4e0d\u5177\u5907\u539f\u5b50\u6027\u3002<\/h3>\n<h1>Java\u539f\u5b50\u7c7b\u81ea\u589e\u81ea\u51cf\u64cd\u4f5c<\/h1>\n<p>\u6211\u4eec\u77e5\u9053i++\u64cd\u4f5c\u4e0d\u662f\u539f\u5b50\u64cd\u4f5c, \u9664\u4e86\u4f7f\u7528<code>Synchronized<\/code>\u8fdb\u884c\u540c\u6b65\u5916,\u4e5f\u53ef\u4ee5\u4f7f\u7528<code>AtomicInteger\/AtomicLong<\/code>\u539f\u5b50\u7c7b\u8fdb\u884c\u5b9e\u73b0\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test08 {\n    public static void main(String[] args) throws InterruptedException {\n        \/\/\u5728main\u7ebf\u7a0b\u4e2d\u521b\u5efa10\u4e2a\u5b50\u7ebf\u7a0b\n        for (int i = 0; i &lt; 1000; i++) {\n            new MyThread().start();\n        }\n        Thread.sleep(1000);\n        System.out.println( MyThread.count.get());\n    }\n\n    static class MyThread extends Thread{\n        private static AtomicInteger count = new AtomicInteger();\n\n        public static void addCounter(){\n            for (int i = 0; i &lt; 10000; i++) {\n                \/\/\u81ea\u589e\u7684\u540e\u7f00\u5f62\u5f0f\n                count.getAndIncrement();\n            }\n            System.out.println(Thread.currentThread().getName() + \" count=\" + count.get());\n        }\n\n        @Override\n        public void run() {\n            addCounter();\n        }\n    }\n}\n<\/code><\/pre>\n<p><code>AtomicInteger<\/code>\u5177\u4f53\u7684\u7528\u6cd5\uff1ahttps:\/\/www.jianshu.com\/p\/e5102928f7b2<\/p>\n<h1>Java CAS\u591a\u7ebf\u7a0b<\/h1>\n<p>CAS(Compare And Swap)\u662f\u7531\u786c\u4ef6\u5b9e\u73b0\u7684\u3002<\/p>\n<p>CAS\u53ef\u4ee5\u5c06read- modify &#8211; write\u8fd9\u7c7b\u7684\u64cd\u4f5c\u8f6c\u6362\u4e3a\u539f\u5b50\u64cd\u4f5c\u3002<\/p>\n<p>i++\u81ea\u589e\u64cd\u4f5c\u5305\u62ec\u4e09\u4e2a\u5b50\u64cd\u4f5c\uff1a<\/p>\n<ol>\n<li>\u4ece\u4e3b\u5185\u5b58\u8bfb\u53d6i\u53d8\u91cf\u503c<\/li>\n<li>\u5bf9i\u7684\u503c\u52a01<\/li>\n<li>\u518d\u628a\u52a01\u4e4b\u540e \u7684\u503c\u4fdd\u5b58\u5230\u4e3b\u5185\u5b58<\/li>\n<\/ol>\n<p>CAS\u539f\u7406\uff1a\u5728\u628a\u6570\u636e\u66f4\u65b0\u5230\u4e3b\u5185\u5b58\u65f6,\u518d\u6b21\u8bfb\u53d6\u4e3b\u5185\u5b58\u53d8\u91cf\u7684\u503c,\u5982\u679c\u73b0\u5728\u53d8\u91cf\u7684\u503c\u4e0e\u671f\u671b\u7684\u503c(\u64cd\u4f5c\u8d77\u59cb\u65f6\u8bfb\u53d6\u7684\u503c)\u4e00\u6837\u5c31\u66f4\u65b0\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/typoraImg\/1588151254@9fd3dff54b91b8abfe502eba2086d2a9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/typoraImg\/1588151254@9fd3dff54b91b8abfe502eba2086d2a9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<h3>\u4f7f\u7528CAS\u5b9e\u73b0\u7ebf\u7a0b\u5b89\u5168\u7684\u8ba1\u6570\u5668<\/h3>\n<pre><code class=\"language-java line-numbers\">Public class CASTest {\n\n    public static void main(String[] args) {\n        CASCounter casCounter = new CASCounter();\n        for (int i = 0; i &lt; 100000; i++) {\n            new Thread(new Runnable() {\n                @Override\n                public void run() {\n                    System.out.println(casCounter.incrementAndGet());\n                }\n            }).start();\n        }\n    }\n}\nclass CASCounter{\n    \/\/\u4f7f\u7528volatile\u4fee\u9970value\u503c,\u4f7f\u7ebf\u7a0b\u53ef\u89c1\n    volatile private long value;\n\n    public long getValue(){\n        return value;\n    }\n\n    \/\/\u5b9a\u4e49comare and swap\u65b9\u6cd5\n    private boolean compareAndSwap(long expectedValue, long newValue){\n        \/\/\u5982\u679c\u5f53\u524dvalue\u7684\u503c\u4e0e\u671f\u671b\u7684expectedVAlue\u503c\u4e00\u6837,\u5c31\u628a\u5f53\u524d\u7684Value\u5b57\u6bb5\u66ff\u6362\u4e3anewValue\u503c\n        synchronized (this){\n            if ( value == expectedValue){\n                value = newValue;\n                return true;\n            }else {\n                return false;\n            }\n        }\n    }\n\n    \/\/\u5b9a\u4e49\u81ea\u589e\u7684\u65b9\u6cd5\n    public long incrementAndGet(){\n        long oldvalue ;\n        long newValue;\n        do {\n            oldvalue = value;\n            newValue = oldvalue+1;\n        }while ( !compareAndSwap(oldvalue, newValue) );\n        return newValue;\n    }\n\n}\n<\/code><\/pre>\n<h1>Java\u539f\u5b50\u53d8\u91cf<\/h1>\n<p>\u539f\u5b50\u53d8\u91cf\u7c7b\u57fa\u4e8eCAS\u5b9e\u73b0\u7684, \u5f53\u5bf9\u5171\u4eab\u53d8\u91cf\u8fdb\u884cread-modify-write\u66f4\u65b0\u64cd\u4f5c\u65f6,\u901a\u8fc7\u539f\u5b50\u53d8\u91cf\u7c7b\u53ef\u4ee5\u4fdd\u969c\u64cd\u4f5c\u7684\u539f\u5b50\u6027\u4e0e\u53ef\u89c1\u6027.\u5bf9\u53d8\u91cf\u7684read-modify-write\u66f4\u65b0\u64cd\u4f5c\u662f\u6307\u5f53\u524d\u64cd\u4f5c\u4e0d\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u8d4b\u503c,\u800c\u662f\u53d8\u91cf\u7684\u65b0\u503c\u4f9d\u8d56\u53d8\u91cf\u7684\u65e7\u503c,\u5982\u81ea\u589e\u64cd\u4f5ci++. \u7531\u4e8evolatile\u53ea\u80fd\u4fdd\u8bc1\u53ef\u89c1\u6027,\u65e0\u6cd5\u4fdd\u969c\u539f\u5b50\u6027, \u539f\u5b50\u53d8\u91cf\u7c7b\u5185\u90e8\u5c31\u662f\u501f\u52a9\u4e00\u4e2aVolatile\u53d8\u91cf,\u5e76\u4e14\u4fdd\u969c\u4e86\u8be5\u53d8\u91cf\u7684read-modify-write\u64cd\u4f5c\u7684\u539f\u5b50\u6027, \u6709\u65f6\u628a\u539f\u5b50\u53d8\u91cf\u7c7b\u770b\u4f5c\u589e\u5f3a\u7684volatile\u53d8\u91cf. \u539f\u5b50\u53d8\u91cf\u7c7b\u670912\u4e2a,\u5982:<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"center\">\u5206\u7ec4<\/th>\n<th align=\"center\">\u539f\u5b50\u53d8\u91cf\u7c7b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"center\">\u57fa\u7840\u6570\u636e\u578b<\/td>\n<td align=\"center\">AtomicInteger, AtomicLong, AtomicBoolean<\/td>\n<\/tr>\n<tr>\n<td align=\"center\">\u6570\u7ec4\u578b<\/td>\n<td align=\"center\">AtomicIntegerArray, AtomicLongArray,AtomicReferenceArray<\/td>\n<\/tr>\n<tr>\n<td align=\"center\">\u5b57\u6bb5\u66f4\u65b0\u5668<\/td>\n<td align=\"center\">AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater<\/td>\n<\/tr>\n<tr>\n<td align=\"center\">\u5f15\u7528\u578b<\/td>\n<td align=\"center\">AtomicReference,AtomicStampedReference, AtomicMarkableReference<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h1>Java\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f<\/h1>\n<h2>Java\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f<\/h2>\n<h3>1\u3001\u540c\u6b65<\/h3>\n<p>\u8fd9\u91cc\u8bb2\u7684\u540c\u6b65\u662f\u6307\u591a\u4e2a\u7ebf\u7a0b\u901a\u8fc7synchronized\u5173\u952e\u5b57\u8fd9\u79cd\u65b9\u5f0f\u6765\u5b9e\u73b0\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u3002<\/p>\n<p>\u53c2\u8003\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java line-numbers\">public class MyObject {\n\n    synchronized public void methodA() {\n        \/\/do something....\n    }\n\n    synchronized public void methodB() {\n        \/\/do some other thing\n    }\n}\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">public class ThreadA extends Thread {\n\n    private MyObject object;\n    \/\/\u7701\u7565\u6784\u9020\u65b9\u6cd5\n    @Override\n    public void run() {\n        super.run();\n        object.methodA();\n    }\n}\n\n------------\n\npublic class ThreadB extends Thread {\n\n    private MyObject object;\n    \/\/\u7701\u7565\u6784\u9020\u65b9\u6cd5\n    @Override\n    public void run() {\n        super.run();\n        object.methodB();\n    }\n}\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">public class Run {\n    public static void main(String[] args) {\n        MyObject object = new MyObject();\n\n        \/\/\u7ebf\u7a0bA\u4e0e\u7ebf\u7a0bB \u6301\u6709\u7684\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61:object\n        ThreadA a = new ThreadA(object);\n        ThreadB b = new ThreadB(object);\n        a.start();\n        b.start();\n    }\n}\n<\/code><\/pre>\n<p>\u7531\u4e8e\u7ebf\u7a0bA\u548c\u7ebf\u7a0bB\u6301\u6709\u540c\u4e00\u4e2aMyObject\u7c7b\u7684\u5bf9\u8c61object\uff0c\u5c3d\u7ba1\u8fd9\u4e24\u4e2a\u7ebf\u7a0b\u9700\u8981\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u4f46\u662f\u5b83\u4eec\u662f\u540c\u6b65\u6267\u884c\u7684\uff0c\u6bd4\u5982\uff1a\u7ebf\u7a0bB\u9700\u8981\u7b49\u5f85\u7ebf\u7a0bA\u6267\u884c\u5b8c\u4e86methodA()\u65b9\u6cd5\u4e4b\u540e\uff0c\u5b83\u624d\u80fd\u6267\u884cmethodB()\u65b9\u6cd5\u3002\u8fd9\u6837\uff0c\u7ebf\u7a0bA\u548c\u7ebf\u7a0bB\u5c31\u5b9e\u73b0\u4e86\u901a\u4fe1\u3002\u8fd9\u79cd\u65b9\u5f0f\uff0c\u672c\u8d28\u4e0a\u5c31\u662f\u201c\u5171\u4eab\u5185\u5b58\u201d\u5f0f\u7684\u901a\u4fe1\u3002\u591a\u4e2a\u7ebf\u7a0b\u9700\u8981\u8bbf\u95ee\u540c\u4e00\u4e2a\u5171\u4eab\u53d8\u91cf\uff0c\u8c01\u62ff\u5230\u4e86\u9501(\u83b7\u5f97\u4e86\u8bbf\u95ee\u6743\u9650)\uff0c\u8c01\u5c31\u53ef\u4ee5\u6267\u884c\u3002<\/p>\n<h3>2\u3001while\u8f6e\u8be2\u7684\u65b9\u5f0f<\/h3>\n<p>\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java line-numbers\">import java.util.ArrayList;\nimport java.util.List;\n\npublic class MyList {\n\n    private List&lt;String&gt; list = new ArrayList&lt;String&gt;();\n    public void add() {\n        list.add(\"elements\");\n    }\n    public int size() {\n        return list.size();\n    }\n}\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">import mylist.MyList;\n\npublic class ThreadA extends Thread {\n\n    private MyList list;\n\n    public ThreadA(MyList list) {\n        super();\n        this.list = list;\n    }\n\n    @Override\n    public void run() {\n        try {\n            for (int i = 0; i &lt; 10; i++) {\n                list.add();\n                System.out.println(\"\u6dfb\u52a0\u4e86\" + (i + 1) + \"\u4e2a\u5143\u7d20\");\n                Thread.sleep(1000);\n            }\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">import mylist.MyList;\n\npublic class ThreadB extends Thread {\n\n    private MyList list;\n\n    public ThreadB(MyList list) {\n        super();\n        this.list = list;\n    }\n\n    @Override\n    public void run() {\n        try {\n            while (true) {\n                if (list.size() == 5) {\n                    System.out.println(\"==5, \u7ebf\u7a0bb\u51c6\u5907\u9000\u51fa\u4e86\");\n                    throw new InterruptedException();\n                }\n            }\n        } catch (InterruptedException e) {\n\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">import mylist.MyList;\nimport extthread.ThreadA;\nimport extthread.ThreadB;\n\npublic class Test {\n\n    public static void main(String[] args) {\n        MyList service = new MyList();\n\n        ThreadA a = new ThreadA(service);\n        a.setName(\"A\");\n        a.start();\n\n        ThreadB b = new ThreadB(service);\n        b.setName(\"B\");\n        b.start();\n    }\n}\n<\/code><\/pre>\n<p>\u5728\u8fd9\u79cd\u65b9\u5f0f\u4e0b\uff0c\u7ebf\u7a0bA\u4e0d\u65ad\u5730\u6539\u53d8\u6761\u4ef6\uff0c\u7ebf\u7a0bThreadB\u4e0d\u505c\u5730\u901a\u8fc7while\u8bed\u53e5\u68c0\u6d4b\u8fd9\u4e2a\u6761\u4ef6(list.size()<span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">5)\u662f\u5426\u6210\u7acb \uff0c\u4ece\u800c\u5b9e\u73b0\u4e86\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u3002\u4f46\u662f\u8fd9\u79cd\u65b9\u5f0f\u4f1a\u6d6a\u8d39CPU\u8d44\u6e90\u3002\u4e4b\u6240\u4ee5\u8bf4\u5b83\u6d6a\u8d39\u8d44\u6e90\uff0c\u662f\u56e0\u4e3aJVM\u8c03\u5ea6\u5668\u5c06CPU\u4ea4\u7ed9\u7ebf\u7a0bB\u6267\u884c\u65f6\uff0c\u5b83\u6ca1\u505a\u5565\u201c\u6709\u7528\u201d\u7684\u5de5\u4f5c\uff0c\u53ea\u662f\u5728\u4e0d\u65ad\u5730\u6d4b\u8bd5 \u67d0\u4e2a\u6761\u4ef6\u662f\u5426\u6210\u7acb\u3002\u5c31\u7c7b\u4f3c\u4e8e\u73b0\u5b9e\u751f\u6d3b\u4e2d\uff0c\u67d0\u4e2a\u4eba\u4e00\u76f4\u770b\u7740\u624b\u673a\u5c4f\u5e55\u662f\u5426\u6709\u7535\u8bdd\u6765\u4e86\uff0c\u800c\u4e0d\u662f\uff1a \u5728\u5e72\u522b\u7684\u4e8b\u60c5\uff0c\u5f53\u6709\u7535\u8bdd\u6765\u65f6\uff0c\u54cd\u94c3\u901a\u77e5TA\u7535\u8bdd\u6765\u4e86\u3002<\/span><\/p>\n<p>\u8fd9\u79cd\u65b9\u5f0f\u8fd8\u5b58\u5728\u53e6\u5916\u4e00\u4e2a\u95ee\u9898\uff1a\u8f6e\u8be2\u7684\u6761\u4ef6\u7684\u53ef\u89c1\u6027\u95ee\u9898<\/p>\n<p>\u7ebf\u7a0b\u90fd\u662f\u5148\u628a\u53d8\u91cf\u8bfb\u53d6\u5230\u672c\u5730\u7ebf\u7a0b\u6808\u7a7a\u95f4\uff0c\u7136\u540e\u518d\u53bb\u518d\u53bb\u4fee\u6539\u7684\u672c\u5730\u53d8\u91cf\u3002\u56e0\u6b64\uff0c\u5982\u679c\u7ebf\u7a0bB\u6bcf\u6b21\u90fd\u5728\u53d6\u672c\u5730\u7684 \u6761\u4ef6\u53d8\u91cf\uff0c\u90a3\u4e48\u5c3d\u7ba1\u53e6\u5916\u4e00\u4e2a\u7ebf\u7a0b\u5df2\u7ecf\u6539\u53d8\u4e86\u8f6e\u8be2\u7684\u6761\u4ef6\uff0c\u5b83\u4e5f\u5bdf\u89c9\u4e0d\u5230\uff0c\u8fd9\u6837\u4e5f\u4f1a\u9020\u6210\u6b7b\u5faa\u73af\u3002<\/p>\n<h3>3\u3001wait\/notify\u673a\u5236<\/h3>\n<p>\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java line-numbers\">import java.util.ArrayList;\nimport java.util.List;\n\npublic class MyList {\n\n    private static List&lt;String&gt; list = new ArrayList&lt;String&gt;();\n\n    public static void add() {\n        list.add(\"anyString\");\n    }\n\n    public static int size() {\n        return list.size();\n    }\n}\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">public class ThreadA extends Thread {\n\n    private Object lock;\n\n    public ThreadA(Object lock) {\n\n\n        super();\n        this.lock = lock;\n    }\n\n\n    @Override\n    public void run() {\n        try {\n            synchronized (lock) {\n                if (MyList.size() != 5) {\n                    System.out.println(\"wait begin \"\n                            + System.currentTimeMillis());\n                    lock.wait();\n                    System.out.println(\"wait end  \"\n                            + System.currentTimeMillis());\n                }\n            }\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">public class ThreadB extends Thread {\n    private Object lock;\n\n    public ThreadB(Object lock) {\n        super();\n        this.lock = lock;\n    }\n\n    @Override\n    public void run() {\n        try {\n            synchronized (lock) {\n                for (int i = 0; i &lt; 10; i++) {\n                    MyList.add();\n                    if (MyList.size() == 5) {\n                        lock.notify();\n                        System.out.println(\"\u5df2\u7ecf\u53d1\u51fa\u4e86\u901a\u77e5\");\n                    }\n                    System.out.println(\"\u6dfb\u52a0\u4e86\" + (i + 1) + \"\u4e2a\u5143\u7d20!\");\n                    Thread.sleep(1000);\n                }\n            }\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">public class Run {\n\n    public static void main(String[] args) {\n\n        try {\n            Object lock = new Object();\n\n            ThreadA a = new ThreadA(lock);\n            a.start();\n\n            Thread.sleep(50);\n\n            ThreadB b = new ThreadB(lock);\n            b.start();\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n<p>\u7ebf\u7a0bA\u8981\u7b49\u5f85\u67d0\u4e2a\u6761\u4ef6\u6ee1\u8db3\u65f6(list.size()<span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">5)\uff0c\u624d\u6267\u884c\u64cd\u4f5c\u3002\u7ebf\u7a0bB\u5219\u5411list\u4e2d\u6dfb\u52a0\u5143\u7d20\uff0c\u6539\u53d8list \u7684size\u3002<\/span><\/p>\n<p>A,B\u4e4b\u95f4\u5982\u4f55\u901a\u4fe1\u7684\u5462?\u4e5f\u5c31\u662f\u8bf4\uff0c\u7ebf\u7a0bA\u5982\u4f55\u77e5\u9053 list.size() \u5df2\u7ecf\u4e3a5\u4e86\u5462?<\/p>\n<p>\u8fd9\u91cc\u7528\u5230\u4e86Object\u7c7b\u7684 <code>wait(<\/code>) \u548c <code>notify()<\/code> \u65b9\u6cd5\u3002<\/p>\n<p>\u5f53\u6761\u4ef6\u672a\u6ee1\u8db3\u65f6(list.size() !=5)\uff0c\u7ebf\u7a0bA\u8c03\u7528<code>wait()<\/code>\u653e\u5f03CPU\uff0c\u5e76\u8fdb\u5165\u963b\u585e\u72b6\u6001\u3002<\/p>\n<p>\u5f53\u6761\u4ef6\u6ee1\u8db3\u65f6\uff0c\u7ebf\u7a0bB\u8c03\u7528 <code>notify()<\/code>\u901a\u77e5 \u7ebf\u7a0bA\uff0c\u6240\u8c13\u901a\u77e5\u7ebf\u7a0bA\uff0c\u5c31\u662f\u5524\u9192\u7ebf\u7a0bA\uff0c\u5e76\u8ba9\u5b83\u8fdb\u5165\u53ef\u8fd0\u884c\u72b6\u6001\u3002<\/p>\n<p>\u8fd9\u79cd\u65b9\u5f0f\u7684\u4e00\u4e2a\u597d\u5904\u5c31\u662fCPU\u7684\u5229\u7528\u7387\u63d0\u9ad8\u4e86\u3002<\/p>\n<p>\u4f46\u662f\u4e5f\u6709\u4e00\u4e9b\u7f3a\u70b9\uff1a\u6bd4\u5982\uff0c\u7ebf\u7a0bB\u5148\u6267\u884c\uff0c\u4e00\u4e0b\u5b50\u6dfb\u52a0\u4e865\u4e2a\u5143\u7d20\u5e76\u8c03\u7528\u4e86notify()\u53d1\u9001\u4e86\u901a\u77e5\uff0c\u800c\u6b64\u65f6\u7ebf\u7a0bA\u8fd8\u6267\u884c;\u5f53\u7ebf\u7a0bA\u6267\u884c\u5e76\u8c03\u7528wait()\u65f6\uff0c\u90a3\u5b83\u6c38\u8fdc\u5c31\u4e0d\u53ef\u80fd\u88ab\u5524\u9192\u4e86\u3002\u56e0\u4e3a\uff0c\u7ebf\u7a0bB\u5df2\u7ecf\u53d1\u4e86\u901a\u77e5\u4e86\uff0c\u4ee5\u540e\u4e0d\u518d\u53d1\u901a\u77e5\u4e86\u3002\u8fd9\u8bf4\u660e\uff1a<span class=\"text-highlighted-inline\" style=\"background-color: #fffd38;\">\u901a\u77e5\u8fc7\u65e9\uff0c\u4f1a\u6253\u4e71\u7a0b\u5e8f\u7684\u6267\u884c\u903b\u8f91\u3002<\/span><\/p>\n<h3>4\u3001\u7ba1\u9053\u901a\u4fe1<\/h3>\n<p>\u7ba1\u9053\u901a\u4fe1\u5c31\u662f\u4f7f\u7528<code>java.io.PipedInputStream<\/code> \u548c <code>java.io.PipedOutputStream<\/code>\u8fdb\u884c\u901a\u4fe1\u3002<\/p>\n<h1>Java\u591a\u7ebf\u7a0b\u7684\u7b49\u5f85\u901a\u77e5\u673a\u5236<\/h1>\n<h3>\u4ec0\u4e48\u662f\u7b49\u5f85\u901a\u77e5\u673a\u5236<\/h3>\n<p>\u5728\u5355\u7ebf\u7a0b\u7f16\u7a0b\u4e2d,\u8981\u6267\u884c\u7684\u64cd\u4f5c\u9700\u8981\u6ee1\u8db3\u4e00\u5b9a\u7684\u6761\u4ef6\u624d\u80fd\u6267\u884c,\u53ef\u4ee5\u628a\u8fd9\u4e2a\u64cd\u4f5c\u653e\u5728if\u8bed\u53e5\u5757\u4e2d\u3002<\/p>\n<p>\u5728\u591a\u7ebf\u7a0b\u7f16\u7a0b\u4e2d,\u53ef\u80fdA\u7ebf\u7a0b\u7684\u6761\u4ef6\u6ca1\u6709\u6ee1\u8db3\u53ea\u662f\u6682\u65f6\u7684, \u7a0d\u540e\u5176\u4ed6\u7684\u7ebf\u7a0bB\u53ef\u80fd\u4f1a\u66f4\u65b0\u6761\u4ef6\u4f7f\u5f97A\u7ebf\u7a0b\u7684\u6761\u4ef6\u5f97\u5230\u6ee1\u8db3. \u53ef\u4ee5\u5c06A\u7ebf\u7a0b\u6682\u505c,\u76f4\u5230\u5b83\u7684\u6761\u4ef6\u5f97\u5230\u6ee1\u8db3\u540e\u518d\u5c06A\u7ebf\u7a0b\u5524\u9192.\u5b83\u7684\u4f2a\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"language-java line-numbers\">atomics{        \/\/\u539f\u5b50\u64cd\u4f5c\n    while( \u6761\u4ef6\u4e0d\u6210\u7acb ){\n        \/\/\u7b49\u5f85\n    }\n    \/\/\u5f53\u524d\u7ebf\u7a0b\u88ab\u5524\u9192\u6761\u4ef6\u6ee1\u8db3\u540e,\u7ee7\u7eed\u6267\u884c\u4e0b\u9762\u7684\u64cd\u4f5c\n}\n<\/code><\/pre>\n<p>\u7b49\u5f85\/\u901a\u77e5\u673a\u5236\u7684\u5b9e\u73b0<\/p>\n<p>Object\u7c7b\u4e2d\u7684<code>wait()<\/code>\u65b9\u6cd5\u53ef\u4ee5\u4f7f\u6267\u884c\u5f53\u524d\u4ee3\u7801\u7684\u7ebf\u7a0b\u7b49\u5f85,\u6682\u505c\u6267\u884c,\u76f4\u5230\u63a5\u5230\u901a\u77e5\u6216\u88ab\u4e2d\u65ad\u4e3a\u6b62\u3002<\/p>\n<p>\u6ce8\u610f:<\/p>\n<ol>\n<li>wait()\u65b9\u6cd5\u53ea\u80fd\u5728\u540c\u6b65\u4ee3\u7801\u5757\u4e2d\u7531\u9501\u5bf9\u8c61\u8c03\u7528\u3002<\/li>\n<li>\u8c03\u7528wait()\u65b9\u6cd5,\u5f53\u524d\u7ebf\u7a0b\u4f1a\u91ca\u653e\u9501\u3002<\/li>\n<\/ol>\n<p>\u5176\u4f2a\u4ee3\u7801\u5982\u4e0b:<\/p>\n<pre><code class=\"language-java line-numbers\">\/\/\u5728\u8c03\u7528wait()\u65b9\u6cd5\u524d\u83b7\u5f97\u5bf9\u8c61\u7684\u5185\u90e8\u9501\nsynchronized( \u9501\u5bf9\u8c61 ){\n    while( \u6761\u4ef6\u4e0d\u6210\u7acb ){\n        \/\/\u901a\u8fc7\u9501\u5bf9\u8c61\u8c03\u7528 wait()\u65b9\u6cd5\u6682\u505c\u7ebf\u7a0b,\u4f1a\u91ca\u653e\u9501\u5bf9\u8c61\n        \u9501\u5bf9\u8c61.wait();\n    }\n    \/\/\u7ebf\u7a0b\u7684\u6761\u4ef6\u6ee1\u8db3\u4e86\u7ee7\u7eed\u5411\u4e0b\u6267\u884c\n}\n<\/code><\/pre>\n<p>Object\u7c7b\u7684<code>notify()<\/code>\u53ef\u4ee5\u5524\u9192\u7ebf\u7a0b,\u8be5\u65b9\u6cd5\u4e5f\u5fc5\u987b\u5728\u540c\u6b65\u4ee3\u7801\u5757\u4e2d\u7531\u9501\u5bf9\u8c61\u8c03\u7528. \u6ca1\u6709\u4f7f\u7528\u9501\u5bf9\u8c61\u8c03\u7528<code>wait()\/notify()<\/code>\u4f1a\u629b\u51fa<code>IlegalMonitorStateExeption<\/code>\u5f02\u5e38. \u5982\u679c\u6709\u591a\u4e2a\u7b49\u5f85\u7684\u7ebf\u7a0b,<code>notify()<\/code>\u65b9\u6cd5\u53ea\u80fd\u5524\u9192\u5176\u4e2d\u7684\u4e00\u4e2a. \u5728\u540c\u6b65\u4ee3\u7801\u5757\u4e2d\u8c03\u7528<code>notify()<\/code>\u65b9\u6cd5\u540e,\u5e76\u4e0d\u4f1a\u7acb\u5373\u91ca\u653e\u9501\u5bf9\u8c61,\u9700\u8981\u7b49\u5f53\u524d\u540c\u6b65\u4ee3\u7801\u5757\u6267\u884c\u5b8c\u540e\u624d\u4f1a\u91ca\u653e\u9501\u5bf9\u8c61,\u4e00\u822c\u5c06<code>notify()<\/code>\u65b9\u6cd5\u653e\u5728\u540c\u6b65\u4ee3\u7801\u5757\u7684\u6700\u540e. \u5b83\u7684\u4f2a\u4ee3\u7801\u5982\u4e0b:<\/p>\n<pre><code class=\"language-java line-numbers\">synchronized( \u9501\u5bf9\u8c61 ){\n    \/\/\u6267\u884c\u4fee\u6539\u4fdd\u62a4\u6761\u4ef6 \u7684\u4ee3\u7801\n    \/\/\u5524\u9192\u5176\u4ed6\u7ebf\u7a0b\n    \u9501\u5bf9\u8c61.notify();\n}\n<\/code><\/pre>\n<h4>\u9700\u8981\u901a\u8fc7<code>notify()<\/code>\u5524\u9192\u7b49\u5f85\u7684\u7ebf\u7a0b<\/h4>\n<pre><code class=\"language-java line-numbers\">public class Test01 {\n\n    public static void main(String[] args) {\n        String lock = \"glj\";\n        Thread t1 = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                synchronized (lock){\n                    System.out.println(\"\u7ebf\u7a0b1\u5f00\u59cb\u7b49\u5f85: \" + System.currentTimeMillis());\n                    \/\/\u7ebf\u7a0b\u7b49\u5f85,\u4f1a\u91ca\u653e\u9501\u5bf9\u8c61,\u5f53\u524d\u7ebf\u7a0b\u8f6c\u5165blocked\u963b\u585e\u72b6\u6001\n                    try {\n                        lock.wait();\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                    System.out.println(\"\u7ebf\u7a0b1\u7ed3\u675f\u7b49\u5f85:\" + System.currentTimeMillis());\n                }\n            }\n        });\n\n        Thread t2 = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                \/\/notify()\u65b9\u6cd5\u4e5f\u9700\u8981\u5728\u540c\u6b65\u4ee3\u7801\u5757\u4e2d,\u7531\u9501\u5bf9\u8c61\u8c03\u7528\n                synchronized (lock){\n                    System.out.println(\"\u7ebf\u7a0b2\u5f00\u59cb\u5524\u9192 : \" + System.currentTimeMillis());\n                    lock.notify();      \/\/\u5524\u9192\u5728lock\u9501\u5bf9\u8c61\u4e0a\u7b49\u5f85\u7684\u67d0\u4e00\u4e2a\u7ebf\u7a0b\n                    System.out.println(\"\u7ebf\u7a0b2\u7ed3\u675f\u5524\u9192 : \" + System.currentTimeMillis());\n                }\n            }\n        });\n        \/\/\u5f00\u542ft1\u7ebf\u7a0b,t1\u7ebf\u7a0b\u7b49\u5f85\n        t1.start();\n        try {\n            Thread.sleep(3000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n        \/\/t1\u7ebf\u7a0b\u5f00\u542f3\u79d2\u540e,\u518d\u5f00\u542ft2\u7ebf\u7a0b\u5524\u9192t1\u7ebf\u7a0b\n        t2.start();\n    }\n\n}\n<\/code><\/pre>\n<h4>notify()\u65b9\u6cd5\u540e\u4e0d\u4f1a\u7acb\u5373\u91ca\u653e\u9501\u5bf9\u8c61<\/h4>\n<pre><code class=\"language-java line-numbers\">public class Test02 {\n\n    public static void main(String[] args) throws InterruptedException {\n        \/\/\u5b9a\u4e49\u4e00\u4e2aList\u96c6\u5408\u5b58\u50a8String\u6570\u636e\n        List&lt;String&gt; list = new ArrayList&lt;&gt;();\n\n        \/\/\u5b9a\u4e49\u7b2c\u4e00\u4e2a\u7ebf\u7a0b,\u5f53list\u96c6\u5408\u4e2d\u5143\u7d20\u7684\u6570\u91cf\u4e0d\u7b49\u4e8e5\u65f6\u7ebf\u7a0b\u7b49\u5f85\n        Thread t1 = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                synchronized (list){\n                    if (list.size()!=5) {\n                        System.out.println(\"\u7ebf\u7a0b1\u5f00\u59cb\u7b49\u5f85: \" + System.currentTimeMillis());\n                        try {\n                            System.out.println(\"\u7b49\u5f85\");\n                            list.wait();\n                        } catch (InterruptedException e) {\n                            e.printStackTrace();\n                        }\n                        System.out.println(\"\u7ebf\u7a0b1\u88ab\u5524\u9192:\" + System.currentTimeMillis());\n                    }\n                }\n            }\n        });\n\n        \/\/\u5b9a\u4e49\u7b2c\u4e8c\u4e2a\u7ebf\u7a0b,\u5411list\u96c6\u5408\u4e2d\u6dfb\u52a0\u5143\u7d20\n        Thread t2 = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                synchronized (list){\n                    for(int i=0; i&lt;10;i++){\n                        list.add(\"data--&gt;\"+i);\n                        System.out.println(\"\u7ebf\u7a0b2\u6dfb\u52a0\u4e86\u7b2c\" + (i+1) + \"\u4e2a\u6570\u636e\");\n\n                        if (list.size()==5) {\n                            \/\/\u5524\u9192\u7ebf\u7a0b, \u4e0d\u4f1a\u7acb\u5373\u91ca\u653e\u9501\u5bf9\u8c61,\u9700\u8981\u7b49\u5230\u5f53\u524d\u540c\u6b65\u4ee3\u7801\u5757\u90fd\u6267\u884c\u5b8c\u540e\u624d\u80fd\u91ca\u653e\u9501\u5bf9\u8c61\n                            list.notify();\n                            System.out.println(\"\u7ebf\u7a0b2\u53d1\u9001\u5524\u9192\u901a\u77e5\");\n                        }\n\n                        try {\n                            Thread.sleep(1000);\n                        } catch (InterruptedException e) {\n                            e.printStackTrace();\n                        }\n\n                    }\n                }\n            }\n        });\n\n        t1.start();\n        Thread.sleep(3000);\n        t2.start();\n\n    }\n\n}\n<\/code><\/pre>\n<h4>interrupt()\u4f1a\u4e2d\u65ad\u7ebf\u7a0b\u7684wait()\u7b49\u5f85<\/h4>\n<p>\u5f53\u7ebf\u7a0b\u5904\u4e8ewait()\u7b49\u5f85\u72b6\u6001\u65f6, \u8c03\u7528\u7ebf\u7a0b\u5bf9\u8c61\u7684interrupt()\u65b9\u6cd5\u4f1a\u4e2d\u65ad\u7ebf\u7a0b\u7684\u7b49\u5f85\u72b6\u6001, \u4f1a\u4ea7\u751fInterruptedException\u5f02\u5e38\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test03 {\n\n    public static void main(String[] args) throws InterruptedException {\n        SunThread sub = new SunThread();\n        sub.start();\n        System.out.println(\"\u5f53\u524d\u65f6\u95f4:\"+System.currentTimeMillis());\n        Thread.sleep(3000);\n        System.out.println(\"\u5f53\u524d\u65f6\u95f4:\"+System.currentTimeMillis());\n        sub.interrupt();\n        System.out.println(\"\u5f53\u524d\u65f6\u95f4:\"+System.currentTimeMillis());\n    }\n\n\n    private static final Object LOCK = new Object();\n\n    static class SunThread extends Thread{\n        @Override\n        public void run() {\n            synchronized (LOCK){\n                try {\n                    System.out.println(\"begin wait...\");\n                    LOCK.wait();\n                    System.out.println(\"end wait..\");\n                } catch (InterruptedException e) {\n                    System.out.println(\"wait\u7b49\u5f85\u88ab\u4e2d\u65ad\u4e86****\");\n                }\n            }\n        }\n    }\n\n}\n<\/code><\/pre>\n<h4>notify()\u4e0enotifyAll()<\/h4>\n<p>notify()\u4e00\u6b21\u53ea\u80fd\u5524\u9192\u4e00\u4e2a\u7ebf\u7a0b,\u5982\u679c\u6709\u591a\u4e2a\u7b49\u5f85\u7684\u7ebf\u7a0b,\u53ea\u80fd\u968f\u673a\u5524\u9192\u5176\u4e2d\u7684\u67d0\u4e00\u4e2a; \u60f3\u8981\u5524\u9192\u6240\u6709\u7b49\u5f85\u7ebf\u7a0b,\u9700\u8981\u8c03\u7528notifyAll()\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test04 {\n\n    public static void main(String[] args) throws InterruptedException {\n        Object lock = new Object();\n        SubThread t1 = new SubThread(lock);\n        SubThread t2 = new SubThread(lock);\n        SubThread t3 = new SubThread(lock);\n        t1.setName(\"t1\");\n        t2.setName(\"t2\");\n        t3.setName(\"t3\");\n        t1.start();\n        t2.start();\n        t3.start();\n\n        Thread.sleep(3000);\n        synchronized (lock){\n            \/\/ \u8c03\u7528\u4e00\u6b21notify()\u53ea\u80fd\u5524\u9192\u5176\u4e2d\u7684\u4e00\u4e2a\u7ebf\u7a0b,\u5176\u4ed6\u7b49\u5f85\u7684\u7ebf\u7a0b\u4f9d\u7136\u5904\u4e8e\u7b49\u5f85\u72b6\u6001,\n            \/\/ \u5bf9\u4e8e\u5904\u4e8e\u7b49\u5f85\u72b6\u6001\u7684\u7ebf\u7a0b\u6765\u8bf4,\u9519\u8fc7\u4e86\u901a\u77e5\u4fe1\u53f7,\u8fd9\u79cd\u73b0\u8c61\u4e5f\u79f0\u4e3a\u4fe1\u53f7\u4e22\u5931\n            \/\/ lock.notify();\n            lock.notifyAll();\n        }\n    }\n\n    static class SubThread extends Thread{\n        private Object lock;        \/\/\u5b9a\u4e49\u5b9e\u4f8b\u53d8\u91cf\u4f5c\u4e3a\u9501\u5bf9\u8c61\n        public SubThread(Object lock) {\n            this.lock = lock;\n        }\n\n        @Override\n        public void run() {\n            synchronized (lock){\n                try {\n                    System.out.println(\"begin wait...\");\n                    lock.wait();\n                    System.out.println(\"end wait..\");\n                } catch (InterruptedException e) {\n                    System.out.println(\"wait\u7b49\u5f85\u88ab\u4e2d\u65ad\u4e86****\");\n                }\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<h4>wait(long)\u7684\u4f7f\u7528<\/h4>\n<p>wait(long)\u5e26\u6709long\u7c7b\u578b\u53c2\u6570\u7684wait()\u7b49\u5f85,\u5982\u679c\u5728\u53c2\u6570\u6307\u5b9a\u7684\u65f6\u95f4\u5185\u6ca1\u6709\u88ab\u5524\u9192,\u8d85\u65f6\u540e\u4f1a\u81ea\u52a8\u5524\u9192\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">public class Test05 {\n    public static void main(String[] args) {\n        final Object obj = new Object();\n        Thread t = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                synchronized (obj){\n                    try {\n                        System.out.println(\"thread begin wait\");\n                        obj.wait(5000);         \/\/\u5982\u679c5000\u6beb\u79d2\u5185\u6ca1\u6709\u88ab\u5524\u9192 ,\u4f1a\u81ea\u52a8\u5524\u9192\n                        System.out.println(\"end wait....\");\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                }\n            }\n        });\n        t.start();\n    }\n}\n<\/code><\/pre>\n<h4>\u907f\u514d\u901a\u77e5\u8fc7\u65e9<\/h4>\n<p>\u7ebf\u7a0b<code>wait()<\/code>\u7b49\u5f85\u540e,\u53ef\u4ee5\u8c03\u7528<code>notify()<\/code>\u5524\u9192\u7ebf\u7a0b, \u5982\u679c<code>notify()<\/code>\u5524\u9192\u7684\u8fc7\u65e9,\u5728\u7b49\u5f85\u4e4b\u524d\u5c31\u8c03\u7528\u4e86<code>notify()<\/code>\u53ef\u80fd\u4f1a\u6253\u4e71\u7a0b\u5e8f\u6b63\u5e38\u7684\u8fd0\u884c\u903b\u8f91<\/p>\n<h4>wait\u7b49\u5f85\u6761\u4ef6\u53d1\u751f\u4e86\u53d8\u5316<\/h4>\n<p>\u5728\u4f7f\u7528wait\/nofity\u6a21\u5f0f\u65f6,\u6ce8\u610fwait\u6761\u4ef6\u53d1\u751f\u4e86\u53d8\u5316,\u4e5f\u53ef\u80fd\u4f1a\u9020\u6210\u903b\u8f91\u7684\u6df7\u4e71\u3002<\/p>\n<ol>\n<li>\u5b9a\u4e49\u4e00\u4e2a\u96c6\u5408<\/li>\n<li>\u5b9a\u4e49\u4e00\u4e2a\u7ebf\u7a0b\u5411\u96c6\u5408\u4e2d\u6dfb\u52a0\u6570\u636e,\u6dfb\u52a0\u5b8c\u6570\u636e\u540e\u901a\u77e5\u53e6\u5916\u7684\u7ebf\u7a0b\u4ece\u96c6\u5408\u4e2d\u53d6\u6570\u636e<\/li>\n<li>\u5b9a\u4e49\u4e00\u4e2a\u7ebf\u7a0b\u4ece\u96c6\u5408\u4e2d\u53d6\u6570\u636e,\u5982\u679c\u96c6\u5408\u4e2d\u6ca1\u6709\u6570\u636e\u5c31\u7b49\u5f85<\/li>\n<\/ol>\n<pre><code class=\"language-java line-numbers\">public class Test06 {\n\n    public static void main(String[] args) {\n        \/\/\u5b9a\u4e49\u6dfb\u52a0\u6570\u636e\u7684\u7ebf\u7a0b\u5bf9\u8c61\n        ThreadAdd threadAdd = new ThreadAdd();\n        \/\/\u5b9a\u4e49\u53d6\u6570\u636e\u7684\u7ebf\u7a0b\u5bf9\u8c61\n        ThreadSubtract threadSubtract = new ThreadSubtract();\n        threadSubtract.setName(\"subtract 1 \");\n\n        ThreadSubtract threadSubtract2 = new ThreadSubtract();\n        threadSubtract2.setName(\"subtract 2 \");\n\n        threadSubtract.start();\n        threadSubtract2.start();\n\n        threadAdd.start();\n    }\n\n    \/\/\u5b9a\u4e49\u4e00\u4e2a\u96c6\u5408\n    static List list = new ArrayList();\n\n    \/\/\u5b9a\u4e49\u4e00\u4e2a\u4ece\u96c6\u5408\u53d6\u6570\u636e\u7684\u65b9\u6cd5\n    public static void subtract(){\n        synchronized (list){\n            while (list.size() == 0) {\n                try {\n                    System.out.println(Thread.currentThread().getName() + \" begin wait....\");\n                    list.wait();        \/\/\u7b49\u5f85\n                    System.out.println(Thread.currentThread().getName() + \" end wait..\");\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n    }\n\n    \/\/\u5b9a\u4e49\u65b9\u6cd5\u5411\u96c6\u5408\u4e2d\u6dfb\u52a0\u6570\u636e\u540e,\u901a\u77e5\u7b49\u5f85\u7684\u7ebf\u7a0b\u53d6\u6570\u636e\n    public static void add(){\n        synchronized (list){\n            list.add(\"data\");\n            System.out.println( Thread.currentThread().getName() + \"\u5b58\u50a8\u4e86\u4e00\u4e2a\u6570\u636e\");\n            list.notifyAll();\n        }\n    }\n\n    static class ThreadAdd extends Thread{\n        @Override\n        public void run() {\n            add();\n        }\n    }\n\n    static class ThreadSubtract extends Thread{\n        @Override\n        public void run() {\n            subtract();\n        }\n    }\n\n}\n<\/code><\/pre>\n<h1>Java\u751f\u4ea7\u8005\u6d88\u8d39\u8005\u6a21\u5f0f<\/h1>\n<p>\u5728Java\u4e2d,\u8d1f\u8d23\u4ea7\u751f\u6570\u636e\u7684\u6a21\u5757\u662f\u751f\u4ea7\u8005,\u8d1f\u8d23\u4f7f\u7528\u6570\u636e\u7684\u6a21\u5757\u662f\u6d88\u8d39\u8005. \u751f\u4ea7\u8005\u6d88\u8d39\u8005\u89e3\u51b3\u6570\u636e\u7684\u5e73\u8861\u95ee\u9898,\u5373\u5148\u6709\u6570\u636e\u7136\u540e\u624d\u80fd\u4f7f\u7528,\u6ca1\u6709\u6570\u636e\u65f6,\u6d88\u8d39\u8005\u9700\u8981\u7b49\u5f85\u3002<\/p>\n<h4>\u751f\u4ea7-\u6d88\u8d39:\u64cd\u4f5c\u503c<\/h4>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\n\/**\n * \u5b9a\u4e49\u4e00\u4e2a\u64cd\u4f5c\u6570\u636e\u7684\u7c7b\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 15:10\n *\/\npublic class ValueOP {\n\n    private String value = \"\";\n\n    public void getValue() {\n        synchronized (this){\n            while (\"\".equalsIgnoreCase(value)) {\n                try {\n                    this.wait();\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n            \/\/\u4e0d\u662f\u7a7a\u4e32,\u8bfb\u53d6 \u5b57\u6bb5\u503c\n            System.out.println(\"get\u7684\u503c\u662f: \" + this.value);\n            this.value = \"\";\n            this.notifyAll();\n        }\n    }\n\n    \/\/\u5b9a\u4e49\u65b9\u6cd5\u4fee\u6539value\u5b57\u6bb5\u7684\u503c\n    public void setValue() {\n        synchronized (this){\n            while (!\"\".equalsIgnoreCase(value)){\n                try {\n                    this.wait();\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n            \/\/\u5982\u679cvalue\u5b57\u6bb5\u503c\u662f\u5bb9\u4e32, \u5c31\u8bbe\u7f6evalue\u5b57\u6bb5\u7684\u503c\n            String value = System.currentTimeMillis() + \" - \" + System.nanoTime();\n            System.out.println(\"set\u8bbe\u7f6e\u7684\u503c\u662f: \" + value);\n            this.value = value;\n            this.notifyAll();\n        }\n    }\n\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\n\/**\n * \u751f\u4ea7\u8005\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 15:20\n *\/\npublic class ProducerThread extends Thread{\n\n    private ValueOP valueOP;\n\n    public ProducerThread(ValueOP valueOP) {\n        this.valueOP = valueOP;\n    }\n\n    @Override\n    public void run() {\n        while (true){\n            valueOP.setValue();\n        }\n    }\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\n\/**\n * \u6d88\u8d39\u8005\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 15:22\n *\/\npublic class ConsumerThread extends Thread{\n    \/\/\u6d88\u8d39\u8005\u4f7f\u7528\u6570\u636e, \u5c31\u662f\u4f7f\u7528ValueOP\u7c7b\u7684value\u5b57\u6bb5\u503c\n    private ValueOP valueOP;\n\n    public ConsumerThread(ValueOP valueOP) {\n        this.valueOP = valueOP;\n    }\n\n    @Override\n    public void run() {\n        while (true){\n            valueOP.getValue();\n        }\n    }\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\n\/**\n * \u6d4b\u8bd5\u7c7b\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 15:24\n *\/\npublic class Test01 {\n    public static void main(String[] args) {\n        ValueOP valueOP = new ValueOP();\n\n        ProducerThread p1 = new ProducerThread(valueOP);\n        ProducerThread p2 = new ProducerThread(valueOP);\n        ProducerThread p3 = new ProducerThread(valueOP);\n        ConsumerThread c1 = new ConsumerThread(valueOP);\n        ConsumerThread c2 = new ConsumerThread(valueOP);\n        ConsumerThread c3 = new ConsumerThread(valueOP);\n\n        p1.start();\n        p2.start();\n        p3.start();\n        c1.start();\n        c2.start();\n        c3.start();\n    }\n}\n\n<\/code><\/pre>\n<h4>\u6a21\u62df\u64cd\u4f5c\u6808<\/h4>\n<p>\u4f7f\u751f\u4ea7\u8005\u628a\u6570\u636e\u5b58\u50a8\u5230List\u96c6\u5408\u4e2d, \u6d88\u8d39\u8005\u4eceList\u96c6\u5408\u4e2d\u53d6\u6570\u636e,\u4f7f\u7528List\u96c6\u5408\u6a21\u62df\u6808\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\/**\n * \u6a21\u62df\u6808\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 17:05\n *\/\npublic class MyStack {\n\n    \/\/\u5b9a\u4e49\u96c6\u5408\u6a21\u62df\u6808\n    private List list = new ArrayList();\n    \/\/\u96c6\u5408\u7684\u6700\u5927\u5bb9\u91cf\n    private static final int MAXSIZE = 3;\n\n    public synchronized void push(){\n        \/\/\u5f53\u6808\u4e2d\u7684\u6570\u636e\u5df2\u6ee1 \u5c31\u7b49\u5f85\n        while (list.size() &gt;= MAXSIZE) {\n            System.out.println(Thread.currentThread().getName() + \" begin  wait....\");\n            try {\n                this.wait();\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n\n        String data = \"data--\" + Math.random();\n        System.out.println( Thread.currentThread().getName() + \"\u6dfb\u52a0\u4e86\u6570\u636e: \" + data);\n        list.add(data);\n        this.notifyAll();\n    }\n\n    public synchronized void pop(){\n        while (list.size() == 0) {\n            try {\n                System.out.println(Thread.currentThread().getName() + \" begin  wait....\");\n                this.wait();\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n        System.out.println( Thread.currentThread().getName() + \"\u51fa\u6808\u6570\u636e:\" + list.remove(0) );\n        this.notifyAll();\n    }\n\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\n\/**\n * \u751f\u4ea7\u8005\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 15:20\n *\/\npublic class ProducerThreadStack extends Thread{\n\n    private MyStack myStack;\n\n    public ProducerThreadStack(MyStack myStack) {\n        this.myStack = myStack;\n    }\n\n    @Override\n    public void run() {\n        while (true){\n            myStack.push();\n        }\n    }\n\n\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\n\/**\n * \u6d88\u8d39\u8005\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 15:22\n *\/\npublic class ConsumerThreadStack extends Thread{\n    \/\/\u6d88\u8d39\u8005\u4f7f\u7528\u6570\u636e, \u5c31\u662f\u4f7f\u7528ValueOP\u7c7b\u7684value\u5b57\u6bb5\u503c\n    private MyStack myStack;\n\n    public ConsumerThreadStack(MyStack myStack) {\n        this.myStack = myStack;\n    }\n\n    @Override\n    public void run() {\n        while (true){\n            myStack.pop();\n        }\n    }\n}\n\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">package com.glj.producerdata;\n\n\/**\n * \u6d4b\u8bd5\u7c7b\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 15:24\n *\/\npublic class TestStack {\n    public static void main(String[] args) {\n        MyStack stack = new MyStack();\n\n        ProducerThreadStack  p = new ProducerThreadStack(stack);\n        ProducerThreadStack  p2 = new ProducerThreadStack(stack);\n        ProducerThreadStack  p3 = new ProducerThreadStack(stack);\n        ProducerThreadStack c1 = new ProducerThreadStack(stack);\n        ProducerThreadStack c2 = new ProducerThreadStack(stack);\n        ProducerThreadStack c3 = new ProducerThreadStack(stack);\n        p.setName(\"\u751f\u4ea7\u80051\u53f7\");\n        p2.setName(\"\u751f\u4ea7\u80052\u53f7\");\n        p3.setName(\"\u751f\u4ea7\u80053\u53f7\");\n        c1.setName(\"\u6d88\u8d39\u80051\u53f7\");\n        c2.setName(\"\u6d88\u8d39\u80052\u53f7\");\n        c3.setName(\"\u6d88\u8d39\u80053\u53f7\");\n\n        p.start();\n        p2.start();\n        p3.start();\n        c1.start();\n        c2.start();\n        c3.start();\n    }\n}\n\n<\/code><\/pre>\n<h1>Java\u7ebf\u7a0b\u4e2djoin\u65b9\u6cd5<\/h1>\n<p>\u5728\u4e3b\u7ebf\u7a0b\u4e2d\u542f\u52a8\u4e86\u5b50\u7ebf\u7a0b,\u5982\u679c\u5b50\u7ebf\u7a0b\u8981\u8fdb\u884c\u5927\u91cf\u8017\u65f6\u8fd0\u884c,\u4e3b\u7ebf\u7a0b\u5f80\u5f80\u65e9\u4e8e\u5b50\u7ebf\u7a0b\u7ed3\u675f\uff0c\u5982\u679c\u4e3b\u7ebf\u7a0b\u60f3\u7b49\u5728\u5b50\u7ebf\u7a0b\u7ed3\u675f\u540e\u518d\u7ed3\u675f,\u5982\u4e3b\u7ebf\u7a0b\u60f3\u8981\u4f7f\u7528\u5b50\u7ebf\u7a0b\u8fd0\u7b97\u7ed3\u679c\uff0c\u8fd9\u65f6\u5c31\u9700\u8981\u4f7f\u7528<code>join()<\/code>\u65b9\u6cd5, <code>join()<\/code>\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u7b49\u5f85\u7ebf\u7a0b\u5bf9\u8c61\u9500\u6bc1\uff0c\u5728\u5f53\u524d\u7ebf\u7a0b\u4e2d\u52a0\u5165\u5b50\u7ebf\u7a0b,\u5f53\u524d\u7ebf\u7a0b\u4f1a\u8f6c\u4e3a\u7b49\u5f85\u72b6\u6001\uff0c\u7b49\u5230\u5b50\u7ebf\u7a0b\u8fd0\u884c\u7ed3\u675f\u540e\uff0c\u5f53\u524d\u7ebf\u7a0b\u518d\u7ee7\u7eed\u5411\u4e0b\u6267\u884c\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.join;\n\nimport java.util.Random;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 17:23\n *\/\npublic class Test {\n\n\n    public static void main(String[] args) throws InterruptedException {\n\n        SubThread t = new SubThread();\n        t.start();\n        t.join();\n\n\n    }\n\n    static  class SubThread extends Thread{\n        @Override\n        public void run() {\n            int xx = new Random().nextInt(10000);\n            System.out.println(\"\u5728\u5b50\u7ebf\u7a0b\u4e2d\u4ea7\u751f\u4e86\u6570\u636e: \" + xx);\n            try {\n                Thread.sleep(xx);       \/\/\u6a21\u62df\u5b50\u7ebf\u7a0b\u8fd0\u884c\u8017\u65f6\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java ThreadLocal\u4f7f\u7528<\/h1>\n<p>\u9664\u4e86\u63a7\u5236\u8d44\u6e90\u7684\u8bbf\u95ee\u5916, \u8fd8\u53ef\u4ee5\u901a\u8fc7\u589e\u52a0\u8d44\u6e90\u6765\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\uff0cThreadLocal\u4e3b\u8981\u89e3\u51b3\u4e3a\u6bcf\u4e2a\u7ebf\u7a0b\u7ed1\u5b9a\u81ea\u5df1\u7684\u503c\u3002<\/p>\n<h4>ThreadLocal\u7684\u57fa\u672c\u4f7f\u7528<\/h4>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadlocal;\n\n\/**\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 17:30\n *\/\npublic class Test01 {\n\n    static ThreadLocal threadLocal = new ThreadLocal();\n\n    public static void main(String[] args) {\n        SubThread t1 = new SubThread();\n        SubThread t2 = new SubThread();\n\n        t1.start();\n        t2.start();\n    }\n\n    static class SubThread extends Thread{\n        @Override\n        public void run() {\n            for (int i = 0;i&lt;20;i++){\n                \/\/\u8bbe\u7f6e\u7ebf\u7a0b\u5173\u8054\u7684\u7684\u503c\n                threadLocal.set( Thread.currentThread().getName() + \" - \" + i);\n                \/\/\u8c03\u7528get()\u65b9\u6cd5\u8bfb\u53d6\u5173\u8054\u7684\u503c\n                System.out.println(Thread.currentThread().getName() + \" value = \" + threadLocal.get());\n            }\n        }\n\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java\u4e2d\u9501\u7684\u53ef\u91cd\u5165\u6027<\/h1>\n<p>\u5728JDK5\u4e2d\u589e\u52a0\u4e86Lock\u9501\u63a5\u53e3,\u6709ReentrantLock\u5b9e\u73b0\u7c7b,ReentrantLock\u9501\u79f0\u4e3a\u53ef\u91cd\u5165\u9501, \u5b83\u529f\u80fd\u6bd4synchronized\u591a\u3002<\/p>\n<h4>\u9501\u7684\u53ef\u91cd\u5165\u6027<\/h4>\n<p>\u9501\u7684\u53ef\u91cd\u5165\u662f\u6307,\u5f53\u4e00\u4e2a\u7ebf\u7a0b\u83b7\u5f97\u4e00\u4e2a\u5bf9\u8c61\u9501\u540e,\u518d\u6b21\u8bf7\u6c42\u8be5\u5bf9\u8c61\u9501\u65f6\u662f\u53ef\u4ee5\u83b7\u5f97\u8be5\u5bf9\u8c61\u7684\u9501\u7684\u3002<\/p>\n<p>\u6f14\u793a\u9501\u7684\u53ef\u91cd\u5165\u6027:<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.lock;\n\n\/**\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 17:34\n *\/\npublic class Test01 {\n\n    public static void main(String[] args) {\n        Test01 t1 = new Test01();\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                t1.sm1();\n            }\n        }).start();\n    }\n\n    private synchronized void sm1(){\n        System.out.println(\"\u540c\u6b65\u65b9\u6cd51\");\n        \/\/\u7ebf\u7a0b\u6267\u884csm1()\u65b9\u6cd5,\u9ed8\u8ba4this\u4f5c\u4e3a\u9501\u5bf9\u8c61,\u5728sm1()\u65b9\u6cd5\u4e2d\u8c03\u7528\u4e86sm2()\u65b9\u6cd5,\u6ce8\u610f\u5f53\u524d\u7ebf\u7a0b\u8fd8\u662f\u6301\u6709this\u9501\u5bf9\u8c61\u7684\n        \/\/sm2()\u540c\u6b65\u65b9\u6cd5\u9ed8\u8ba4\u7684\u9501\u5bf9\u8c61\u4e5f\u662fthis\u5bf9\u8c61, \u8981\u6267\u884csm2()\u5fc5\u987b\u5148\u83b7\u5f97this\u9501\u5bf9\u8c61,\u5f53\u524dthis\u5bf9\u8c61\u88ab\u5f53\u524d\u7ebf\u7a0b\u6301\u6709,\u53ef\u4ee5\u518d\u6b21\u83b7\u5f97this\u5bf9\u8c61, \u8fd9\u5c31\u662f\u9501\u7684\u53ef\u91cd\u5165\u6027. \u5047\u8bbe\u9501\u4e0d\u53ef\u91cd\u5165\u7684\u8bdd,\u53ef\u80fd\u4f1a\u9020\u6210\u6b7b\u9501\n        sm2();\n    }\n\n    private synchronized void sm2(){\n        System.out.println(\"\u540c\u6b65\u65b9\u6cd52\");\n        sm3();\n    }\n\n    private synchronized void sm3(){\n        System.out.println(\"\u540c\u6b65\u65b9\u6cd53\");\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java ReentrantLock\u4f7f\u7528<\/h1>\n<p>\u8c03\u7528lock()\u65b9\u6cd5\u83b7\u5f97\u9501, \u8c03\u7528unlock()\u91ca\u653e\u9501\u3002<\/p>\n<h4>Lock\u9501\u7684\u57fa\u672c\u4f7f\u7528:<\/h4>\n<pre><code class=\"language-java line-numbers\">package com.glj.lock;\n\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 21:26\n *\/\npublic class Test02 {\n    \/\/\u81ea\u5b9a\u4e49\u4e00\u4e2a\u663e\u793a\u9501\n    static Lock lock = new ReentrantLock();\n\n    public static void sm(){\n        lock.lock();\n        for (int i=0;i&lt;100;i++){\n            System.out.println(Thread.currentThread().getName() + \" -- \" + i);\n        }\n        lock.unlock();\n    }\n\n    public static void main(String[] args) {\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                sm();\n            }\n        };\n\n        new Thread(r).start();\n        new Thread(r).start();\n    }\n\n}\n\n<\/code><\/pre>\n<h4>\u4f7f\u7528Lock\u9501\u540c\u6b65\u4e0d\u540c\u65b9\u6cd5\u4e2d\u7684\u540c\u6b65\u4ee3\u7801\u5757<\/h4>\n<pre><code class=\"language-java line-numbers\">package com.glj.lock;\n\nimport java.util.Random;\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 21:42\n *\/\npublic class Test03 {\n\n    static Lock lock = new ReentrantLock();\n\n    public static void main(String[] args) {\n        Runnable r1 = new Runnable() {\n            @Override\n            public void run() {\n                sm1();\n            }\n        };\n\n        Runnable r2 = new Runnable() {\n            @Override\n            public void run() {\n                sm2();\n            }\n        };\n\n        new Thread(r1).start();\n        new Thread(r1).start();\n        new Thread(r1).start();\n        new Thread(r2).start();\n        new Thread(r2).start();\n        new Thread(r2).start();\n    }\n\n    public static void sm1(){\n        lock.lock();\/\/\u83b7\u5f97\u9501\n        try{\n            System.out.println(Thread.currentThread().getName() + \"-- method 1 -- \" + System.currentTimeMillis() );\n            Thread.sleep(new Random().nextInt(1000));\n            System.out.println(Thread.currentThread().getName() + \"-- method 1 -- \" + System.currentTimeMillis() );\n        }catch (Exception e){\n            e.printStackTrace();\n        }finally {\n            lock.unlock();\n        }\n    }\n\n    public static void sm2(){\n        lock.lock();\/\/\u83b7\u5f97\u9501\n        try{\n            System.out.println(Thread.currentThread().getName() + \"-- method 1 -- \" + System.currentTimeMillis() );\n            Thread.sleep(new Random().nextInt(1000));\n            System.out.println(Thread.currentThread().getName() + \"-- method 1 -- \" + System.currentTimeMillis() );\n        }catch (Exception e){\n            e.printStackTrace();\n        }finally {\n            lock.unlock();\n        }\n    }\n\n}\n\n<\/code><\/pre>\n<h4>ReentrantLock\u9501\u7684\u53ef\u91cd\u5165\u6027<\/h4>\n<pre><code class=\"language-java line-numbers\">package com.glj.lock;\n\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 22:32\n *\/\npublic class Test04 {\n\n    static class SubThread extends Thread{\n        private static Lock lock = new ReentrantLock();\n\n        public static int num = 0;\n\n        public static void main(String[] args) throws InterruptedException {\n            SubThread t1 = new SubThread();\n            SubThread t2 = new SubThread();\n            t1.start();\n            t2.start();\n            t1.join();\n            t2.join();\n            System.out.println( SubThread.num );\n        }\n\n\n        @Override\n        public void run() {\n            for (int i = 0; i &lt;10000 ; i++) {\n                try {\n                    \/\/\u53ef\u91cd\u5165\u9501\u6307\u53ef\u4ee5\u53cd\u590d\u83b7\u5f97\u8be5\u9501\n                    lock.lock();\n                    lock.lock();\n                    num++;\n                }finally {\n                    lock.unlock();\n                    lock.unlock();\n                }\n            }\n        }\n    }\n}\n\n<\/code><\/pre>\n<h1>lockInterruptibly()\u65b9\u6cd5<\/h1>\n<p><code>lockInterruptibly()<\/code>\u65b9\u6cd5\u7684\u4f5c\u7528\uff1a\u5982\u679c\u5f53\u524d\u7ebf\u7a0b\u672a\u88ab\u4e2d\u65ad\u5219\u83b7\u5f97\u9501,\u5982\u679c\u5f53\u524d\u7ebf\u7a0b\u88ab\u4e2d\u65ad\u5219\u51fa\u73b0\u5f02\u5e38\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.lock;\n\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/20\n * @Time: 22:38\n *\/\npublic class Test05 {\n\n    public static void main(String[] args) throws InterruptedException {\n        Servier  s = new Servier();\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                s.serviceMethod();\n            }\n        };\n        Thread t1 = new Thread(r);\n        t1.start();\n\n        Thread.sleep(50);\n        Thread t2 = new Thread(r);\n        t2.start();\n        Thread.sleep(50);\n        t2.interrupt();     \/\/\u4e2d\u65adt2\u7ebf\u7a0b\n    }\n\n    static class Servier{\n        private Lock lock1 = new ReentrantLock();\n\n        public void serviceMethod(){\n            try {\n                \/\/\u83b7\u5f97\u9501\u5b9a,\u5373\u4f7f\u8c03\u7528\u4e86\u7ebf\u7a0b\u7684interrupt()\u65b9\u6cd5,\u4e5f\u6ca1\u6709\u771f\u6b63\u7684\u4e2d\u65ad\u7ebf\u7a0b\n                lock1.lock();\n                \/\/\u5982\u679c\u7ebf\u7a0b\u88ab\u4e2d\u65ad\u4e86,\u4e0d\u4f1a\u83b7\u5f97\u9501,\u4f1a\u4ea7\u751f\u5f02\u5e38\n                lock1.lockInterruptibly();\n                System.out.println(Thread.currentThread().getName() + \"-- begin lock\");\n                \/\/\u6267\u884c\u4e00\u6bb5\u8017\u65f6\u7684\u64cd\u4f5c\n                for (int i = 0; i &lt; Integer.MAX_VALUE; i++) {\n                    new StringBuilder();\n                }\n                System.out.println( Thread.currentThread().getName() + \" -- end lock\");\n            } catch (Exception e) {\n                e.printStackTrace();\n            }finally {\n                lock1.unlock();\n                System.out.println( Thread.currentThread().getName() + \" ***** \u91ca\u653e\u9501\");\n            }\n        }\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java\u516c\u5e73\u9501\u4e0e\u975e\u516c\u5e73\u9501<\/h1>\n<p>\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u9501\u7684\u7533\u8bf7\u90fd\u662f\u975e\u516c\u5e73\u7684\uff0c \u5982\u679c\u7ebf\u7a0b1\u4e0e\u7ebf\u7a0b2\u90fd\u5728\u8bf7\u6c42\u9501A\uff0c\u5f53\u9501A\u53ef\u7528\u65f6\uff0c \u7cfb\u7edf\u53ea\u662f\u4f1a\u4ece\u963b\u585e\u961f\u5217\u4e2d\u968f\u673a\u7684\u9009\u62e9\u4e00\u4e2a\u7ebf\u7a0b, \u4e0d\u80fd\u4fdd\u8bc1\u5176\u516c\u5e73\u6027\u3002<\/p>\n<p>\u516c\u5e73\u7684\u9501\u4f1a\u6309\u7167\u65f6\u95f4\u5148\u540e\u987a\u5e8f,\u4fdd\u8bc1\u5148\u5230\u5148\u5f97, \u516c\u5e73\u9501\u7684\u8fd9\u4e00\u7279\u70b9\u4e0d\u4f1a\u51fa\u73b0\u7ebf\u7a0b\u9965\u997f\u73b0\u8c61\u3002<\/p>\n<p>synchronized\u5185\u90e8\u9501\u5c31\u662f\u975e\u516c\u5e73\u7684. ReentrantLock\u91cd\u5165\u9501\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6784\u9020\u65b9\u6cd5:ReentrantLock(boolean fair) ,\u5f53\u5728\u521b\u5efa\u9501\u5bf9\u8c61\u65f6\u5b9e\u53c2\u4f20\u9012true\u53ef\u4ee5\u628a\u8be5\u9501\u8bbe\u7f6e\u4e3a\u516c\u5e73\u9501. \u516c\u5e73\u9501\u770b\u8d77\u6765\u5f88\u516c\u5e73,\u4f46\u662f\u8981\u5b9e\u73b0\u516c\u5e73\u9501\u5fc5\u987b\u8981\u6c42\u7cfb\u7edf\u7ef4\u62a4\u4e00\u4e2a\u6709\u5e8f\u961f\u5217,\u516c\u5e73\u9501\u7684\u5b9e\u73b0\u6210\u672c\u8f83\u9ad8,\u6027\u80fd\u4e5f\u4f4e. \u56e0\u6b64\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u9501\u662f\u975e\u516c\u5e73\u7684. \u4e0d\u662f\u7279\u522b\u7684\u9700\u6c42,\u4e00\u822c\u4e0d\u4f7f\u7528\u516c\u5e73\u9501\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">\/**\n * \u516c\u5e73 \u9501\u4e0e\u975e\u516c\u5e73\u9501\n *\/\npublic class Test01 {\n\/\/    static ReentrantLock lock = new ReentrantLock();        \/\/\u9ed8\u8ba4\u662f\u975e\u516c\u5e73\u9501\n    static ReentrantLock lock = new ReentrantLock(true);        \/\/\u5b9a\u4e49\u516c\u5e73\u9501\n\n    public static void main(String[] args) {\n        Runnable runnable = new Runnable() {\n            @Override\n            public void run() {\n                while (true){\n                    try {\n                        lock.lock();\n                        System.out.println(Thread.currentThread().getName() + \" \u83b7\u5f97\u4e86\u9501\u5bf9\u8c61\");\n                    }finally {\n                        lock.unlock();\n                    }\n                }\n            }\n        };\n\n        for (int i = 0; i &lt; 5; i++) {\n            new Thread(runnable).start();\n        }\n        \/*\n            \u8fd0\u884c\u7a0b\u5e8f\n                1)\u5982\u679c\u662f\u975e\u516c\u5e73\u9501, \u7cfb\u7edf\u503e\u5411\u4e8e\u8ba9\u4e00\u4e2a\u7ebf\u7a0b\u518d\u6b21\u83b7\u5f97\u5df2\u7ecf\u6301\u6709\u7684\u9501, \u8fd9\u79cd\u5206\u914d\u7b56\u7565\u662f\u9ad8\u6548\u7684,\u975e\u516c\u5e73\u7684\n                2)\u5982\u679c\u662f\u516c\u5e73\u9501, \u591a\u4e2a\u7ebf\u7a0b\u4e0d\u4f1a\u53d1\u751f\u540c\u4e00\u4e2a\u7ebf\u7a0b\u8fde\u7eed\u591a\u6b21\u83b7\u5f97\u9501\u7684\u53ef\u80fd,\u4fdd\u8bc1\u4e86\u516c\u5e73\u6027\n         *\/\n    }\n}\n<\/code><\/pre>\n<h1>Lock\u9501\u7684\u5e38\u7528\u65b9\u6cd5<\/h1>\n<p>int getHoldCount() \u8fd4\u56de\u5f53\u524d\u7ebf\u7a0b\u8c03\u7528lock()\u65b9\u6cd5\u7684\u6b21\u6570\u3002<\/p>\n<p>int getQueueLength() \u8fd4\u56de\u6b63\u7b49\u5f85\u83b7\u5f97\u9501\u7684\u7ebf\u7a0b\u9884\u4f30\u6570\u3002<\/p>\n<p>int getWaitQueueLength(Condition condition) \u8fd4\u56de\u4e0eCondition\u6761\u4ef6\u76f8\u5173\u7684\u7b49\u5f85\u7684\u7ebf\u7a0b\u9884\u4f30\u6570\u3002<\/p>\n<p>boolean hasQueuedThread(Thread thread) \u67e5\u8be2\u53c2\u6570\u6307\u5b9a\u7684\u7ebf\u7a0b\u662f\u5426\u5728\u7b49\u5f85\u83b7\u5f97\u9501\u3002<\/p>\n<p>boolean hasQueuedThreads() \u67e5\u8be2\u662f\u5426\u8fd8\u6709\u7ebf\u7a0b\u5728\u7b49\u5f85\u83b7\u5f97\u8be5\u9501\u3002<\/p>\n<p>boolean hasWaiters(Condition condition) \u67e5\u8be2\u662f\u5426\u6709\u7ebf\u7a0b\u6b63\u5728\u7b49\u5f85\u6307\u5b9a\u7684Condition\u6761\u4ef6\u3002<\/p>\n<p>boolean isFair() \u5224\u65ad\u662f\u5426\u4e3a\u516c\u5e73\u9501\u3002<\/p>\n<p>boolean isHeldByCurrentThread() \u5224\u65ad\u5f53\u524d\u7ebf\u7a0b\u662f\u5426\u6301\u6709\u8be5\u9501\u3002<\/p>\n<p>boolean isLocked() \u67e5\u8be2\u5f53\u524d\u9501\u662f\u5426\u88ab\u7ebf\u7a0b\u6301\u6709\u3002<\/p>\n<h1>Java\u7ebf\u7a0b\u7ec4<\/h1>\n<p>\u7c7b\u4f3c\u4e8e\u5728\u8ba1\u7b97\u673a\u4e2d\u4f7f\u7528\u6587\u4ef6\u5939\u7ba1\u7406\u6587\u4ef6,\u4e5f\u53ef\u4ee5\u4f7f\u7528\u7ebf\u7a0b\u7ec4\u6765\u7ba1\u7406\u7ebf\u7a0b\uff0c\u5728\u7ebf\u7a0b\u7ec4\u4e2d\u5b9a\u4e49\u4e00\u7ec4\u76f8\u4f3c(\u76f8\u5173)\u7684\u7ebf\u7a0b\uff0c\u5728\u7ebf\u7a0b\u7ec4\u4e2d\u4e5f\u53ef\u4ee5\u5b9a\u4e49\u5b50\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<p>Thread\u7c7b\u6709\u51e0\u4e2a\u6784\u9020\u65b9\u6cd5\u5141\u8bb8\u5728\u521b\u5efa\u7ebf\u7a0b\u65f6\u6307\u5b9a\u7ebf\u7a0b\u7ec4,\u5982\u679c\u5728\u521b\u5efa\u7ebf\u7a0b\u65f6\u6ca1\u6709\u6307\u5b9a\u7ebf\u7a0b\u7ec4\u5219\u8be5\u7ebf\u7a0b\u5c31\u5c5e\u4e8e\u7236\u7ebf\u7a0b\u6240\u5728\u7684\u7ebf\u7a0b\u7ec4\uff0cJVM\u5728\u521b\u5efamain\u7ebf\u7a0b\u65f6\u4f1a\u4e3a\u5b83\u6307\u5b9a\u4e00\u4e2a\u7ebf\u7a0b\u7ec4,\u56e0\u6b64\u6bcf\u4e2aJava\u7ebf\u7a0b\u90fd\u6709\u4e00\u4e2a\u7ebf\u7a0b\u7ec4\u4e0e\u4e4b\u5173\u8054, \u53ef\u4ee5\u8c03\u7528\u7ebf\u7a0b\u7684getThreadGroup()\u65b9\u6cd5\u8fd4\u56de\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<p>\u7ebf\u7a0b\u7ec4\u5f00\u59cb\u662f\u51fa\u4e8e\u5b89\u5168\u7684\u8003\u8651\u8bbe\u8ba1\u7528\u6765\u533a\u5206\u4e0d\u540c\u7684Applet\uff0c\u7136\u800cThreadGroup\u5e76\u672a\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807,\u5728\u65b0\u5f00\u53d1\u7684\u7cfb\u7edf\u4e2d\uff0c\u5df2\u7ecf\u4e0d\u5e38\u7528\u7ebf\u7a0b\u7ec4\uff0c\u73b0\u5728\u4e00\u822c\u4f1a\u5c06\u4e00\u7ec4\u76f8\u5173\u7684\u7ebf\u7a0b\u5b58\u5165\u4e00\u4e2a\u6570\u7ec4\u6216\u4e00\u4e2a\u96c6\u5408\u4e2d\uff0c\u5982\u679c\u4ec5\u4ec5\u662f\u7528\u6765\u533a\u5206\u7ebf\u7a0b\u65f6,\u53ef\u4ee5\u4f7f\u7528\u7ebf\u7a0b\u540d\u79f0\u6765\u533a\u5206\uff0c\u591a\u6570\u60c5\u51b5\u4e0b,\u53ef\u4ee5\u5ffd\u7565\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<h2>Java\u521b\u5efa\u7ebf\u7a0b\u7ec4<\/h2>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadgroup;\n\n\/**\n * \u6f14\u793a\u521b\u5efa\u7ebf\u7a0b\u7ec4\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/21\n * @Time: 23:34\n *\/\npublic class Test01 {\n\n    public static void main(String[] args) {\n        \/\/ 1) \u8fd4\u56de\u5f53\u524dmain\u7ebf\u7a0b\u7684\u7ebf\u7a0b\u7ec4\n        ThreadGroup mainGroup  = Thread.currentThread().getThreadGroup();\n        System.out.println(\"mainGroup:\"+mainGroup);\n\n        \/\/2) \u5b9a\u4e49\u7ebf\u7a0b\u7ec4,\u5982\u679c\u4e0d\u6307\u5b9a\u6240\u5c5e\u7ebf\u7a0b\u7ec4,\u5219\u81ea\u52a8\u5f52\u5c5e\u5f53\u524d\u7ebf\u7a0b\u6240\u5c5e\u7684\u7ebf\u7a0b\u7ec4\u4e2d\n        ThreadGroup group1 = new ThreadGroup(\"group1\");\n        System.out.println(group1);\n\n        \/\/3)\u5b9a\u4e49\u7ebf\u7a0b\u7ec4, \u540c\u65f6\u6307\u5b9a\u7236\u7ebf\u7a0b\u7ec4\n        ThreadGroup group2 = new ThreadGroup(mainGroup, \"group2\");\n\n        System.out.println( group1.getParent() == mainGroup);\n        System.out.println( group2.getParent() == mainGroup);\n\n        \/\/4) \u5728\u521b\u5efa\u7ebf\u7a0b\u65f6\u6307\u5b9a\u6240\u5c5e\u7ebf\u7a0b\u7ec4\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(Thread.currentThread());\n            }\n        };\n\n        \/\/\u5728\u521b\u5efa\u7ebf\u7a0b\u65f6,\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u7ebf\u7a0b\u7ec4,\u5219\u9ed8\u8ba4\u7ebf\u7a0b\u5f52\u5c5e\u5230\u7236\u7ebf\u7a0b\u7684\u7ebf\u7a0b\u7ec4\u4e2d\n        \/\/\u5728main\u7ebf\u7a0b\u4e2d\u521b\u5efa\u4e86t1\u7ebf\u7a0b,\u79f0main\u7ebf\u7a0b\u4e3a\u7236\u7ebf\u7a0b,t1\u7ebf\u7a0b\u4e3a\u5b50\u7ebf\u7a0b, t1\u6ca1\u6709\u6307\u5b9a\u7ebf\u7a0b\u7ec4\u5219t1\u7ebf\u7a0b\u5c31\u5f52\u5c5e\u5230\u7236\u7ebf\u7a0bmain\u7ebf\u7a0b\u7684\u7ebf\u7a0b\u7ec4\u4e2d\n        Thread t1 = new Thread(r, \"t1\");\n        \/\/Thread[t1,5,main], t1\u7684\u7ebf\u7a0b\u7ec4\u662fmain\u7ebf\u7a0b\u7ec4\n        System.out.println( t1 );\n        \/\/\u521b\u5efa\u7ebf\u7a0b\u65f6,\u53ef\u4ee5\u6307\u5b9a\u7ebf\u7a0b\u6240\u5c5e\u7ebf\u7a0b\u7ec4\n        Thread t2 = new Thread(group1, r, \"t2\");\n        Thread t3 = new Thread(group2, r, \"t3\");\n        System.out.println(t2);\n        System.out.println(t3);\n\n    }\n\n}\n\n<\/code><\/pre>\n<h2>Java\u7ebf\u7a0b\u7ec4\u7684\u57fa\u672c\u64cd\u4f5c<\/h2>\n<h3>activeCount()<\/h3>\n<p>\u8fd4\u56de\u5f53\u524d\u7ebf\u7a0b\u7ec4\u53ca\u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u6d3b\u52a8\u7ebf\u7a0b\u7684\u6570\u91cf(\u8fd1\u4f3c\u503c)\u3002<\/p>\n<h3>activeGroupCount()<\/h3>\n<p>\u8fd4\u56de\u5f53\u524d\u7ebf\u7a0b\u7ec4\u53ca\u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u6d3b\u52a8\u7ebf\u7a0b\u7ec4\u7684\u6570\u91cf(\u8fd1\u4f3c\u503c)\u3002<\/p>\n<h3>int enumerate(Thread[] list)<\/h3>\n<p>\u5c06\u5f53\u524d\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u6d3b\u52a8\u7ebf\u7a0b\u590d\u5236\u5230\u53c2\u6570\u6570\u7ec4\u4e2d\u3002<\/p>\n<h3>enumerate(ThreadGroup[] list)<\/h3>\n<p>\u5c06\u5f53\u524d\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u6d3b\u52a8\u7ebf\u7a0b\u7ec4\u590d\u5236\u5230\u53c2\u6570\u6570\u7ec4\u4e2d\u3002<\/p>\n<h3>getMaxPriority()<\/h3>\n<p>\u8fd4\u56de\u7ebf\u7a0b\u7ec4\u7684\u6700\u5927\u4f18\u5148\u7ea7,\u9ed8\u8ba4\u662f10\u3002<\/p>\n<h3>getName()<\/h3>\n<p>\u8fd4\u56de\u7ebf\u7a0b\u7ec4\u7684\u540d\u79f0\u3002<\/p>\n<h3>getParent()<\/h3>\n<p>\u8fd4\u56de\u7236\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<h3>interrupt()<\/h3>\n<p>\u4e2d\u65ad\u7ebf\u7a0b\u7ec4\u4e2d\u6240\u6709\u7684\u7ebf\u7a0b\u3002<\/p>\n<h3>isDaemon()<\/h3>\n<p>\u5224\u65ad\u5f53\u524d\u7ebf\u7a0b\u7ec4\u662f\u5426\u4e3a\u5b88\u62a4\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<h3>list()<\/h3>\n<p>\u5c06\u5f53\u524d\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u6d3b\u52a8\u7ebf\u7a0b\u6253\u5370\u51fa\u6765\u3002<\/p>\n<h3>parentOf(ThreadGroup g)<\/h3>\n<p>\u5224\u65ad\u5f53\u524d\u7ebf\u7a0b\u7ec4\u662f\u5426\u4e3a\u53c2\u6570\u7ebf\u7a0b\u7ec4\u7684\u7236\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<h3>setDaemon(boolean daemon)<\/h3>\n<p>\u8bbe\u7f6e\u7ebf\u7a0b\u7ec4\u4e3a\u5b88\u62a4\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<h3>\u6f14\u793a\u7ebf\u7a0b\u7ec4\u7684\u57fa\u672c\u64cd\u4f5c<\/h3>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadgroup;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/21\n * @Time: 23:56\n *\/\npublic class Test02 {\n\n    public static void main(String[] args) {\n        ThreadGroup mainGroup  = Thread.currentThread().getThreadGroup();\n\n        ThreadGroup threadGroup = new ThreadGroup(\"threadGroup\");\n\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(\"-----------\u5f53\u524d\u7ebf\u7a0b: \" + Thread.currentThread());\n                try {\n                    Thread.sleep(1000);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        };\n\n        Thread t1 = new Thread(r,\"t1\");\n\n        Thread t2 = new Thread(threadGroup,r,\"t2\");\n\n        t1.start();\n        t2.start();\n\n        \/\/\u6253\u5370\u7ebf\u7a0b\u7ec4\u7684\u76f8\u5173\u5c5e\u6027\n        System.out.println(\"main \u7ebf\u7a0b\u7ec4\u4e2d\u6d3b\u52a8\u7ebf\u7a0b\u6570\u91cf: \" + mainGroup.activeCount());\n        System.out.println(\"group \u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u6d3b\u52a8\u7ebf\u7a0b\u6570\u91cf: \" + threadGroup.activeCount());    \/\/1,  t2\n        System.out.println(\"main\u7ebf\u7a0b\u7ec4\u4e2d\u5b50\u7ebf\u7a0b\u7ec4\u6570\u91cf: \" + mainGroup.activeGroupCount());  \/\/1,  group\n        System.out.println(\"group\u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u5b50\u7ebf\u7a0b\u7ec4\u6570\u91cf: \" + threadGroup.activeGroupCount());    \/\/0\n        System.out.println(\"main\u7ebf\u7a0b\u7ec4\u7684\u7236\u7ebf\u7a0b\u7ec4: \" + mainGroup.getParent());   \/\/main\u7ebf\u7a0b\u7ec4\u7684\u7236\u7ebf\u7a0b\u7ec4\u662fsystem\n        System.out.println(\"group\u7ebf\u7a0b\u7ec4\u7684\u7236\u7ebf\u7a0b\u7ec4: \" + threadGroup.getParent());  \/\/main\n        System.out.println( mainGroup.parentOf(mainGroup));  \/\/true, \u7ebf\u7a0b\u7ec4\u4e5f\u662f\u5b83\u81ea\u5df1\u7684\u7236\u7ebf\u7a0b\u7ec4\n        System.out.println( mainGroup.parentOf(threadGroup));     \/\/true\n        mainGroup.list();   \/\/\u628amain\u7ebf\u7a0b\u7ec4\u4e2d\u6240\u6709\u7684\u7ebf\u7a0b\u6253\u5370\u8f93\u51fa\n    }\n\n}\n\n<\/code><\/pre>\n<h2>\u590d\u5236\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u7ebf\u7a0b\u53ca\u5b50\u7ebf\u7a0b\u7ec4<\/h2>\n<h3>enumerate(Thread[] list)<\/h3>\n<p>\u628a\u5f53\u524d\u7ebf\u7a0b\u7ec4\u548c\u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u6240\u6709\u7684\u7ebf\u7a0b\u590d\u5236\u5230\u53c2\u6570\u6570\u7ec4\u4e2d\u3002<\/p>\n<h3>enumerate(Thread[] list, boolean recursive)<\/h3>\n<p>\u5982\u679c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u8bbe\u7f6e\u4e3afalse,\u5219\u53ea\u590d\u5236\u5f53\u524d\u7ebf\u7a0b\u7ec4\u4e2d\u6240\u6709\u7684\u7ebf\u7a0b,\u4e0d\u590d\u5236\u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u7ebf\u7a0b\u3002<\/p>\n<h3>enumerate(ThreadGroup[] list)<\/h3>\n<p>\u628a\u5f53\u524d\u7ebf\u7a0b\u7ec4\u548c\u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u6240\u6709\u7684\u7ebf\u7a0b\u7ec4\u590d\u5236\u5230\u53c2\u6570\u6570\u7ec4\u4e2d\u3002<\/p>\n<h3>enumerate(ThreadGroup[] list, boolean recurse)<\/h3>\n<p>\u7b2c\u4e8c\u4e2a\u53c2\u6570\u8bbe\u7f6efalse,\u5219\u53ea\u590d\u5236\u5f53\u524d\u7ebf\u7a0b\u7ec4\u7684\u5b50\u7ebf\u7a0b\u7ec4\u3002<\/p>\n<h3>\u6f14\u793a\u590d\u5236\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u5185\u5bb9<\/h3>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadgroup;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 0:08\n *\/\npublic class Test03 {\n\n    public static void main(String[] args) {\n        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();\n\n        \/\/main\u7ebf\u7a0b\u7ec4\u4e2d\u5b9a\u4e49\u4e86\u4e24\u4e2a\u5b50\u7ebf\u7a0b\u7ec4\n\n        ThreadGroup group1 = new ThreadGroup(\"group1\");\n        ThreadGroup group2 = new ThreadGroup(mainGroup, \"group2\");\n\n\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                while (true){\n                    System.out.println(\"----\u5f53\u524d\u7ebf\u7a0b: \" + Thread.currentThread());\n                    try {\n                        Thread.sleep(1000);\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                }\n            }\n        };\n\n        \/\/\u521b\u5efa\u5e76\u542f\u52a8\u4e09\u4e2a\u7ebf\u7a0b\n        Thread t1 = new Thread(r, \"t1\");\n        Thread t2 = new Thread(group1, r, \"t2\");\n        Thread t3 = new Thread(group2, r, \"t3\");\n\n        t1.start();\n        t2.start();\n        t3.start();\n\n        Thread[] threadList = new Thread[mainGroup.activeCount()];\n\n        \/\/\u628amain\u7ebf\u7a0b\u7ec4\u5305\u62ec\u5b50\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u6240\u6709\u7684\u7ebf\u7a0b\u590d\u5236\u5230\u6570\u7ec4\u4e2d\n        mainGroup.enumerate(threadList);\n        for (Thread thread : threadList) {\n            System.out.println(thread);\n        }\n        System.out.println(\"----------------------------\");\n\n        \/\/\u53ea\u628amain\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u7ebf\u7a0b\u590d\u5236\u5230\u6570\u7ec4\u4e2d,\u4e0d\u5305\u542b\u5b50\u7ebf\u7a0b\u7ec4\u7684\u7ebf\u7a0b\n        mainGroup.enumerate(threadList, false);\n        \/\/\u904d\u5386threadList\u6570\u7ec4\n        for (Thread thread : threadList) {\n            System.out.println(thread);\n        }\n        System.out.println(\"----------------------------\");\n\n        \/\/2) \u628amain\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u5b50\u7ebf\u7a0b\u7ec4\u590d\u5236\u5230\u6570\u7ec4\u4e2d\n        \/\/\u5b9a\u4e49\u6570\u7ec4\u5b58\u50a8\u7ebf\u7a0b\u7ec4\n        ThreadGroup [] threadGroups = new ThreadGroup[mainGroup.activeGroupCount()];\n        \/\/\u628amain\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u5b50\u7ebf\u7a0b\u7ec4\u590d\u5236\u5230\u6570\u7ec4\u4e2d\n        mainGroup.enumerate(threadGroups);\n        System.out.println(\"============================\");\n        for (ThreadGroup threadGroup : threadGroups) {\n            System.out.println(threadGroup);\n        }\n\n    }\n\n\n}\n\n<\/code><\/pre>\n<h2>\u7ebf\u7a0b\u7ec4\u7684\u6279\u91cf\u4e2d\u65ad<\/h2>\n<p>\u7ebf\u7a0b\u7ec4\u7684<code>interrupt()<\/code> \u53ef\u4ee5\u7ed9\u8be5\u7ebf\u7a0b\u7ec4\u4e2d\u6240\u6709\u7684\u6d3b\u52a8\u7ebf\u7a0b\u6dfb\u52a0\u4e2d\u65ad\u6807\u5fd7\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadgroup;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 0:15\n *\/\npublic class Test04 {\n\n    public static void main(String[] args) throws InterruptedException {\n\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(\"\u5f53\u524d\u7ebf\u7a0b--\" + Thread.currentThread() + \"--\u5f00\u59cb\u5faa\u73af\");\n                \/\/\u5f53\u7ebf\u7a0b\u6ca1\u6709\u88ab\u4e2d\u65ad\u5c31\u4e00\u76f4\u5faa\u73af\n                while (Thread.currentThread().isInterrupted()) {\n                    System.out.println(Thread.currentThread().getName() + \"------------------\");\n                    try {\n                        Thread.sleep(500);\n                    } catch (InterruptedException e) {\n                        \/\/\u5982\u679c\u4e2d\u65ad\u7761\u7720\u4e2d\u7684\u7ebf\u7a0b,\u4ea7\u751f\u4e2d\u65ad\u5f02\u5e38, \u540c\u65f6\u4f1a\u6e05\u9664\u4e2d\u65ad\u6807\u5fd7\n                        e.printStackTrace();\n                    }\n                }\n                System.out.println(Thread.currentThread().getName() + \"\u5faa\u73af\u7ed3\u675f\");\n            }\n        };\n\n        \/\/\u521b\u5efa\u7ebf\u7a0b\u7ec4\n        ThreadGroup group = new ThreadGroup(\"group\");\n        \/\/\u5728group\u7ebf\u7a0b\u7ec4\u4e2d\u521b\u5efa5\u4e2a\u7ebf\u7a0b\n        for (int i = 0; i &lt; 5; i++) {\n            new Thread(group,r,\"T\"+i).start();\n        }\n\n        \/\/main\u7ebf\u7a0b\u7761\u77202\u79d2\n        Thread.sleep(50);\n        \/\/\u4e2d\u65ad\u7ebf\u7a0b\u7ec4, \u4f1a\u4e2d\u65ad\u7ebf\u7a0b\u7ec4\u4e2d\u6240\u6709\u7684\u7ebf\u7a0b\n        group.interrupt();\n\n\n    }\n}\n\n<\/code><\/pre>\n<h2>\u8bbe\u7f6e\u5b88\u62a4\u7ebf\u7a0b\u7ec4<\/h2>\n<p>\u5b88\u62a4\u7ebf\u7a0b\u662f\u4e3a\u5176\u4ed6\u7ebf\u7a0b\u63d0\u4f9b\u670d\u52a1\u7684,\u5f53JVM\u4e2d\u53ea\u6709\u5b88\u62a4\u7ebf\u7a0b\u65f6,\u5b88\u62a4\u7ebf\u7a0b\u4f1a\u81ea\u52a8\u9500\u6bc1,JVM\u4f1a\u9000\u51fa\u3002<\/p>\n<p>\u8c03\u7528\u7ebf\u7a0b\u7ec4\u7684<code>setDaemon(true)<\/code>\u53ef\u4ee5\u628a\u7ebf\u7a0b\u7ec4\u8bbe\u7f6e\u4e3a\u5b88\u62a4\u7ebf\u7a0b\u7ec4,\u5f53\u5b88\u62a4\u7ebf\u7a0b\u7ec4\u4e2d\u6ca1\u6709\u4efb\u4f55\u6d3b\u52a8\u7ebf\u7a0b\u65f6,\u5b88\u62a4\u7ebf\u7a0b\u7ec4\u4f1a\u81ea\u52a8\u9500\u6bc1\u3002<\/p>\n<p>\u6ce8\u610f\u7ebf\u7a0b\u7ec4\u7684\u5b88\u62a4\u5c5e\u6027,\u4e0d\u5f71\u54cd\u7ebf\u7a0b\u7ec4\u4e2d\u7ebf\u7a0b\u7684\u5b88\u62a4\u5c5e\u6027,\u6216\u8005\u8bf4\u5b88\u62a4\u7ebf\u7a0b\u7ec4\u4e2d\u7684\u7ebf\u7a0b\u53ef\u4ee5\u662f\u975e\u5b88\u62a4\u7ebf\u7a0b\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadgroup;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 0:18\n *\/\npublic class Test05 {\n\n    public static void main(String[] args) throws InterruptedException {\n\n        ThreadGroup threadGroup = new ThreadGroup(\"group\");\n\n        \/\/\u8bbe\u7f6e\u7ebf\u7a0b\u7ec4\u4e3a\u5b88\u62a4\u7ebf\u7a0b\u7ec4\n        threadGroup.setDaemon(true);\n\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                for (int j = 0; j &lt; 20; j++) {\n                    System.out.println(Thread.currentThread().getName() + \" -- \" + j);\n                    try {\n                        Thread.sleep(500);\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                }\n            }\n        };\n\n        for (int i=0;i&lt;5;i++){\n            new Thread(threadGroup,r,\"t\"+i).start();\n        }\n\n        \/\/main\u7ebf\u7a0b\u7761\u77205\u79d2\n        Thread.sleep(5000);\n        System.out.println(\"main...end....\");\n\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java\u591a\u7ebf\u7a0b\u6355\u83b7\u5f02\u5e38\u5904\u7406<\/h1>\n<p>\u5728\u7ebf\u7a0b\u7684run\u65b9\u6cd5\u4e2d\uff0c\u5982\u679c\u6709\u53d7\u68c0\u5f02\u5e38\u5fc5\u987b\u8fdb\u884c\u6355\u83b7\u5904\u7406\uff0c\u5982\u679c\u60f3\u8981\u83b7\u5f97<code>run()<\/code>\u65b9\u6cd5\u4e2d\u51fa\u73b0\u7684\u8fd0\u884c\u65f6\u5f02\u5e38\u4fe1\u606f\uff0c\u53ef\u4ee5\u901a\u8fc7\u56de\u8c03<code>UncaughtExceptionHandler<\/code>\u63a5\u53e3\u83b7\u5f97\u54ea\u4e2a\u7ebf\u7a0b\u51fa\u73b0\u4e86\u8fd0\u884c\u65f6\u5f02\u5e38\uff0c\u5728Thread\u7c7b\u4e2d\u6709\u5173\u5904\u7406\u8fd0\u884c\u5f02\u5e38\u7684\u65b9\u6cd5\u6709:<\/p>\n<h3>getDefaultUncaughtExceptionHandler()<\/h3>\n<p>\u83b7\u5f97\u5168\u5c40\u7684(\u9ed8\u8ba4\u7684)<code>UncaughtExceptionHandler<\/code>\u3002<\/p>\n<h3>getUncaughtExceptionHandler()<\/h3>\n<p>\u83b7\u5f97\u5f53\u524d\u7ebf\u7a0b\u7684<code>UncaughtExceptionHandler<\/code>\u3002<\/p>\n<h3>setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)<\/h3>\n<p>\u8bbe\u7f6e\u5168\u5c40\u7684<code>UncaughtExceptionHandler<\/code>\u3002<\/p>\n<h3>setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)<\/h3>\n<p>\u8bbe\u7f6e\u5f53\u524d\u7ebf\u7a0b\u7684<code>UncaughtExceptionHandler<\/code>\u3002<\/p>\n<p>\u5f53\u7ebf\u7a0b\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u5f02\u5e38,JVM\u4f1a\u8c03\u7528Thread\u7c7b\u7684<code>dispatchUncaughtException(Throwable e)<\/code>\u65b9\u6cd5, \u8be5\u65b9\u6cd5\u4f1a\u8c03\u7528<code>getUncaughtExceptionHandler().uncaughtException(this, e)<\/code>; \u5982\u679c\u60f3\u8981\u83b7\u5f97\u7ebf\u7a0b\u4e2d\u51fa\u73b0\u5f02\u5e38\u7684\u4fe1\u606f,\u5c31\u9700\u8981\u8bbe\u7f6e\u7ebf\u7a0b\u7684<code>UncaughtExceptionHandler<\/code>\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadexception;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 15:37\n *\/\npublic class Test01 {\n\n    public static void main(String[] args) {\n\n         \/*\n            \u5728\u5b9e\u9645\u5f00\u53d1\u4e2d,\u8fd9\u79cd\u8bbe\u8ba1\u5f02\u5e38\u5904\u7406\u7684\u65b9\u5f0f\u8fd8\u662f\u6bd4\u8f83\u5e38\u7528\u7684,\u5c24\u5176\u662f\u5f02\u5e38\u6267\u884c\u7684\u65b9\u6cd5\n            \u5982\u679c\u7ebf\u7a0b\u4ea7\u751f\u4e86\u5f02\u5e38, JVM\u4f1a\u8c03\u7528dispatchUncaughtException()\u65b9\u6cd5,\u5728\u8be5\u65b9\u6cd5\u4e2d\u8c03\u7528\u4e86getUncaughtExceptionHandler().uncaughtException(this, e);\n            \u5982\u679c\u5f53\u524d\u7ebf\u7a0b\u8bbe\u7f6e\u4e86UncaughtExceptionHandler\u56de\u8c03\u63a5\u53e3\u5c31\u76f4\u63a5\u8c03\u7528\u5b83\u81ea\u5df1\u7684uncaughtException\u65b9\u6cd5,\n            \u5982\u679c\u6ca1\u6709\u8bbe\u7f6e\u5219\u8c03\u7528\u5f53\u524d\u7ebf\u7a0b\u6240\u5728\u7ebf\u7a0b\u7ec4UncaughtExceptionHandler\u56de\u8c03\u63a5\u53e3\u7684uncaughtException\u65b9\u6cd5,\u5982\u679c\u7ebf\u7a0b\u7ec4\u4e5f\u6ca1\u6709\u8bbe\u7f6e\u56de\u8c03\u63a5\u53e3,\u5219\u76f4\u63a5\u628a\u5f02\u5e38\u7684\u6808\u4fe1\u606f\u5b9a\u5411\u5230System.err\u4e2d\n         *\/\n\n        \/\/\u8bbe\u7f6e\u7ebf\u7a0b\u5168\u5c40\u7684\u56de\u8c03\u63a5\u53e3\n        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){\n            @Override\n            public void uncaughtException(Thread t, Throwable e) {\n                \/\/t\u53c2\u6570\u63a5\u6536\u53d1\u751f\u5f02\u5e38\u7684\u7ebf\u7a0b, e\u5c31\u662f\u8be5\u7ebf\u7a0b\u4e2d\u7684\u5f02\u5e38\n                System.out.println(t.getName() + \"\u7ebf\u7a0b\u4ea7\u751f\u4e86\u5f02\u5e38: \" + e.getMessage());\n            }\n        });\n\n\n        Thread t1 = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(Thread.currentThread().getName() + \"\u5f00\u59cb\u8fd0\u884c\");\n                try {\n                    Thread.sleep(2000);\n                } catch (InterruptedException e) {\n                    \/\/\u7ebf\u7a0b\u4e2d\u7684\u53d7\u68c0\u5f02\u5e38\u5fc5\u987b\u6355\u83b7\u5904\u7406\n                    e.printStackTrace();\n                }\n                \/\/\u4f1a\u4ea7\u751f\u7b97\u672f\u5f02\u5e38\n                System.out.println(12 \/ 0 );\n            }\n        });\n\n        t1.start();\n\n        Thread t2 = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(Thread.currentThread().getName() + \"\u5f00\u59cb\u8fd0\u884c\");\n                String txt = null;\n                \/\/\u4f1a\u4ea7\u751f\u7a7a\u6307\u9488\u5f02\u5e38\n                System.out.println( txt.length());\n            }\n        });\n        t2.start();\n\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Hook\u94a9\u5b50\u7ebf\u7a0b\u6ce8\u5165<\/h1>\n<p>\u73b0\u5728\u5f88\u591a\u8f6f\u4ef6\u5305\u62ecMySQL, Zookeeper, kafka\u7b49\u90fd\u5b58\u5728Hook\u7ebf\u7a0b\u7684\u6821\u9a8c\u673a\u5236, \u76ee\u7684\u662f\u6821\u9a8c\u8fdb\u7a0b\u662f\u5426\u5df2\u542f\u52a8,\u9632\u6b62\u91cd\u590d\u542f\u52a8\u7a0b\u5e8f\u3002<\/p>\n<p>Hook\u7ebf\u7a0b\u4e5f\u79f0\u4e3a\u94a9\u5b50\u7ebf\u7a0b, \u5f53JVM\u9000\u51fa\u7684\u65f6\u5019\u4f1a\u6267\u884cHook\u7ebf\u7a0b.\u7ecf\u5e38\u5728\u7a0b\u5e8f\u542f\u52a8\u65f6\u521b\u5efa\u4e00\u4e2a.lock\u6587\u4ef6, \u7528.lock\u6587\u4ef6\u6821\u9a8c\u7a0b\u5e8f\u662f\u5426\u542f\u52a8,\u5728\u7a0b\u5e8f\u9000\u51fa(JVM\u9000\u51fa)\u65f6\u5220\u9664\u8be5.lock\u6587\u4ef6, \u5728Hook\u7ebf\u7a0b\u4e2d\u9664\u4e86\u9632\u6b62\u91cd\u65b0\u542f\u52a8\u8fdb\u7a0b\u5916,\u8fd8\u53ef\u4ee5\u505a\u8d44\u6e90\u91ca\u653e, \u5c3d\u91cf\u907f\u514d\u5728Hook\u7ebf\u7a0b\u4e2d\u8fdb\u884c\u590d\u6742\u7684\u64cd\u4f5c\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">package com.glj.hook;\n\nimport java.io.IOException;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.concurrent.TimeUnit;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 15:47\n *\/\npublic class Test01 {\n\n\n    public static void main(String[] args) {\n        \/\/1)\u6ce8\u5165Hook\u7ebf\u7a0b,\u5728\u7a0b\u5e8f\u9000\u51fa\u65f6\u5220\u9664.lock\u6587\u4ef6\n        Runtime.getRuntime().addShutdownHook(new Thread(){\n            @Override\n            public void run() {\n                System.out.println(\"JVM\u9000\u51fa,\u4f1a\u542f\u52a8\u5f53\u524dHook\u7ebf\u7a0b,\u5728Hook\u7ebf\u7a0b\u4e2d\u5220\u9664.lock\u6587\u4ef6\");\n                getLockFile().toFile().delete();\n            }\n        });\n\n        \/\/2)\u7a0b\u5e8f\u8fd0\u884c\u65f6,\u68c0\u67e5lock\u6587\u4ef6\u662f\u5426\u5b58\u5728,\u5982\u679clock\u6587\u4ef6\u5b58\u5728,\u5219\u629b\u51fa\u5f02\u5e38\n        System.out.println(\"getLockFile().toFile():\"+getLockFile().toFile());\n        if (getLockFile().toFile().exists()) {\n            throw  new RuntimeException(\"\u7a0b\u5e8f\u5df2\u542f\u52a8\");\n        }else {\n            \/\/\u6587\u4ef6\u4e0d\u5b58\u5728,\u8bf4\u660e\u7a0b\u5e8f\u662f\u7b2c\u4e00\u6b21\u542f\u52a8,\u521b\u5efalock\u6587\u4ef6\n            try {\n                getLockFile().toFile().createNewFile();\n                System.out.println(\"\u7a0b\u5e8f\u5728\u542f\u52a8\u65f6\u521b\u5efa\u4e86lock\u6587\u4ef6\");\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n\n        }\n\n        \/\/\u6a21\u62df\u7a0b\u5e8f\u8fd0\u884c\n        for (int i = 0; i &lt; 10; i++) {\n            System.out.println(\"\u7a0b\u5e8f\u6b63\u5728\u8fd0\u884c\");\n            try {\n                TimeUnit.SECONDS.sleep(1);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n\n    }\n\n    private static Path getLockFile(){\n        return Paths.get(\"\", \"tmp.lock\");\n    }\n\n\n}\n\n<\/code><\/pre>\n<h1>Java\u7ebf\u7a0b\u6c60\u662f\u4ec0\u4e48<\/h1>\n<p>\u53ef\u4ee5\u4ee5 new Thread( () -> { \u7ebf\u7a0b\u6267\u884c\u7684\u4efb\u52a1 }).start(); \u8fd9\u79cd\u5f62\u5f0f\u5f00\u542f\u4e00\u4e2a\u7ebf\u7a0b. \u5f53run()\u65b9\u6cd5\u8fd0\u884c\u7ed3\u675f,\u7ebf\u7a0b\u5bf9\u8c61\u4f1a\u88abGC\u91ca\u653e\u3002<\/p>\n<p>\u5728\u771f\u5b9e\u7684\u751f\u4ea7\u73af\u5883\u4e2d,\u53ef\u80fd\u9700\u8981\u5f88\u591a\u7ebf\u7a0b\u6765\u652f\u6491\u6574\u4e2a\u5e94\u7528,\u5f53\u7ebf\u7a0b\u6570\u91cf\u975e\u5e38\u591a\u65f6 ,\u53cd\u800c\u4f1a\u8017\u5c3dCPU\u8d44\u6e90. \u5982\u679c\u4e0d\u5bf9\u7ebf\u7a0b\u8fdb\u884c\u63a7\u5236\u4e0e\u7ba1\u7406,\u53cd\u800c\u4f1a\u5f71\u54cd\u7a0b\u5e8f\u7684\u6027\u80fd. \u7ebf\u7a0b\u5f00\u9500\u4e3b\u8981\u5305\u62ec: \u521b\u5efa\u4e0e\u542f\u52a8\u7ebf\u7a0b\u7684\u5f00\u9500; \u7ebf\u7a0b\u9500\u6bc1\u5f00\u9500; \u7ebf\u7a0b\u8c03\u5ea6\u7684\u5f00\u9500; \u7ebf\u7a0b\u6570\u91cf\u53d7\u9650CPU\u5904\u7406\u5668\u6570\u91cf\u3002<\/p>\n<p>\u7ebf\u7a0b\u6c60\u5c31\u662f\u6709\u6548\u4f7f\u7528\u7ebf\u7a0b\u7684\u4e00\u79cd\u5e38\u7528\u65b9\u5f0f. \u7ebf\u7a0b\u6c60\u5185\u90e8\u53ef\u4ee5\u9884\u5148\u521b\u5efa\u4e00\u5b9a\u6570\u91cf\u7684\u5de5\u4f5c\u7ebf\u7a0b,\u5ba2\u6237\u7aef\u4ee3\u7801\u76f4\u63a5\u5c06\u4efb\u52a1\u4f5c\u4e3a\u4e00\u4e2a\u5bf9\u8c61\u63d0\u4ea4\u7ed9\u7ebf\u7a0b\u6c60, \u7ebf\u7a0b\u6c60\u5c06\u8fd9\u4e9b\u4efb\u52a1\u7f13\u5b58\u5728\u5de5\u4f5c\u961f\u5217\u4e2d, \u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u4e0d\u65ad\u5730\u4ece\u961f\u5217\u4e2d\u53d6\u51fa\u4efb\u52a1\u5e76\u6267\u884c\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\u7b14\u8bb0\u56fe\u7247\/1588154331@deda20d16eb29ee171bf8ec3bd985b71.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"\u7b14\u8bb0\u56fe\u7247\/1588154331@deda20d16eb29ee171bf8ec3bd985b71.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<h1>\u591a\u7ebf\u7a0bJDK\u7ebf\u7a0b\u6c60<\/h1>\n<p>JDK\u63d0\u4f9b\u4e86\u4e00\u5957Executor\u6846\u67b6,\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u6709\u6548\u7684\u4f7f\u7528\u7ebf\u7a0b\u6c60\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\u7b14\u8bb0\u56fe\u7247\/1588154362@ba88e3cf647773d5b8c762457cbaa0fb.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"\u7b14\u8bb0\u56fe\u7247\/1588154362@ba88e3cf647773d5b8c762457cbaa0fb.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<h3>\u7ebf\u7a0b\u6c60\u7684\u57fa\u672c\u4f7f\u7528<\/h3>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadpool;\n\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 16:04\n *\/\npublic class Test01 {\n\n    public static void main(String[] args) {\n\n        \/\/\u521b\u5efa\u67095\u4e2a\u7ebf\u7a0b\u5927\u5c0f\u7684\u7ebf\u7a0b\u6c60\n        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);\n\n        \/\/\u5411\u7ebf\u7a0b\u6c60\u4e2d\u63d0\u4ea418\u4e2a\u4efb\u52a1,\u8fd918\u4e2a\u4efb\u52a1\u5b58\u50a8\u5230\u7ebf\u7a0b\u6c60\u7684\u963b\u585e\u961f\u5217\u4e2d, \u7ebf\u7a0b\u6c60\u4e2d\u8fd95\u4e2a\u7ebf\u7a0b\u5c31\u4ece\u963b\u585e\u961f\u5217\u4e2d\u53d6\u4efb\u52a1\u6267\u884c\n        for (int i = 0; i &lt; 18; i++) {\n\n            fixedThreadPool.execute(new Runnable() {\n                @Override\n                public void run() {\n                    System.out.println(Thread.currentThread().getId() + \" \u7f16\u53f7\u7684\u4efb\u52a1\u5728\u6267\u884c\u4efb\u52a1,\u5f00\u59cb\u65f6\u95f4: \" + System.currentTimeMillis());\n                    try {\n                        Thread.sleep(3000);     \/\/\u6a21\u62df\u4efb\u52a1\u6267\u884c\u65f6\u957f\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                }\n            });\n        }\n    }\n}\n\n<\/code><\/pre>\n<h3>\u7ebf\u7a0b\u6c60\u7684\u8ba1\u5212\u4efb\u52a1<\/h3>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadpool;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.TimeUnit;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 16:10\n *\/\npublic class Test02 {\n\n    public static void main(String[] args) {\n        \/\/\u521b\u5efa\u4e00\u4e2a\u6709\u8c03\u5ea6\u529f\u80fd\u7684\u7ebf\u7a0b\u6c60\n        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);\n\n\n        \/\/\u5728\u5ef6\u8fdf2\u79d2\u540e\u6267\u884c\u4efb\u52a1, schedule(  Runnable\u4efb\u52a1, \u5ef6\u8fdf\u65f6\u957f, \u65f6\u95f4\u5355\u4f4d)\n        scheduledExecutorService.schedule(new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(Thread.currentThread().getId() + \" -- \" + System.currentTimeMillis() );\n            }\n        },2, TimeUnit.SECONDS);\n\n\n        \/\/\u4ee5\u56fa\u5b9a\u7684\u9891\u7387\u6267\u884c\u4efb\u52a1,\u5f00\u542f\u4efb\u52a1\u7684\u65f6\u95f4\u662f\u56fa\u5b9a\u7684, \u57283\u79d2\u540e\u6267\u884c\u4efb\u52a1,\u4ee5\u540e\u6bcf\u96945\u79d2\u91cd\u65b0\u6267\u884c\u4e00\u6b21\n\/*        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(Thread.currentThread().getId() + \"----\u5728\u56fa\u5b9a\u9891\u7387\u5f00\u542f\u4efb\u52a1---\" + System.currentTimeMillis());\n                try {\n                    TimeUnit.SECONDS.sleep(3);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        },3,2,TimeUnit.SECONDS);*\/\n\n\n        \/\/\u5728\u4e0a\u6b21\u4efb\u52a1\u7ed3\u675f\u540e,\u5728\u56fa\u5b9a\u5ef6\u8fdf\u540e\u518d\u6b21\u6267\u884c\u8be5\u4efb\u52a1,\u4e0d\u7ba1\u6267\u884c\u4efb\u52a1\u8017\u65f6\u591a\u957f,\u603b\u662f\u5728\u4efb\u52a1\u7ed3\u675f\u540e\u76842\u79d2\u518d\u6b21\u5f00\u542f\u65b0\u7684\u4efb\u52a1\n        scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(Thread.currentThread().getId() + \"----\u5728\u56fa\u5b9a\u9891\u7387\u5f00\u542f\u4efb\u52a1---\" + System.currentTimeMillis());\n                try {\n                    TimeUnit.SECONDS.sleep(3);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        },3,2,TimeUnit.SECONDS);\n\n    }\n\n}\n\n<\/code><\/pre>\n<p>\u603b\u7ed3\uff1a<\/p>\n<h4>scheduleAtFixedRate :<\/h4>\n<p>\u662f\u4ee5\u4e0a\u4e00\u4e2a\u4efb\u52a1\u5f00\u59cb\u7684\u65f6\u95f4\u8ba1\u65f6\uff0cperiod\u65f6\u95f4\u8fc7\u53bb\u540e\uff0c\u68c0\u6d4b\u4e0a\u4e00\u4e2a\u4efb\u52a1\u662f\u5426\u6267\u884c\u5b8c\u6bd5\uff0c\u5982\u679c\u4e0a\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\uff0c\u5219\u5f53\u524d\u4efb\u52a1\u7acb\u5373\u6267\u884c\uff0c\u5982\u679c\u4e0a\u4e00\u4e2a\u4efb\u52a1\u6ca1\u6709\u6267\u884c\u5b8c\u6bd5\uff0c\u5219\u9700\u8981\u7b49\u4e0a\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\u540e\u7acb\u5373\u6267\u884c\u3002<\/p>\n<h4>scheduleWithFixedDelay:<\/h4>\n<p>\u662f\u4ee5\u4e0a\u4e00\u4e2a\u4efb\u52a1\u7ed3\u675f\u65f6\u5f00\u59cb\u8ba1\u65f6\uff0cperiod\u65f6\u95f4\u8fc7\u53bb\u540e\uff0c\u7acb\u5373\u6267\u884c<\/p>\n<h1>Java\u7ebf\u7a0b\u6c60\u7684\u5e95\u5c42\u5b9e\u73b0<\/h1>\n<p>\u67e5\u770b<code>Executors<\/code>\u5de5\u5177\u7c7b\u4e2d<code>newCachedThreadPool(), newSingleThreadExecutor(), newFixedThreadPool()<\/code>\u6e90\u7801<\/p>\n<h3>newCachedThreadPool()<\/h3>\n<p>\u8be5\u7ebf\u7a0b\u6c60\u5728\u6781\u7aef\u60c5\u51b5\u4e0b,\u6bcf\u6b21\u63d0\u4ea4\u65b0\u7684\u4efb\u52a1\u90fd\u4f1a\u521b\u5efa\u65b0\u7684\u7ebf\u7a0b\u6267\u884c. \u9002\u5408\u7528\u6765\u6267\u884c\u5927\u91cf\u8017\u65f6\u77ed\u5e76\u4e14\u63d0\u4ea4\u9891\u7e41\u7684\u4efb\u52a1<\/p>\n<pre><code class=\"language-java line-numbers\">public static ExecutorService newCachedThreadPool() {\n        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,\n                                      60L, TimeUnit.SECONDS,\n                                      new SynchronousQueue&lt;Runnable&gt;());\n}   \n<\/code><\/pre>\n<h3>newFixedThreadPool<\/h3>\n<pre><code class=\"language-java line-numbers\">    public static ExecutorService newFixedThreadPool(int nThreads) {\n        return new ThreadPoolExecutor(nThreads, nThreads,\n                                      0L, TimeUnit.MILLISECONDS,\n                                      new LinkedBlockingQueue&lt;Runnable&gt;());\n    }\n<\/code><\/pre>\n<h3>newSingleThreadExecutor<\/h3>\n<pre><code class=\"line-numbers\">public static ExecutorService newSingleThreadExecutor() {\n    return new FinalizableDelegatedExecutorService\n        (new ThreadPoolExecutor(1, 1,\n                                0L, TimeUnit.MILLISECONDS,\n                                new LinkedBlockingQueue&lt;Runnable&gt;()));\n}\n<\/code><\/pre>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='data:image\/gif;base64,R0lGODlhAQABAPABAP\/\/\/wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=='><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"data:image\/gif;base64,R0lGODlhAQABAPABAP\/\/\/wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><code>Excutors<\/code>\u5de5\u5177\u7c7b\u4e2d\u8fd4\u56de\u7ebf\u7a0b\u6c60\u7684\u65b9\u6cd5\u5e95\u5c42\u90fd\u4f7f\u7528\u4e86<code>ThreadPoolExecutor<\/code>\u7ebf\u7a0b\u6c60,\u8fd9\u4e9b\u65b9\u6cd5\u90fd\u662f<code>ThreadPoolExecutor<\/code>\u7ebf\u7a0b\u6c60\u7684\u5c01\u88c5\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">    public ThreadPoolExecutor(int corePoolSize,\n                              int maximumPoolSize,\n                              long keepAliveTime,\n                              TimeUnit unit,\n                              BlockingQueue&lt;Runnable&gt; workQueue,\n                              ThreadFactory threadFactory,\n                              RejectedExecutionHandler handler) {\n        if (corePoolSize &lt; 0 ||\n            maximumPoolSize &lt;= 0 ||\n            maximumPoolSize &lt; corePoolSize ||\n            keepAliveTime &lt; 0)\n            throw new IllegalArgumentException();\n        if (workQueue == null || threadFactory == null || handler == null)\n            throw new NullPointerException();\n        this.corePoolSize = corePoolSize;\n        this.maximumPoolSize = maximumPoolSize;\n        this.workQueue = workQueue;\n        this.keepAliveTime = unit.toNanos(keepAliveTime);\n        this.threadFactory = threadFactory;\n        this.handler = handler;\n    }\n<\/code><\/pre>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='data:image\/gif;base64,R0lGODlhAQABAPABAP\/\/\/wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=='><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"data:image\/gif;base64,R0lGODlhAQABAPABAP\/\/\/wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div>\u5404\u4e2a\u53c2\u6570\u542b\u4e49:<\/p>\n<p><code>corePoolSize<\/code> \u6307\u5b9a\u7ebf\u7a0b\u6c60\u4e2d\u6838\u5fc3\u7ebf\u7a0b\u7684\u6570\u91cf\u3002<\/p>\n<p><code>maxinumPoolSize<\/code> \u6307\u5b9a\u7ebf\u7a0b\u6c60\u4e2d\u6700\u5927\u7ebf\u7a0b\u6570\u91cf\u3002<\/p>\n<p><code>keepAliveTim<\/code>e \u5f53\u7ebf\u7a0b\u6c60\u7ebf\u7a0b\u7684\u6570\u91cf\u8d85\u8fc7<code>corePoolSize<\/code>\u65f6,\u591a\u4f59\u7684\u7a7a\u95f2\u7ebf\u7a0b\u7684\u5b58\u6d3b\u65f6\u957f,\u5373\u7a7a\u95f2\u7ebf\u7a0b\u5728\u591a\u957f\u65f6\u957f\u5185\u9500\u6bc1\u3002<\/p>\n<p><code>unit<\/code> \u662fkeepAliveTime\u65f6\u957f\u5355\u4f4d\u3002<\/p>\n<p><code>workQueue<\/code> \u4efb\u52a1\u961f\u5217,\u628a\u4efb\u52a1\u63d0\u4ea4\u5230\u8be5\u4efb\u52a1\u961f\u5217\u4e2d\u7b49\u5f85\u6267\u884c\u3002<\/p>\n<p><code>threadFactory<\/code> \u7ebf\u7a0b\u5de5\u5382,\u7528\u4e8e\u521b\u5efa\u7ebf\u7a0b\u3002<\/p>\n<p><code>handler<\/code> \u62d2\u7edd\u7b56\u7565,\u5f53\u4efb\u52a1\u592a\u591a\u6765\u4e0d\u53ca\u5904\u7406\u65f6,\u5982\u4f55\u62d2\u7edd\u3002<\/p>\n<p>\u8bf4\u660e:<\/p>\n<p><code>workQueue<\/code>\u5de5\u4f5c\u961f\u5217\u662f\u6307\u63d0\u4ea4\u672a\u6267\u884c\u7684\u4efb\u52a1\u961f\u5217,\u5b83\u662f<code>BlockingQueue<\/code>\u63a5\u53e3\u7684\u5bf9\u8c61,\u4ec5\u7528\u4e8e\u5b58\u50a8<code>Runnable<\/code>\u4efb\u52a1.\u6839\u636e\u961f\u5217\u529f\u80fd\u5206\u7c7b,\u5728<code>ThreadPoolExecutor<\/code>\u6784\u9020\u65b9\u6cd5\u4e2d\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u51e0\u79cd\u963b\u585e\u961f\u5217\uff1a<\/p>\n<p>1\u3001\u76f4\u63a5\u63d0\u4ea4\u961f\u5217,\u7531<code>SynchronousQueue<\/code> \u5bf9\u8c61\u63d0\u4f9b,\u8be5\u961f\u5217\u6ca1\u6709\u5bb9\u91cf,\u63d0\u4ea4\u7ed9\u7ebf\u7a0b\u6c60\u7684\u4efb\u52a1\u4e0d\u4f1a\u88ab\u771f\u5b9e\u7684\u4fdd\u5b58,\u603b\u662f\u5c06\u65b0\u7684\u4efb\u52a1\u63d0\u4ea4\u7ed9\u7ebf\u7a0b\u6267\u884c,\u5982\u679c\u6ca1\u6709\u7a7a\u95f2\u7ebf\u7a0b,\u5219\u5c1d\u8bd5\u521b\u5efa\u65b0\u7684\u7ebf\u7a0b,\u5982\u679c\u7ebf\u7a0b\u6570\u91cf\u5df2\u7ecf\u8fbe\u5230<code>maxinumPoolSize<\/code>\u89c4\u5b9a\u7684\u6700\u5927\u503c\u5219\u6267\u884c\u62d2\u7edd\u7b56\u7565\u3002<\/p>\n<p>2\u3001\u6709\u754c\u4efb\u52a1\u961f\u5217,\u7531<code>ArrayBlockingQueue<\/code>\u5b9e\u73b0,\u5728\u521b\u5efa<code>ArrayBlockingQueue<\/code>\u5bf9\u8c61\u65f6,\u53ef\u4ee5\u6307\u5b9a\u4e00\u4e2a\u5bb9\u91cf. \u5f53\u6709\u4efb\u52a1\u9700\u8981\u6267\u884c\u65f6,\u5982\u679c\u7ebf\u7a0b\u6c60\u4e2d\u7ebf\u7a0b\u6570\u5c0f\u4e8e<code>corePoolSize<\/code>\u6838\u5fc3\u7ebf\u7a0b\u6570\u5219\u521b\u5efa\u65b0\u7684\u7ebf\u7a0b;\u5982\u679c\u5927\u4e8e<code>corePoolSize<\/code>\u6838\u5fc3\u7ebf\u7a0b\u6570\u5219\u52a0\u5165\u7b49\u5f85\u961f\u5217.\u5982\u679c\u961f\u5217\u5df2\u6ee1\u5219\u65e0\u6cd5\u52a0\u5165,\u5728\u7ebf\u7a0b\u6570\u5c0f\u4e8e<code>maxinumPoolSize<\/code>\u6307\u5b9a\u7684\u6700\u5927\u7ebf\u7a0b\u6570\u524d\u63d0\u4e0b\u4f1a\u521b\u5efa\u65b0\u7684\u7ebf\u7a0b\u6765\u6267\u884c,\u5982\u679c\u7ebf\u7a0b\u6570\u5927\u4e8e<code>maxinumPoolSize<\/code>\u6700\u5927\u7ebf\u7a0b\u6570\u5219\u6267\u884c\u62d2\u7edd\u7b56\u7565\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qn.199604.com\/typoraImg\/1588154604@1fba4d66c070abc5303718513b57b427.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/qn.199604.com\/typoraImg\/1588154604@1fba4d66c070abc5303718513b57b427.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"img\" \/><\/div><\/p>\n<p>3\u3001\u65e0\u754c\u4efb\u52a1\u961f\u5217,\u7531<code>LinkedBlockingQueue<\/code>\u5bf9\u8c61\u5b9e\u73b0,\u4e0e\u6709\u754c\u961f\u5217\u76f8\u6bd4,\u9664\u975e\u7cfb\u7edf\u8d44\u6e90\u8017\u5c3d,\u5426\u5219\u65e0\u754c\u961f\u5217\u4e0d\u5b58\u5728\u4efb\u52a1\u5165\u961f\u5931\u8d25\u7684\u60c5\u51b5. \u5f53\u6709\u65b0\u7684\u4efb\u52a1\u65f6,\u5728\u7cfb\u7edf\u7ebf\u7a0b\u6570\u5c0f\u4e8e<code>corePoolSize<\/code>\u6838\u5fc3\u7ebf\u7a0b\u6570\u5219\u521b\u5efa\u65b0\u7684\u7ebf\u7a0b\u6765\u6267\u884c\u4efb\u52a1;\u5f53\u7ebf\u7a0b\u6c60\u4e2d\u7ebf\u7a0b\u6570\u91cf\u5927\u4e8e<code>corePoolSize<\/code>\u6838\u5fc3\u7ebf\u7a0b\u6570\u5219\u628a\u4efb\u52a1\u52a0\u5165\u963b\u585e\u961f\u5217\u3002<\/p>\n<p>4\u3001\u4f18\u5148\u4efb\u52a1\u961f\u5217\u662f\u901a\u8fc7<code>PriorityBlockingQueue<\/code>\u5b9e\u73b0\u7684,\u662f\u5e26\u6709\u4efb\u52a1\u4f18\u5148\u7ea7\u7684\u961f\u5217,\u662f\u4e00\u4e2a\u7279\u6b8a\u7684\u65e0\u754c\u961f\u5217.\u4e0d\u7ba1\u662f<code>ArrayBlockingQueue<\/code>\u961f\u5217\u8fd8\u662f<code>LinkedBlockingQueue<\/code>\u961f\u5217\u90fd\u662f\u6309\u7167\u5148\u8fdb\u5148\u51fa\u7b97\u6cd5\u5904\u7406\u4efb\u52a1\u7684.\u5728<code>PriorityBlockingQueue<\/code>\u961f\u5217\u4e2d\u53ef\u4ee5\u6839\u636e\u4efb\u52a1\u4f18\u5148\u7ea7\u987a\u5e8f\u5148\u540e\u6267\u884c\u3002<\/p>\n<h1>Java\u7ebf\u7a0b\u6c60\u7684\u62d2\u7edd\u7b56\u7565<\/h1>\n<p><code>ThreadPoolExecutor<\/code>\u6784\u9020\u65b9\u6cd5\u7684\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u6307\u5b9a\u4e86\u62d2\u7edd\u7b56\u7565.\u5f53\u63d0\u4ea4\u7ed9\u7ebf\u7a0b\u6c60\u7684\u4efb\u52a1\u91cf\u8d85\u8fc7\u5b9e\u9645\u627f\u8f7d\u80fd\u529b\u65f6,\u5982\u4f55\u5904\u7406? \u5373\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u5df2\u7ecf\u7528\u5b8c\u4e86,\u7b49\u5f85\u961f\u5217\u4e5f\u6ee1\u4e86,\u65e0\u6cd5\u4e3a\u65b0\u63d0\u4ea4\u7684\u4efb\u52a1\u670d\u52a1,\u53ef\u4ee5\u901a\u8fc7\u62d2\u7edd\u7b56\u7565\u6765\u5904\u7406\u8fd9\u4e2a\u95ee\u9898. JDK\u63d0\u4f9b\u4e86\u56db\u79cd\u62d2\u7edd\u7b56\u7565\uff1a<\/p>\n<p>\u25cf AbortPolicy\u7b56\u7565,\u4f1a\u629b\u51fa\u5f02\u5e38\u3002<\/p>\n<p>\u25cf CallerRunsPolicy\u7b56\u7565,\u53ea\u8981\u7ebf\u7a0b\u6c60\u6ca1\u5173\u95ed,\u4f1a\u5728\u8c03\u7528\u8005\u7ebf\u7a0b\u4e2d\u8fd0\u884c\u5f53\u524d\u88ab\u4e22\u5f03\u7684\u4efb\u52a1\u3002<\/p>\n<p>\u25cf DiscardOldestPolicy\u5c06\u4efb\u52a1\u961f\u5217\u4e2d\u6700\u8001\u7684\u4efb\u52a1\u4e22\u5f03,\u5c1d\u8bd5\u518d\u6b21\u63d0\u4ea4\u65b0\u4efb\u52a1\u3002<\/p>\n<p>\u25cf DiscardPolicy\u76f4\u63a5\u4e22\u5f03\u8fd9\u4e2a\u65e0\u6cd5\u5904\u7406\u7684\u4efb\u52a1\u3002<\/p>\n<p>Executors\u5de5\u5177\u7c7b\u63d0\u4f9b\u7684\u9759\u6001\u65b9\u6cd5\u8fd4\u56de\u7684\u7ebf\u7a0b\u6c60\u9ed8\u8ba4\u7684\u62d2\u7edd\u7b56\u7565\u662fAbortPolicy\u629b\u51fa\u5f02\u5e38,\u5982\u679c\u5185\u7f6e\u7684\u62d2\u7edd\u7b56\u7565\u65e0\u6cd5\u6ee1\u8db3\u5b9e\u9645\u9700\u6c42,\u53ef\u4ee5\u6269\u5c55RejectedExecutionHandler\u63a5\u53e3\u3002<\/p>\n<h4>\u81ea\u5b9a\u4e49\u62d2\u7edd\u7b56\u7565\u5217\u5b50<\/h4>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadpool;\n\nimport java.util.Random;\nimport java.util.concurrent.*;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 17:13\n *\/\npublic class Test03 {\n\n    public static void main(String[] args) {\n\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                int num = new Random().nextInt(5);\n                System.out.println(Thread.currentThread().getId() + \"--\" + System.currentTimeMillis() + \"\u5f00\u59cb\u7761\u7720\" + num + \"\u79d2\");\n                try {\n                    TimeUnit.SECONDS.sleep(num);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        };\n\n\n        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingQueue&lt;&gt;(10), Executors.defaultThreadFactory(), new RejectedExecutionHandler(){\n            @Override\n            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {\n                \/\/r\u5c31\u662f\u8bf7\u6c42\u7684\u4efb\u52a1, executor\u5c31\u662f\u5f53\u524d\u7ebf\u7a0b\u6c60\n                System.out.println(r + \" is discarding..\");\n            }\n        });\n\n        \/\/\u5411\u7ebf\u7a0b\u6c60\u63d0\u4ea4\u82e5\u5e72\u4efb\u52a1\n        for (int i = 0; i &lt; Integer.MAX_VALUE; i++) {\n            threadPoolExecutor.submit(r);\n        }\n\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java\u7ebf\u7a0b\u6c60ThreadFactory<\/h1>\n<p>\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u4ece\u54ea\u513f\u6765\u7684? \u7b54\u6848\u5c31\u662f<code>ThreadFactory<\/code>\u3002<\/p>\n<p><code>ThreadFactory<\/code>\u662f\u4e00\u4e2a\u63a5\u53e3,\u53ea\u6709\u4e00\u4e2a\u7528\u6765\u521b\u5efa\u7ebf\u7a0b\u7684\u65b9\u6cd5\uff1a<\/p>\n<h4>Thread newThread(Runnable r);<\/h4>\n<p>\u5f53\u7ebf\u7a0b\u6c60\u4e2d\u9700\u8981\u521b\u5efa\u7ebf\u7a0b\u65f6\u5c31\u4f1a\u8c03\u7528\u8be5\u65b9\u6cd5\u3002<\/p>\n<h4>\u81ea\u5b9a\u4e49\u7ebf\u7a0b\u5de5\u5382\u5217\u5b50\uff1a<\/h4>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadpool;\n\nimport java.util.Random;\nimport java.util.concurrent.*;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 17:21\n *\/\npublic class Test04 {\n\n    public static void main(String[] args) {\n        \/\/\u5b9a\u4e49\u4efb\u52a1\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                int num = new Random().nextInt(10);\n                System.out.println(Thread.currentThread().getId() + \"--\" + System.currentTimeMillis() + \"\u5f00\u59cb\u7761\u7720:\" + num + \"\u79d2\");\n                try {\n                    TimeUnit.SECONDS.sleep(num);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        };\n\n        \/\/\u521b\u5efa\u7ebf\u7a0b\u6c60, \u4f7f\u7528\u81ea\u5b9a\u4e49\u7ebf\u7a0b\u5de5\u5382, \u91c7\u7528\u9ed8\u8ba4\u7684\u62d2\u7edd\u7b56\u7565\u662f\u629b\u51fa\u5f02\u5e38\n        ExecutorService executorService = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new SynchronousQueue&lt;&gt;(), new ThreadFactory() {\n            @Override\n            public Thread newThread(Runnable r) {\n                Thread t = new Thread(r);\n                t.setDaemon(true);\n                System.out.println(\"\u521b\u5efa\u4e86\u7ebf\u7a0b: \" + t);\n                return t ;\n            }\n        });\n\n        \/\/\u63d0\u4ea45\u4e2a\u4efb\u52a1, \u5f53\u7ed9\u5f53\u524d\u7ebf\u7a0b\u6c60\u63d0\u4ea4\u7684\u4efb\u52a1\u8d85\u8fc75\u4e2a\u65f6,\u7ebf\u7a0b\u6c60\u9ed8\u8ba4\u629b\u51fa\u5f02\u5e38\n        for (int i = 0; i &lt; 5; i++) {\n            executorService.submit(r);\n        }\n\n        try {\n            Thread.sleep(10000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java\u76d1\u63a7\u7ebf\u7a0b\u6c60<\/h1>\n<p><code>ThreadPoolExecutor<\/code>\u63d0\u4f9b\u4e86\u4e00\u7ec4\u65b9\u6cd5\u7528\u4e8e\u76d1\u63a7\u7ebf\u7a0b\u6c60\u3002<\/p>\n<h4>int getActiveCount()<\/h4>\n<p>\u83b7\u5f97\u7ebf\u7a0b\u6c60\u4e2d\u5f53\u524d\u6d3b\u52a8\u7ebf\u7a0b\u7684\u6570\u91cf\u3002<\/p>\n<h4>long getCompletedTaskCount()<\/h4>\n<p>\u8fd4\u56de\u7ebf\u7a0b\u6c60\u5b8c\u6210\u4efb\u52a1\u7684\u6570\u91cf\u3002<\/p>\n<h4>int getCorePoolSize()<\/h4>\n<p>\u7ebf\u7a0b\u6c60\u4e2d\u6838\u5fc3\u7ebf\u7a0b\u7684\u6570\u91cf\u3002<\/p>\n<h4>int getLargestPoolSize()<\/h4>\n<p>\u8fd4\u56de\u7ebf\u7a0b\u6c60\u66fe\u7ecf\u8fbe\u5230\u7684\u7ebf\u7a0b\u7684\u6700\u5927\u6570\u3002<\/p>\n<h4>int getMaximumPoolSize()<\/h4>\n<p>\u8fd4\u56de\u7ebf\u7a0b\u6c60\u7684\u6700\u5927\u5bb9\u91cf\u3002<\/p>\n<h4>int getPoolSize()<\/h4>\n<p>\u5f53\u524d\u7ebf\u7a0b\u6c60\u7684\u5927\u5c0f\u3002<\/p>\n<h4>BlockingQueue getQueue()<\/h4>\n<p>\u8fd4\u56de\u963b\u585e\u961f\u5217\u3002<\/p>\n<h4>long getTaskCount()<\/h4>\n<p>\u8fd4\u56de\u7ebf\u7a0b\u6c60\u6536\u5230\u7684\u4efb\u52a1\u603b\u6570\u3002<\/p>\n<h3>\u76d1\u63a7\u7ebf\u7a0b\u6c60\u5217\u5b50\uff1a<\/h3>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadpool;\n\nimport java.util.concurrent.*;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 17:26\n *\/\npublic class Test05 {\n\n    public static void main(String[] args) {\n        Runnable r = new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(Thread.currentThread().getId() + \" \u7f16\u53f7 \u7684\u7ebf\u7a0b\u5f00\u59cb\u6267\u884c: \" + System.currentTimeMillis());\n                try {\n                    Thread.sleep(10000);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        };\n\n\n        TimeUnit unit;\n        BlockingQueue workQueue;\n        unit = TimeUnit.SECONDS;\n        workQueue =  new ArrayBlockingQueue&lt;&gt;(5);\n        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,5 ,0 , unit, workQueue,\n                Executors.defaultThreadFactory(),\n                new ThreadPoolExecutor.DiscardPolicy());\n\n        \/\/\u5411\u7ebf\u7a0b\u6c60\u63d0\u4ea430\u4e2a\u4efb\u52a1\n        for (int i = 0; i &lt; 20; i++) {\n            threadPoolExecutor.submit(r);\n            \/*System.out.println(\"\u5f53\u524d\u7ebf\u7a0b\u6c60\u6838\u5fc3\u7ebf\u7a0b\u6570\u91cf: \" + threadPoolExecutor.getCorePoolSize()\n                    + \", \u6700\u5927\u7ebf\u7a0b\u6570:\" + threadPoolExecutor.getMaximumPoolSize()\n                    + \",\u5f53\u524d\u7ebf\u7a0b\u6c60\u5927\u5c0f:\" + threadPoolExecutor.getPoolSize()\n                    + \",\u6d3b\u52a8\u7ebf\u7a0b\u6570\u91cf:\" + threadPoolExecutor.getActiveCount()\n                    + \",\u6536\u5230\u4efb\u52a1\u6570\u91cf:\" + threadPoolExecutor.getTaskCount()\n                    + \",\u5b8c\u6210\u4efb\u52a1\u6570: \" + threadPoolExecutor.getCompletedTaskCount()\n                    + \",\u7b49\u5f85\u4efb\u52a1\u6570:\" + threadPoolExecutor.getQueue().size()) ;\n            try {\n                TimeUnit.MILLISECONDS.sleep(500);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }*\/\n        }\n\n        while (threadPoolExecutor.getActiveCount() &gt; 0) {\n\n            System.out.println(\"\u5f53\u524d\u7ebf\u7a0b\u6c60\u6838\u5fc3\u7ebf\u7a0b\u6570\u91cf:\"+ threadPoolExecutor.getCorePoolSize()\n                    + \",\u6700\u5927\u7ebf\u7a0b\u6570\uff1a\" + threadPoolExecutor.getMaximumPoolSize()\n                    + \",\u5f53\u524d\u7ebf\u7a0b\u6c60\u7684\u5927\u5c0f:\" + threadPoolExecutor.getPoolSize()\n                    + \",\u6d3b\u52a8\u7ebf\u7a0b\u6570\u91cf:\" + threadPoolExecutor.getActiveCount()\n                    + \",\u7ebf\u7a0b\u6c60\u6536\u5230\u7684\u4efb\u52a1\u603b\u6570:\" + threadPoolExecutor.getTaskCount()\n                    + \",\u7ebf\u7a0b\u6c60\u5b8c\u6210\u4efb\u52a1\u7684\u6570\u91cf:\" + threadPoolExecutor.getCompletedTaskCount()\n                    + \",\u7b49\u5f85\u4efb\u52a1\u6570:\" + threadPoolExecutor.getQueue().size()\n                    + \",\u7ebf\u7a0b\u6c60\u66fe\u7ecf\u8fbe\u5230\u7684\u7ebf\u7a0b\u7684\u6700\u5927\u6570:\" + threadPoolExecutor.getLargestPoolSize());\n            try {\n                TimeUnit.MILLISECONDS.sleep(1000);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n\n\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java\u7ebf\u7a0b\u6c60\u6269\u5c55<\/h1>\n<p>\u6709\u65f6\u9700\u8981\u5bf9\u7ebf\u7a0b\u6c60\u8fdb\u884c\u6269\u5c55,\u5982\u5728\u76d1\u63a7\u6bcf\u4e2a\u4efb\u52a1\u7684\u5f00\u59cb\u548c\u7ed3\u675f\u65f6\u95f4,\u6216\u8005\u81ea\u5b9a\u4e49\u4e00\u4e9b\u5176\u4ed6\u589e\u5f3a\u7684\u529f\u80fd\u3002<\/p>\n<p><code>ThreadPoolExecutor<\/code>\u7ebf\u7a0b\u6c60\u63d0\u4f9b\u4e86\u4e24\u4e2a\u65b9\u6cd5\uff1a<\/p>\n<p>\u25cf protected void afterExecute(Runnable r, Throwable t)<\/p>\n<p>\u25cf protected void beforeExecute(Thread t, Runnable r)<\/p>\n<p>\u5728\u7ebf\u7a0b\u6c60\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u524d\u4f1a\u8c03\u7528beforeExecute()\u65b9\u6cd5,\u5728\u4efb\u52a1\u7ed3\u675f\u540e(\u4efb\u52a1\u5f02\u5e38\u9000\u51fa)\u4f1a\u6267\u884cafterExecute()\u65b9\u6cd5\u3002<\/p>\n<p>\u67e5\u770bThreadPoolExecutor\u6e90\u7801,\u5728\u8be5\u7c7b\u4e2d\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5185\u90e8\u7c7bWorker, ThreadPoolExecutor\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u5c31\u662fWorker\u7c7b\u7684\u5b9e\u4f8b, Worker\u5b9e\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u8c03\u7528<code>beforeExecute()<\/code>\u4e0e<code>afterExecute()<\/code>\u65b9\u6cd5<\/p>\n<h3>\u5217\u5b50\uff1a<\/h3>\n<pre><code class=\"language-java line-numbers\">package com.glj.threadpool;\n\n\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.LinkedBlockingDeque;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n\/**\n * Created with IntelliJ IDEA.\n *\n * @Author: GuoLiangJun\n * @Date: 2021\/9\/22\n * @Time: 17:44\n *\/\npublic class Test06 {\n\n    public static void main(String[] args) {\n        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 0, TimeUnit.SECONDS, new LinkedBlockingDeque&lt;&gt;()){\n            @Override\n            protected void beforeExecute(Thread t, Runnable r) {\n                System.out.println(t.getId() + \"\u7ebf\u7a0b\u51c6\u5907\u6267\u884c\u4efb\u52a1: \" + ((MyTask)r).name);\n            }\n\n            @Override\n            protected void afterExecute(Runnable r, Throwable t) {\n                System.out.println( ((MyTask)r).name + \"\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\");\n            }\n\n            @Override\n            protected void terminated() {\n                System.out.println(\"\u7ebf\u7a0b\u6c60\u9000\u51fa\");\n            }\n        };\n\n        for (int i = 0; i &lt; 5; i++) {\n            MyTask task = new MyTask(\"task-\" + i);\n            threadPoolExecutor.execute(task);\n        }\n\n        \/\/\u5173\u95ed\u7ebf\u7a0b\u6c60\n        threadPoolExecutor.shutdown();\n\n    }\n\n    \/\/\u5b9a\u4e49\u4efb\u52a1\u7c7b\n    private static class  MyTask implements  Runnable{\n        String name;\n\n        public MyTask(String name) {\n            this.name = name;\n        }\n\n        @Override\n        public void run() {\n            System.out.println(name + \"\u4efb\u52a1\u6b63\u5728\u88ab\u7ebf\u7a0b \" + Thread.currentThread().getId() + \" \u6267\u884c\");\n            try {\n                Thread.sleep(1000);     \/\/\u6a21\u62df\u4efb\u52a1\u6267\u884c\u65f6\u957f\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n\n}\n\n<\/code><\/pre>\n<h1>Java\u7ebf\u7a0b\u6c60\u7684\u5927\u5c0f\u4e0e\u7ebf\u7a0b\u6c60\u6b7b\u9501<\/h1>\n<h3>\u4f18\u5316\u7ebf\u7a0b\u6c60\u5927\u5c0f<\/h3>\n<p>\u7ebf\u7a0b\u6c60\u5927\u5c0f\u5bf9\u7cfb\u7edf\u6027\u80fd\u662f\u6709\u4e00\u5b9a\u5f71\u54cd\u7684,\u8fc7\u5927\u6216\u8005\u8fc7\u5c0f\u90fd\u4f1a\u65e0\u6cd5\u53d1\u6325\u6700\u4f18\u7684\u7cfb\u7edf\u6027\u80fd, \u7ebf\u7a0b\u6c60\u5927\u5c0f\u4e0d\u9700\u8981\u975e\u5e38\u7cbe\u786e,\u53ea\u8981\u907f\u514d\u6781\u5927\u6216\u8005\u6781\u5c0f\u7684\u60c5\u51b5\u5373\u53ef, \u4e00\u822c\u6765\u8bf4,\u7ebf\u7a0b\u6c60\u5927\u5c0f\u9700\u8981\u8003\u8651CPU\u6570\u91cf,\u5185\u5b58\u5927\u5c0f\u7b49\u56e0\u7d20. \u5728\u4e66\u4e2d\u7ed9\u51fa\u4e00\u4e2a\u4f30\u7b97\u7ebf\u7a0b\u6c60\u5927\u5c0f\u7684\u516c\u5f0f\uff1a<\/p>\n<p>\u7ebf\u7a0b\u6c60\u5927\u5c0f = CPU\u7684\u6570\u91cf * \u76ee\u6807CPU\u7684\u4f7f\u7528\u7387*( 1 + \u7b49\u5f85\u65f6\u95f4\u4e0e\u8ba1\u7b97\u65f6\u95f4\u7684\u6bd4)<\/p>\n<h3>\u7ebf\u7a0b\u6c60\u6b7b\u9501<\/h3>\n<p>\u5982\u679c\u5728\u7ebf\u7a0b\u6c60\u4e2d\u6267\u884c\u7684\u4efb\u52a1A\u5728\u6267\u884c\u8fc7\u7a0b\u4e2d\u53c8\u5411\u7ebf\u7a0b\u6c60\u63d0\u4ea4\u4e86\u4efb\u52a1B, \u4efb\u52a1B\u6dfb\u52a0\u5230\u4e86\u7ebf\u7a0b\u6c60\u7684\u7b49\u5f85\u961f\u5217\u4e2d, \u5982\u679c\u4efb\u52a1A\u7684\u7ed3\u675f\u9700\u8981\u7b49\u5f85\u4efb\u52a1B\u7684\u6267\u884c\u7ed3\u679c. \u5c31\u6709\u53ef\u80fd\u4f1a\u51fa\u73b0\u8fd9\u79cd\u60c5\u51b5: \u7ebf\u7a0b\u6c60\u4e2d\u6240\u6709\u7684\u5de5\u4f5c\u7ebf\u7a0b\u90fd\u5904\u4e8e\u7b49\u5f85\u4efb\u52a1\u5904\u7406\u7ed3\u679c,\u800c\u8fd9\u4e9b\u4efb\u52a1\u5728\u963b\u585e\u961f\u5217\u4e2d\u7b49\u5f85\u6267\u884c, \u7ebf\u7a0b\u6c60\u4e2d\u6ca1\u6709\u53ef\u4ee5\u5bf9\u963b\u585e\u961f\u5217\u4e2d\u7684\u4efb\u52a1\u8fdb\u884c\u5904\u7406\u7684\u7ebf\u7a0b,\u8fd9\u79cd\u7b49\u5f85\u4f1a\u4e00\u76f4\u6301\u7eed\u4e0b\u53bb,\u4ece\u800c\u9020\u6210\u6b7b\u9501\u3002<\/p>\n<p>\u9002\u5408\u7ed9\u7ebf\u7a0b\u6c60\u63d0\u4ea4\u76f8\u4e92\u72ec\u7acb\u7684\u4efb\u52a1,\u800c\u4e0d\u662f\u5f7c\u6b64\u4f9d\u8d56\u7684\u4efb\u52a1. \u5bf9\u4e8e\u5f7c\u6b64\u4f9d\u8d56\u7684\u4efb\u52a1,\u53ef\u4ee5\u8003\u8651\u5206\u522b\u63d0\u4ea4\u7ed9\u4e0d\u540c\u7684\u7ebf\u7a0b\u6c60\u6765\u6267\u884c\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java\u591a\u7ebf\u7a0b\u7f16\u7a0b Java\u8fdb\u7a0b \u8fdb\u7a0b(Process)\u662f\u8ba1\u7b97\u673a\u4e2d\u7684\u7a0b\u5e8f\u5173\u4e8e\u67d0\u6570\u636e\u96c6\u5408\u4e0a\u7684\u4e00\u6b21\u8fd0\u884c\u6d3b\u52a8,\u662f\u64cd\u4f5c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[292],"tags":[129,318],"class_list":["post-1791","post","type-post","status-publish","format-standard","hentry","category-java","tag-java","tag-318"],"_links":{"self":[{"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/posts\/1791","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/comments?post=1791"}],"version-history":[{"count":3,"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/posts\/1791\/revisions"}],"predecessor-version":[{"id":1910,"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/posts\/1791\/revisions\/1910"}],"wp:attachment":[{"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/media?parent=1791"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/categories?post=1791"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/199604.com\/wp-json\/wp\/v2\/tags?post=1791"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}