天天看點

JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

 前排我先說結論:

繼承Thread 實作多線程  ,

是  ‘ 不 易 ’ 實作 資源共享 (甚至不易我都加了符号的),

而不是   不能實作資源共享 !!!

看看現在網上的有些文章 (包括一些所謂的面試寶典,文字簡短但是害人不淺),随便截一些圖: 

JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。
JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

 然後類似的例子 示範大緻如下 ,寫了個賣瓜例子:

JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

咋一看好像确實是資源不共享 。 

真的嗎,顯然是代碼寫的問題。 

1、 private int watermelon=10;  瓜 數 是類的 一個 私有變量 。

2、  new了 兩個 賣瓜的攤子, 每個攤子 都有 自己的10個瓜 。

 new TestThread().start();

 new TestThread().start();

每個線程自己賣自己的瓜, 本來就是 每個攤子 10個瓜 ,這是超賣? 這是資源不共享問題? 

這麼寫,明擺着不就是不同資源不同執行麼,何來所謂的資源共享問題? 

現在看看,我把調用的實作代碼寫成這樣:

TestThread testThread=new TestThread();
        
        new Thread(testThread).start();
        new Thread(testThread).start();      
JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

 運作結果,是不是就共享了 :

JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

這樣存在的問題就是 ,需要考慮線程并發帶來的 資料同步問題 :

多運作幾次,可以看到出現了一些 壞現象 

JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。
JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

 synchronized   了  :

把涉及到數量的變化的代碼塊,我們使用   synchronized  給它鎖起來 :

JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

這樣一來,盡管多個線程同時進行,操作同個資源 ,也不會出現 壞現象 ,誰能搶到資源,誰執行,但是執行時,别的都需要耐心等 :

JAVA 繼承Thread 實作多線程 資源不共享? 請保持清醒 。

是以說, 記住了 !!!

繼承Thread類 實作多線程   和 實作 Runnable接口   實作多線程    

這兩個的差別裡面 , 不要再說  繼承Thread類  不能 實作 多線程資源共享了!

是  ‘ 不 易 ’ 實作 資源共享 (不易也是勉強的言詞),而不是   不能實作資源共享 !