<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # This鎖和Class鎖 ## This鎖 接下來代碼理解一下This鎖: ```java /** * @program: ThreadDemo * @description: This鎖的實驗 * @author: hs96.cn@Gmail.com * @create: 2020-09-06 */ public class SynchronizedThis { public static void main(String[] args) { ThisLock thisLock = new ThisLock(); new Thread("T1") { @Override public void run() { thisLock.m1(); } }.start(); new Thread("T2") { @Override public void run() { thisLock.m2(); } }.start(); } } class ThisLock { public synchronized void m1() { for (int i = 0; i <= 50; i++) { System.out.println(Thread.currentThread().getName()+i); try { Thread.sleep(2_000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void m2() { for (int i = 0; i <= 50; i++) { System.out.println(Thread.currentThread().getName()+i); try { Thread.sleep(2_000); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 這里我分別調用兩個線程調用兩個方法打印數字,線程一調用的方法我使用了同步方法,線程二調用的方法沒做任何修飾,我們預期的結果是交替打印,因為只有方法一在搶鎖,運行結果如下: ![](https://img.kancloud.cn/e2/9a/e29aeb14ef986bbdc569e1038eae4e6c_960x246.gif) 可以看到結果和我們預期的一樣,兩個線程交替執行了。 接下里我們把m2也加上synchronized,代碼就不貼了運行效果如下: ![](https://img.kancloud.cn/93/2f/932f3a2d2f941f99b7bb7172d308964d_960x246.gif) 可以看到只有線程一執行了,這就說明synchronized修飾的這兩個方法其實是使用的同一個鎖,這個鎖就是this鎖。 接下來我們自己定義一個鎖,然后讓兩個線程一個使用this鎖一個使用我們定義的鎖,代碼如下: ```java /** * @program: ThreadDemo * @description: this鎖 * @author: hs96.cn@Gmail.com * @create: 2020-09-06 */ public class SynchronizedThis { public static void main(String[] args) { ThisLock thisLock = new ThisLock(); new Thread("T1") { @Override public void run() { thisLock.m1(); } }.start(); new Thread("T2") { @Override public void run() { thisLock.m2(); } }.start(); } } class ThisLock { private final Object LOCK = new Object(); public synchronized void m1() { for (int i = 0; i <= 50; i++) { System.out.println(Thread.currentThread().getName()+i); try { Thread.sleep(1_000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void m2() { synchronized (LOCK) { for (int i = 0; i <= 50; i++) { System.out.println(Thread.currentThread().getName() + i); try { Thread.sleep(2_000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } ``` 運行效果如下: ![](https://img.kancloud.cn/5d/cb/5dcb86da112cbf34c79faa58420ed8f2_960x246.gif) 可以看到兩個線程還是交替執行的,也就是我們自己定義的鎖不是this鎖。我們在把m1加上我們自己定義的鎖: ```java public void m1() { synchronized (LOCK) { for (int i = 0; i <= 50; i++) { System.out.println(Thread.currentThread().getName() + i); try { Thread.sleep(1_000); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 運行效果如下: ![](https://img.kancloud.cn/ea/2a/ea2ac910cff0dcd155576030b17b17d9_960x246.gif) 可以看到當兩個線程同時使用我們定義的鎖的時候,當m2搶到鎖的時候,m1就在等待了。所以,同步鎖要想讓多線程執行的不同方法達到同步的效果則必須上的是同一把鎖才行。 ## Class鎖 跟This鎖類似,Class鎖顧名思議就是鎖的一個類本身,而非類的實例,來看代碼: ```java /** * @program: ThreadDemo * @description: 驗證Class鎖的存在 * @author: hs96.cn@Gmail.com * @create: 2020-09-06 */ public class SynchronizedStaticTest { public static void main(String[] args) { new Thread("T1") { @Override public void run() { SynchronizedStatic.m1(); } }.start(); new Thread("T2") { @Override public void run() { SynchronizedStatic.m2(); } }.start(); new Thread("T3") { @Override public void run() { SynchronizedStatic.m3(); } }.start(); } } ``` ```java /** * @program: ThreadDemo * @description: 驗證Class鎖的存在, 靜態方法、靜態代碼塊加的鎖其實是Class鎖。 * @author: hs96.cn@Gmail.com * @create: 2020-09-06 */ public class SynchronizedStatic { static { synchronized (SynchronizedStatic.class) { System.out.println("static " + Thread.currentThread().getName()); try { Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized static void m1() { System.out.println("m1 " + Thread.currentThread().getName()); try { Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized static void m2() { System.out.println("m2 " + Thread.currentThread().getName()); try { Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void m3() { System.out.println("m3 " + Thread.currentThread().getName()); try { Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 運行效果如下: ![](https://img.kancloud.cn/c4/a2/c4a29ba5449a178229423cb7b9171ddf_960x246.gif) 這里m1和m2搶同一個鎖毫無疑問,但是可以看到執行完靜態代碼塊之后,才能到靜態方法。這就是class鎖。
                  <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>

                              哎呀哎呀视频在线观看