馬士兵高併發(一)筆記

一、
1.synchronized關鍵字鎖定的是對象不是代碼塊,demo中鎖的是object對象的實例(堆內存中)
2.鎖定的對象有兩種情況:①類的實例 ②類的字節碼(.class)
3.關於線程安全:加synchronized關鍵字之後不一定能實現線程安全,具體還要看鎖定的對象是否唯一。

二、
1.synchronized(this)鎖定的是當前類的實例,demo中鎖定的是Demo02類的實例
2.此demo中如果Demo02類是單例的話可以保證在多線程訪問時是線程安全的,
如果存在有多個Demo02的實例的話在多線程中不能保證線程安全,因爲方法中的鎖不唯一了。(堆內存中的地址不一樣)

三、
synchronized關鍵字修飾普通方法等同於synchronized(this)

四、
1.synchronize關鍵字修飾靜態方法鎖定的是類的.class文件
2.靜態方法中synchronize鎖定代碼塊,鎖定的對象不能是類的實例,只能是類的.class文件。
原理如同在靜態方法中不能直接調用非靜態方法
3.類的.class文件是唯一的,所以說synchronize修飾靜態方法或者鎖定的對象是類的.class文件的時候
在多線程中是可以實現線程安全的

五、
1.run()方法沒加synchronized關鍵字時,多個線程同時訪問count,線程是不安全的
2.run()方法加上synchronized關鍵字後,鎖定的是Demo05對象的實例,因爲只創建了
一個Demo05的實例,多個線程訪問時都要拿到Demo05的鎖標記才能執行,在多個線程同時訪問時也是線程安全的

六、
1.執行可以知道,demo中雖然加上了synchronized關鍵字來修飾方法,但是線程是不安全的。爲什麼呢??
分析一下:synchronized修飾的是普通方法,鎖定的是Demo06實例,從Main方法中可以看到,在for循環中
創建了多個Demo06的實例,也就是說每個線程對應都拿到各自的鎖標記,可以同時執行。
例子:
多人同時上廁所,廁所門只有一把鎖的時候是一個人上完之後把鑰匙(鎖標記)給到下一個人纔可以開門上廁所
如果廁所門的鎖有多個鑰匙的情況下,就是每個人都有鎖的鑰匙了,大家可以一起去打開門來上廁所。(歸根結底還是堆內存上的地址)
demo中就如同廁所門的鎖有多把鑰匙(鎖標記),不能實現線程安全

七、
同步方法和非同步方法是可以同時調用的

八、
對業務寫方法加鎖,同時也要對業務讀方法加鎖,否則容易產生髒讀問題

九、
一個同步方法可以調用另一個同步方法,一個線程已經擁有某個對象的鎖,
再次申請的時候仍然會得到該對象的鎖
也就是說synchronized獲得的鎖是可重入的

十、
一個同步方法可以調用另一個同步方法,一個線程已經擁有某個對象的鎖,
再次申請的時候仍然會得到該對象的鎖
也就是說synchronized獲得的鎖是可重入的(這裏是繼承中有可能發生的情形,子類調用父類的同步方法)

十一、
程序在執行過程中,如果出現異常,默認情況鎖會被釋放

十二、
* volatile 關鍵字,使一個變量在多個線程間可見
* A B線程都用到一個變量,java默認是A線程中保留一份copy,這樣如果B線程修改了該變量,則A線程未必知道
* 使用volatile關鍵字,會讓所有線程都會讀到變量的修改值
*
* 在下面的代碼中,running是存在於堆內存的t對象中
* 當線程t1開始運行的時候,會把running值從內存中讀到t1線程的工作區,在運行過程中直接使用這個copy,並不會每次都去
* 讀取堆內存,這樣,當主線程修改running的值之後,t1線程感知不到,所以不會停止運行
*
* 使用volatile,將會強制所有線程都去堆內存中讀取running的值

十三、
volatile並不能保證多個線程共同修改running變量時所帶來的不一致問題,也就是說volatile不能替代synchronized

十四、
對比上一個程序,可以用synchronized解決,synchronize可以保證可見性和原子性,volatile只能保證可見性

十五、
解決同樣的問題的更高效的方法,使用AtomXXX類
* AtomXXX類本身方法都是原子性的,但不能保證多個方法連續調用是原子性

十六、
1.業務邏輯中只有下面這句需要sync,這時不應該給整個方法上鎖
2.採用細粒度的鎖,可以是線程爭用時間變短,從而提高效率

十七、
鎖定某對象o,如果o的屬性發生改變,不影響鎖的使用
* 但是如果o變成另外一個對象,則鎖定的對象發生改變
* 應該避免將鎖定對象的引用變成另外一個對象

十八、
不要以字符串常量作爲鎖定的對象

原地址 http://www.cnblogs.com/jpfss/p/9229522.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章