{"id":1567,"date":"2020-11-14T09:54:20","date_gmt":"2020-11-14T01:54:20","guid":{"rendered":"https:\/\/www.yusian.com\/blog\/?p=1567"},"modified":"2020-11-17T17:40:44","modified_gmt":"2020-11-17T09:40:44","slug":"java%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b8%ad%e7%9a%84%e7%ba%bf%e7%a8%8b%e5%ae%89%e5%85%a8%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"https:\/\/www.yusian.com\/blog\/java\/2020\/11\/14\/0954201567.html","title":{"rendered":"Java\u591a\u7ebf\u7a0b\u4e2d\u7684\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898"},"content":{"rendered":"<p>\u591a\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u5171\u4eab\u6570\u636e\u5c31\u4f1a\u4ea7\u751f\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u4ee5\u5356\u7968\u4e3a\u4f8b\uff0c\u591a\u4e2a\u7a97\u53e3\u5356\u540c\u4e00\u6279\u7968\u5c31\u4f1a\u51fa\u73b0\u91cd\u590d\u5356\u7684\u95ee\u9898<\/p>\n<pre><code class=\"language-java line-numbers\">  public static void main(String[] args) {\n      Runnable runnable = new Runnable() {\n          Integer tickets = 100;\n          @Override\n          public void run() {\n              String name = Thread.currentThread().getName();\n              while(tickets-- &gt; 0) {\n                  try {\n                      Thread.sleep(1);\n                  } catch (InterruptedException e) {\n                      e.printStackTrace();\n                  }\n                  System.out.println(name + \"\u6b63\u5728\u5356\u7968: \" + tickets);\n              }\n          }\n      };\n      new Thread(runnable).start();\n      new Thread(runnable).start();\n      new Thread(runnable).start();\n  }\n<\/code><\/pre>\n<p>\u89e3\u51b3\u65b9\u6848\u4e00\uff1a<strong>\u4f7f\u7528\u540c\u6b65\u673a\u5236<\/strong>\uff0c\u5171\u4eab\u90e8\u5206\u540c\u6b65\u6267\u884c\u5219\u4e0d\u4f1a\u51fa\u73b0\u91cd\u590d\u64cd\u4f5c\u95ee\u9898<\/p>\n<ol>\n<li><code>synchronized<\/code>\u5173\u952e\u5b57\u5b9e\u73b0\u4ee3\u7801\u5757\u540c\u6b65\n<pre><code class=\"language-java line-numbers\">public static void main(String[] args) {\n    Object lock = new Object();\n    Runnable runnable = new Runnable() {\n        Integer tickets = 100;\n\n        @Override\n        public void run() {\n            String name = Thread.currentThread().getName();\n            while (true) {\n                try {\n                    Thread.sleep(1);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n                synchronized (lock) {\n                    if (tickets &lt;= 0) break;\n                    System.out.println(name + \"\u6b63\u5728\u5356\u7968: \" + tickets);\n                    tickets--;\n                }\n            }\n        }\n    };\n    new Thread(runnable).start();\n    new Thread(runnable).start();\n    new Thread(runnable).start();\n}\n<\/code><\/pre>\n<\/li>\n<li><code>synchronized<\/code>\u540c\u6b65\u65b9\u6cd5\u5b9e\u73b0\u540c\u6b65\u673a\u5236\n<pre><code class=\"language-java line-numbers\">static Integer tickets = 100;\npublic static void main(String[] args) {\n    Runnable runnable = new Runnable() {\n        @Override\n        public void run() {\n            while (true) {\n                try {\n                    Thread.sleep(1);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n                sellTicked();\n                if (tickets &lt;= 0) break;\n            }\n        }\n    };\n    new Thread(runnable).start();\n    new Thread(runnable).start();\n    new Thread(runnable).start();\n}\n\nsynchronized private static void sellTicked() {\n    if (tickets &lt;= 0) return;\n    String name = Thread.currentThread().getName();\n    System.out.println(name + \"\u6b63\u5728\u5356\u7968: \" + tickets);\n    tickets--;\n}\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>\u89e3\u51b3\u65b9\u6848\u4e8c\uff1a<strong>\u4f7f\u7528\u9501<\/strong>\uff0c<code>ReentrantLock<\/code><br \/>\n<!--more--><\/p>\n<pre><code class=\"language-java line-numbers\">public class LockDemo {\n    static Integer tickets = 100;\n    public static void main(String[] args) {\n        Runnable run = new Runnable() {\n            ReentrantLock lock = new ReentrantLock();\n            @Override\n            public void run() {\n                while(tickets &gt; 0) {\n                    try {\n                        Thread.sleep(1);\n                    }catch(Exception e) {\n\n                    }\n                    lock.lock();\n                    sellTickets();\n                    lock.unlock();\n                }\n            }\n        };\n        new Thread(run).start();\n        new Thread(run).start();\n        new Thread(run).start();\n    }\n\n    private static void sellTickets() {\n        String threadName = Thread.currentThread().getName();\n        if (tickets &lt; 0) return;\n        System.out.println(threadName + \"\u6b63\u5728\u5356\u7b2c\" + tickets + \"\u5f20\u7968\");\n        tickets--;\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u591a\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u5171\u4eab\u6570\u636e\u5c31\u4f1a\u4ea7\u751f\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u4ee5\u5356\u7968\u4e3a\u4f8b\uff0c\u591a\u4e2a\u7a97\u53e3\u5356\u540c\u4e00\u6279\u7968\u5c31\u4f1a\u51fa\u73b0\u91cd\u590d\u5356\u7684\u95ee\u9898 public static void main(String[] args) { Runnable runnable = new Runnable() { Integer tickets = 100; @Override public void run() { String name = Thread.currentThread().getName(); while(tickets&#8211; &gt; 0) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + &#8220;\u6b63\u5728\u5356\u7968: &#8221; + tickets); } } }; new Thread(runnable).start(); new Thread(runnable).start(); new Thread(runnable).start(); [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35],"tags":[34,253,254,255],"class_list":["post-1567","post","type-post","status-publish","format-standard","hentry","category-java","tag-java","tag-lock","tag-254","tag-255"],"_links":{"self":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/comments?post=1567"}],"version-history":[{"count":0,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1567\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/media?parent=1567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/categories?post=1567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/tags?post=1567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}