Java執行緒(一):執行緒安全與不安全
作為一個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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 什麼是執行緒安全和執行緒不安全執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java 執行緒安全 與 鎖Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Java執行緒安全Java執行緒
- HashMap為何執行緒不安全HashMap執行緒
- SimpleDateFormat一定是執行緒不安全嗎?ORM執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- 什麼時候執行緒不安全?怎樣做到執行緒安全?怎麼擴充套件執行緒安全的類?執行緒套件
- Java執行緒池一:執行緒基礎Java執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Java與執行緒Java執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- 執行緒與多執行緒執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- Java多執行緒001——一圖讀懂執行緒與程式Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- HashMap1.7與1.8執行緒不安全講解HashMap執行緒
- 深入理解JVM(③)執行緒與Java的執行緒JVM執行緒Java
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- java執行緒執行緒休眠,sleep方法Java執行緒
- 執行緒安全執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 執行緒、執行緒與程式、ULT與KLT執行緒
- 詳解Java執行緒安全Java執行緒
- Java執行緒安全小結Java執行緒