<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # synchronized ## 同步代碼塊 同步代碼塊: 在代碼塊聲明上 加上synchronized ~~~ synchronized (鎖對象) { 可能會產生線程安全問題的代碼 } ~~~ 同步代碼塊中的鎖對象可以是任意的對象;但**多個線程時,要使用同一個鎖對象才能夠保證線程安全**。 在方法中,對可能出錯的加上 ~~~ synchronized (lock){ } ~~~ 成員中定義 ~~~ //定義鎖對象 Object lock = new Object(); ~~~ ### 案例 ~~~ package com.study; class MyThread implements Runnable { private int ticket = 100; @Override public void run() { for (int i = 0; i < 200; i++) { //同步代碼塊 synchronized (this) { if (this.ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " ---賣票--- " + this.ticket--); } } } } } public class HelloWorld { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt, "A線程").start(); new Thread(mt, "B線程").start(); } } ~~~ ## 同步方法 * 同步方法:在方法聲明上加上synchronized ~~~ public synchronized void method(){ 可能會產生線程安全問題的代碼 } ~~~ **同步方法中的鎖對象是 this** * 靜態同步方法: 在方法聲明上加上static synchronized ~~~ public static synchronized void method(){ 可能會產生線程安全問題的代碼 } ~~~ **靜態同步方法中的鎖對象是 類名.class** ### 案例 ~~~ package com.study; class MyThread implements Runnable { private int ticket = 100; @Override public void run() { for (int i = 0; i < 200; i++) { //調用同步方法 this.sale(); } } //同步方法 private synchronized void sale() { if (this.ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " ---賣票--- " + this.ticket--); } } } public class HelloWorld { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt, "A線程").start(); new Thread(mt, "B線程").start(); } } ~~~ ## synchronized的缺陷 synchronized是java中的一個關鍵字,也就是說是Java語言內置的特性。 如果一個代碼塊被synchronized修飾了,當一個線程獲取了對應的鎖,并執行該代碼塊時,其他線程便只能一直等待,等待獲取鎖的線程釋放鎖,而這里獲取鎖的線程釋放鎖只會有兩種情況: 1. 獲取鎖的線程執行完了該代碼塊,然后線程釋放對鎖的占有; 2. **線程執行發生異常,此時JVM會讓線程自動釋放鎖。** 例子1:   如果這個獲取鎖的線程由于要等待IO或者其他原因(比如調用sleep方法)被阻塞了,但是又沒有釋放鎖,其他線程便只能干巴巴地等待,試想一下,這多么影響程序執行效率。   因此就需要有一種機制可以不讓等待的線程一直無期限地等待下去(比如只等待一定的時間或者能夠響應中斷),通過Lock就可以辦到。 例子2: 當有多個線程讀寫文件時,讀操作和寫操作會發生沖突現象,寫操作和寫操作會發生沖突現象,但是讀操作和讀操作不會發生沖突現象。   但是采用synchronized關鍵字來實現同步的話,就會導致一個問題: 如果多個線程都只是進行讀操作,當一個線程在進行讀操作時,其他線程只能等待無法進行讀操作。   因此就需要一種機制來使得多個線程都只是進行讀操作時,線程之間不會發生沖突,通過Lock就可以辦到。   另外,通過Lock可以知道線程有沒有成功獲取到鎖。這個是synchronized無法辦到的。   總的來說,也就是說Lock提供了比synchronized更多的功能。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看