同步的作用
- 1揽乱、確保以原子的方式執(zhí)行操作:防止讀取正在被修改的狀態(tài)變量
- 2、 內存可見性:確保一個線程修改了對象狀態(tài)后,其他線程可以看到
** 可以通過使用【同步】或是類庫中內置的同步來保證對象被安全的發(fā)布**
3.1 可見性
失效數據
非原子的64位操作
加鎖與可見性:所有執(zhí)行讀操作或是寫操作的線程都必須在同一個鎖上同步
volatile
發(fā)布與逸出
- 發(fā)布(publish)是一個對象可以在當前作用域之外的地方被引用到
- 逸出(Escape)當某個不該被發(fā)布的對象被發(fā)布時,稱為逸出
- 發(fā)布一個對象時掉瞳,對象內部非私有域中引用的所有對象都會被發(fā)布
- 當把一個對象傳給外部方法時,這個對象已經被發(fā)布
- 發(fā)布一個內部類的時候浪漠,這個類本身也被發(fā)布
- 不要再構造過程中使得this引用逸出
線程封閉
- 線程封閉(Thread Confinement):如果只在單線程內訪問數據陕习,就不需要同步
- 常見的線程封閉對象:1、JDBC 中的connection對象郑藏;2衡查、java中的局部變量瘩欺;3必盖、java中的ThreadLocal變量
不變性
- 滿足同步需求的另外一個做法是使用不可變對象(Im'mutable Object)
- 不可變對象一定是線程安全的