我看了下別的大神的部落格。結合自己的練習了下多執行緒的併發問題。我覺得就多執行緒而言。最重要的就是要把整個業務放進同步鎖裡面。
synchronized這個關鍵字有兩種用法1、放方法名前形成同步方法;2、放在塊前構成同步塊。
比如:
classthread4test implements runnable
catch
(interruptedexception e)
system.
out.println(thread.currentthread().getname()+"
號視窗賣出
"+this.ticket--+"號票"
); }}}
}
輸出結果是
a號視窗賣出10號票a號視窗賣出9號票
a號視窗賣出8號票
a號視窗賣出7號票
a號視窗賣出6號票
a號視窗賣出5號票
a號視窗賣出4號票
a號視窗賣出3號票
a號視窗賣出2號票
a號視窗賣出1號票
這裡的同步鎖的位置是在run方法裡面。同步的是run方法。這樣的話啟動一條執行緒之後就會一直執行。直到a執行完畢之後b再去執行的時候就沒有票了。
例如:
class thread5test implementsrunnable
catch
(interruptedexception e)
system.out.println(thread.currentthread().getname()+"號視窗賣出"+this.ticket--+"號票");}}
}}}
執行結果:
a號視窗賣出10號票c號視窗賣出9號票
b號視窗賣出8號票
b號視窗賣出7號票
b號視窗賣出6號票
b號視窗賣出5號票
c號視窗賣出4號票
a號視窗賣出3號票
a號視窗賣出2號票
a號視窗賣出1號票
c號視窗賣出0號票
b號視窗賣出-1號票
synchronized放錯了位置,程式將synchronized放在了if語句的後面,當b執行緒取出2好票以後,此時ticket=1,等下一次a、b、c執行緒來的時候,ticket=1>0就進入if語句體,這時cpu分給執行緒的時間片是先b在c後a這樣就導致了上面的結果。
例如:
class thread6test implementsrunnable
catch
(interruptedexception e)
system.out.println(thread.currentthread().getname()+"號視窗賣出"+this.ticket--+"號票");}}
}}
輸出結果:
這裡的執行結果也是只有a售票。因為同步鎖的時候同步了整個的迴圈。
整個程式的業務是什麼?業務就是售票。換句話說。就是說要售票的時候不能出錯。售票的時候各個視窗還有業務彼此不能相互交叉干擾。
當乙個執行緒要使用火車票這個資源時,我們就交給它一把鎖,等它把事情做完後在把鎖給另乙個要用這個資源的執行緒
那麼。同步的時候就不是同步程式了。應該是同步銷售火車票的這個業務。例如:
class thread3test implementsrunnable
catch
(exception e)
this
.sale();}}
}public
synchronized
void
sale()
}}
這裡銷售火車票就是業務。在這裡同步的時候同步業務,而不是同步後台的票的處理的程式。票就算是再處理出來的也是票。
處理的時候是處理的業務。也就是售票。那麼,只要售票的時候不會出現問題就好。同步應該放在業務上,而不是票的處理上。
我是小菜鳥。這也是我第一次寫部落格。希望大家能夠不吝嗇的多多的指教。同時,也感謝各位大師。大神們在的分享。讓我學到了很多東西。
在此,我也把我的一點小小的經驗分享出來。希望更多的人能夠參與到其中來。
我也說了。我也是一直小菜鳥。希望大家能夠給我多多的指教。我只是寫出來了一點我自己的看法還有經驗。
程式設計這個東西是乙個務實,嚴謹的工作。只有經得起考驗的程式才是好的程式。
在此。也希望大家能夠給我多多的指教。提供更多的看法。我也會虛心的採納。不斷的學習。不斷的成長。
關於多執行緒的一點感想
寫了這麼多年多執行緒程式,多執行緒到底是用來幹嘛的,可能這是個很白痴的問題,就我的親身經歷看開主要是因為一下兩點 1.提公升程式效率 2.使得程式可以非同步執行,乙個執行緒幹這個活,另乙個執行緒幹另乙個活 嚴格來說,感覺這還是為了提公升程式效率,因為cpu本身就是在不同執行緒之間切換的,兩個執行緒能...
關於Linux的感想
最近一周比較清閒,於是有了較多的學習時間,加上最近思考了一些運維自動化的事,結合自己的linux經驗,算是 玩linux 玩了一周。基本是在centos 7.2下。大學時候,我主要學習c c 而且主要是在linux下,尤其是在fedora和ubuntu下,用了幾乎一年多。也裝過多種linux發行版關...
感想 關於球
一直以來都對三維gis的評價不高,認為只是個花架子。但是不可否認三維gis改變了我們對於世界的認識 googleearth等三維軟體給我們展現了一幅真實 直觀的地球,確實很炫。先將三維球分為兩類 a類 arcglobe skyline b類 googleearth等和好多可以執行在pad上的球 ar...