練習題:賣100個蘋果,實現資料共享。
新建乙個執行緒有兩種方式:1.繼承thread類;2.是實現runnable的方式:
那我們就先使用第一種方式來實現:
第一步:
/**
* 存在資料共享
* @author liujun**/
class
sharethread
extends
thread catch (interruptedexception e) }}
}}
在main方法開始三個執行緒:
sharethread msharethread1=new sharethread();
sharethread msharethread2=new sharethread();
sharethread msharethread3=new sharethread();
msharethread1.start();
msharethread2.start();
msharethread3.start();
執行的結果:
thread-0賣了乙個蘋果,還剩99
thread-1賣了乙個蘋果,還剩98
thread-2賣了乙個蘋果,還剩99
thread-0賣了乙個蘋果,還剩97//這裡資料出現有錯,因為上面的執行緒裡沒有使用同步鎖
thread-1賣了乙個蘋果,還剩97
........................
........................
thread-0賣了乙個蘋果,還剩2
thread-2賣了乙個蘋果,還剩1
thread-1賣了乙個蘋果,還剩0
thread-0賣了乙個蘋果,還剩-1 //這裡資料出現有錯,因為上面的執行緒裡沒有使用同步鎖
thread-2賣了乙個蘋果,還剩-2
第二步:
給sharethread中新增同步**塊:
/**
* 存在資料共享
* @author liujun**/
class
sharethread
extends
thread catch (interruptedexception e) }}
}}
}
再次執行main方法列印的結果:
thread-2賣了乙個蘋果,還剩98
thread-1賣了乙個蘋果,還剩99
thread-0賣了乙個蘋果,還剩97
thread-1賣了乙個蘋果,還剩96
thread-0賣了乙個蘋果,還剩95
........................
........................
thread-0賣了乙個蘋果,還剩1
thread-1賣了乙個蘋果,還剩0
thread-2賣了乙個蘋果,還剩0 //這裡資料出現有錯,都使用同步鎖了?為什麼????????
thread-0賣了乙個蘋果,還剩-1
第三步:
分析**:
多執行緒在使用synchronized的時候,多個執行緒使用的鎖物件必須是同乙個。
sharethread msharethread1=new sharethread();
sharethread msharethread2=new sharethread();
sharethread msharethread3=new sharethread();
上面這三行**new了三個物件,那麼上面使用的同步鎖是this;那上面的多執行緒在使用synchronized的時候,多個執行緒使用的鎖物件(this)不是同乙個,它們是分別為msharethread1,msharethread2,msharethread3。所以上面雖然使用了synchronized還是會出現資料有錯。
第四步:
修改**:
保證使多執行緒在使用synchronized的時候,多個執行緒使用的鎖物件是同乙個就行,下面使用了的同步鎖物件是:sharethread.class。
/**
* 存在資料共享
* @author liujun**/
class
sharethread
extends
thread catch (interruptedexception e) }}
}}
}
再次執行main方法列印的結果正常:
thread-2賣了乙個蘋果,還剩98
thread-1賣了乙個蘋果,還剩99
thread-0賣了乙個蘋果,還剩97
thread-1賣了乙個蘋果,還剩96
thread-0賣了乙個蘋果,還剩95
........................
........................
thread-0賣了乙個蘋果,還剩1
thread-1賣了乙個蘋果,還剩0
總結:
1.上面通過繼承thread類的方式已經實現資料共享,但是一般我們不定義靜態的變數作為資料共享,因為靜態的生命週期比較長。
2.建議實現資料共享時使用實現runnable來實現。
第一步:
/**
* 存在資料共享
*@author liujun**/
class sharerunable implements runnable catch (interruptedexception e) }}
}}
在main方法開始三個執行緒:
sharerunable mmyrunables=
new sharerunable();
newthread(mmyrunables).start();
newthread(mmyrunables).start();
newthread(mmyrunables).start();
執行的結果:
thread-0賣了乙個蘋果,還剩99
thread-1賣了乙個蘋果,還剩98
thread-2賣了乙個蘋果,還剩99
........................
........................
thread-0賣了乙個蘋果,還剩2
thread-2賣了乙個蘋果,還剩1
thread-1賣了乙個蘋果,還剩0
thread-0賣了乙個蘋果,還剩-1 //這裡資料出現有錯,因為上面的執行緒裡沒有使用同步鎖
thread-2賣了乙個蘋果,還剩-2
第二步:
給sharerunable中新增同步**塊:
/**
* 存在資料共享
*@author liujun**/
class sharerunable implements runnable catch (interruptedexception e)
}} }}
}
再次執行main方法列印的結果正常:
thread-2賣了乙個蘋果,還剩99
thread-1賣了乙個蘋果,還剩98
thread-0賣了乙個蘋果,還剩97
thread-1賣了乙個蘋果,還剩96
thread-0賣了乙個蘋果,還剩95
........................
........................
thread-0賣了乙個蘋果,還剩1
thread-1賣了乙個蘋果,還剩0
總結:
1.上面通過實現runable類的方式已經實現資料共享
2.建議實現資料共享時使用實現runnable來實現。
Java 多執行緒學習筆記 4 多執行緒共享資料
我們經常說某個變數是執行緒非安全的,某個變數是執行緒安全,這裡 是否安全 針對的是類的例項變數,如果是方法內部的私有變數,不會存在這個問題 package smaug.cloud.provider.thread.t7 created by naonao on 17 12 10.public clas...
多執行緒 資料共享
package thread 需求 簡單的買票程式 需多個視窗同時買票,實現資料共享 實現方式和繼承方式有什麼區別?實現方式避免了單繼承的侷限性。具體步驟 1.定義類實現runnable介面 2.覆蓋runnable介面中的run方法 3.通過thread類建立執行緒物件 4.將runnable介面...
Java多執行緒 變數共享分析
在編寫多執行緒程式時,最重要的就是搞清楚哪些變數是共享的,哪些變數是不共享的。也就是要分析清楚其中的原理呀。因為最近要使用多執行緒就看了一些,對使用thread類的子類建立執行緒的情況,總結如下 1.方法體內部定義的區域性變數不共享 這是因為方法內部定義的變數是在執行時動態生成的。每個執行緒都有乙個...