<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國際加速解決方案。 廣告
                多個線程之間共享數據的方式 原文出處:?[where](http://903497571.iteye.com/blog/1869428) **一.目標** 談到多線程共享數據,理想情況下我們希望做到“同步”和“互斥”。這是目標我們暫且把它先放到這。 **二.分類** 多線程共享數據通常的場景有一下兩種: **場景一:** 賣票,我們都買過火車票。要買火車票我們可以去車站,也可以通過代售點(或網購),但不管有多少種方式火車票的總數是一定的。 **場景抽象:** 對于賣票系統每個線程的核心執行的代碼都相同(就是票數–)。 **解決方法:** 只需創建一個Runnable,這個Runnable里有那個共享數據。 **代碼模擬:** ~~~ package 多線程共享數據; public class Ticket implements Runnable{ private int ticket = 10; public void run() { while(ticket>0){ ticket--; System.out.println("當前票數為:"+ticket); } } } package 多線程共享數據; public class SellTicket { /** * @param args */ public static void main(String[] args) { Ticket t = new Ticket(); new Thread(t).start(); new Thread(t).start(); } } ~~~ **場景二:比較常見的例子,銀行問題,我們對賬戶可以存錢也可以取錢,怎么保證這樣的數據共享呢?** **場景抽象:** 每個線程執行的代碼不同(比如上面的問題,對每個賬戶可以執行++操作和–操作),這時候需要用不同的Runnable對象,有如下兩種方式來實現這些Runnable之間的數據共享 **解決方案:** 有兩種方法來解決此類問題: * 將共享數據封裝成另外一個對象中封裝成另外一個對象中,然后將這個對象逐一傳遞給各個Runnable對象,每個線程對共享數據的操作方法也分配到那個對象身上完成,這樣容易實現針對數據進行各個操作的互斥和通信 * 將Runnable對象作為偶一個類的內部類,共享數據作為這個類的成員變量,每個線程對共享數據的操作方法也封裝在外部類,以便實現對數據的各個操作的同步和互斥,作為內部類的各個Runnable對象調用外部類的這些方法。 **代碼模擬:** 以一道面試題為例: ***“設計4個線程。,其中兩個線程每次對j增加1,另外兩個線程對j每次減1”*** (第一種解法) ~~~ public class MyData { private int j=0; public synchronized void add(){ j++; System.out.println("線程"+Thread.currentThread().getName()+"j為:"+j); } public synchronized void dec(){ j--; System.out.println("線程"+Thread.currentThread().getName()+"j為:"+j); } public int getData(){ return j; } } public class AddRunnable implements Runnable{ MyData data; public AddRunnable(MyData data){ this.data= data; } public void run() { data.add(); } } public class DecRunnable implements Runnable { MyData data; public DecRunnable(MyData data){ this.data = data; } public void run() { data.dec(); } } ~~~ 測試代碼: ~~~ public class TestOne { /** * @param args */ public static void main(String[] args) { MyData data = new MyData(); Runnable add = new AddRunnable(data); Runnable dec = new DecRunnable(data); for(int i=0;i<2;i++){ new Thread(add).start(); new Thread(dec).start(); } } } ~~~ 解法分析: 優點: 1.這種解法代碼寫的有條理,簡單易讀,從main中很容易整理出思路 2.將數據抽象成一個類,并將對這個數據的操作作為這個類的方法,這么設計可以和容易做到同步,只要在方法上加”synchronized“ 不足: 代碼寫的比較繁瑣,需要有多個類,不是那么簡潔 個人觀點:為了有條理個人比較喜歡這種寫法。 (第二種解法) ~~~ public class MyData { private int j=0; public synchronized void add(){ j++; System.out.println("線程"+Thread.currentThread().getName()+"j為:"+j); } public synchronized void dec(){ j--; System.out.println("線程"+Thread.currentThread().getName()+"j為:"+j); } public int getData(){ return j; } } public class TestThread { /** * @param args */ public static void main(String[] args) { final MyData data = new MyData(); for(int i=0;i<2;i++){ new Thread(new Runnable(){ public void run() { data.add(); } }).start(); new Thread(new Runnable(){ public void run() { data.dec(); } }).start(); } } } ~~~ 解法分析: 與第一種方法的區別在于第二種方法巧妙的用了內部類共享外部類數據的思想,即把要共享的數據變得全局變量,這樣就保證了操作的是同一份數據。同時內部類的方式使代碼更加簡潔。但是不如第一種解法條理那么清楚。 結束語:感謝網上各種資料,只要想學網上的各種資料是這么豐富。學無止境,少年加油!!!
                  <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>

                              哎呀哎呀视频在线观看