java同步
張貼日期:2013/2/23 上午 03:31:41
不加任何同步關鍵字 int a=1
多線程存取a變數將異常終止.不解釋,潛規則.
synchronized關鍵字,我取名叫"你被包了".這是是大手筆,所以很吃資源
可以包一個變數synchronized( int x ){ ... }
或是讓一個function成為包場synchronized function( ){ ... }
被包或是被包場後,除非放人/散場或是他太嗨掛了(有try就是Exception,其他就是異常終止),不然別人(其他線程)不能再包人/包場,這是潛規則(好黑暗)
被包之後別人也要包就要排隊,所以被包的時候作太多耗時的事情,別人(其他線程)就會一值卡在排隊(阻塞其他線程).
synchronized function( ){ ... } 同等於 function( ){ synchronized { ... } }
synchronized get() 同等於包場後立刻複製一個相同變數值回傳出去,所以b=get(),a跟b是獨立2個變數.
synchronized set(新值) 同等包場後將b的值複製寫回a,a跟b還是獨立2個變數.
int a前加上volatile關鍵字= volatile int a=1
b=a同等synchronized的b=get()
a=b同等synchronized的set(b)
底層處理上比synchronized get/set小很多所以性能介於"synchronized"跟"不同步"的操作之間
lock類
新手不要使用lock類,因為忘記unlock你就會被永久包場XD
除非你高到要處理性能瓶頸了
...雖然我想說性能出問題通常是其他地方寫得不好,而不是synchronized的錯
,所以新手用synchronized就夠了.
synchronized就是會自動unlock的lock類,並且是保證順序的
ReentrantLock是默認不保證順序的(可選保證順序)Lock類,大量線程下的表現比synchronized好,
但是還是有忘記unlock就永久包場的缺點,lock類都這樣.