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類都這樣.