2015年11月9日 星期一

Java-Synchronized 同步 用法 執行

想必大家都聽過 Synchronized 同步 之類的
但聽過這麼多
但是到底是啥東西??
簡單的說 : 你要使用此物件、方法,你就是要
排隊!!!
排隊!!!
排隊!!!

但是前者結束,後者要搶!!!

為啥要排隊?不是直接使用就好了嗎??
當然也行,但在銀行的例子就不可行
在同一時間只能一個人做領錢的動作
直到確認把錢交至手上為止
下一個人才能領錢或存錢

那寫哪種程式比較常遇到 ?
檔案接收完整性、資料存取之類

以下圖示針對銀行例子做圖解
( 左 : 同時領錢 , 右 : 排隊領錢 )














以下是用範例呈現 :

1 . 不使用 Synchonized
 多次執行,結果皆不同。














2 . 使用 Synchonized
多次執行,結果相同。














以下是範例程式碼 : ( 請自行更改 synchronized 需求 )
Test.java
public class Test {

    public static void main(String[] args) {

        TestThread.Threading("1");
        TestThread.Threading("2");
        
    }

}



TestThread.java
public class TestThread {
    
    public static void Threading(String message){
        new Threading(message).start();
    }
    
    public static class Threading extends Thread { 

        private String _strMessage;

        Threading(String strMessage){
            this._strMessage = strMessage;
        }
        public void run() { 
            // synchronized (TestThread.class) {
                try {
                    for(int i=0; i < 5; i++){
                        Thread.sleep(1000);
                        System.out.println(_strMessage + " : " + i);
                    }
                } catch (InterruptedException e) {
                }
            // }
        }
    }
}



注意 : 

因為線程的執行本身就是不確定的
加了 Synchronizes 只能確保這段程式碼和參數
並不能保證程序的執行順序!!!

如果真的要有順序,先暫時用 Sleep 頂替。

參考資料 : [Java] Synchronized 心得
參考資料 : JAVA筆記-synchronized 同步物件資料,避免Race Condition

歡迎轉載,請註明出處。

沒有留言:

張貼留言