Java執行緒(一):執行緒安全與不安全

喝水會長肉發表於2021-12-05

作為一個Java web開發人員,很少也不需要去處理執行緒,因為伺服器已經幫我們處理好了。記得大一剛學Java的時候,老師帶著我們做了一個區域網聊天室,用到了AWT、Socket、多執行緒、I/O,編寫的客戶端和伺服器,當時做出來很興奮,回學校給同學們演示,感覺自己好NB,呵呵,扯遠了。上次在百度開發者大會上看到一個提示語,自己寫的程式碼,6個月不看也是別人的程式碼,自己學的知識也同樣如此,學完的知識如果不使用或者不常常回顧,那麼還不是自己的知識。大學零零散散搞了不到四年的Java,我相信很多人都跟我一樣,JavaSE基礎沒打牢,就急忙忙、興沖沖的搞JavaEE了,然後學習一下前臺開發(html、css、javascript),有可能還搞搞jquery、extjs,再然後是Struts、hibernate、spring,然後聽說找工作得會linux、oracle,又去學,在這個過程中,是否迷失了,雖然學習面很廣,但就像《神鵰俠侶》中黃藥師評價楊過,博而不精、雜而不純,這一串下來,感覺做Java開發好難,並不是學著難,而是知識面太廣了,又要精通這個,又要精通那個,這只是我迷茫時候的想法,現在我已經找到方向了。


        迴歸正題,當我們檢視JDK API的時候,總會發現一些類說明寫著,執行緒安全或者執行緒不安全,比如說StringBuilder中,有這麼一句,“將StringBuilder 的例項用於多個執行緒是不安全的。如果需要這樣的同步,則建議使用StringBuffer。 ”,那麼下面手動建立一個執行緒不安全的類,然後在多執行緒中使用這個類,看看有什麼效果。


        Count.java:


public 
class 
Count 
{


    private int num ;

    public void increment ( ) {

       num ++ ;

    }

    public int get ( ) {

        return num ;

    }

}
       在這個類中的increment方法是累加num值,步長為 1


       ThreadTest .java:
//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
public class ThreadTest {

    public static void main ( String [ ] args ) {

       Count count = new Count ( ) ;

       Runnable runnable = new Runnable ( ) {

            public void run ( ) {

                for (int i = 0 ; i < 10000 ; i ++ ) {

                   count . increment ( ) ;

                }

            }

        } ;

       List <Thread > threads = new ArrayList < > ( 10 ) ;

        for (int i = 0 ; i < 10 ; i ++ ) {

           Thread thread = new Thread (runnable ) ;

           threads . add (thread ) ;

           thread . start ( ) ;

        }

        while ( true ) {

            if ( allThreadTerminated (threads ) ) { // 所有執行緒執行結束

               System .out . println (count . get ( ) ) ;

                break ;

            }

        }

    }

    private static boolean allThreadTerminated ( List <Thread > threads ) {

        for (Thread thread : threads ) {

            if (thread . isAlive ( ) ) {

                return false ;

            }

        }

        return true ;

    }

}


        這裡啟動了10個執行緒,每個執行緒累加1萬次,我們期望的最終結果是10萬,看一下輸出結果:

95388

        在我的電腦上執行,大多數情況下都會得到一個小於10萬的值,那麼想要得到我們期望的結果,就需要保證Count在多執行緒下使用是安全的,如何保證,請看下文。

《Java執行緒(二):執行緒同步synchronized和volatile》


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2845835/,如需轉載,請註明出處,否則將追究法律責任。

相關文章