java多執行緒實現資料共享

2021-07-16 06:50:08 字數 4019 閱讀 7419

練習題:賣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.方法體內部定義的區域性變數不共享 這是因為方法內部定義的變數是在執行時動態生成的。每個執行緒都有乙個...