一、復習
threadLocals是不具有繼承性的 inheritableThreadLocal類是具有繼承性的, Thread類的部分原始碼決議
二、多CPU的好處
減少執行緒背景關系切換的開銷
三、 計算機的記憶體模型
一塊主記憶體,然后被多個執行緒所呼叫,每個執行緒又有自己的一級快取,執行緒共享了二級快取 出現的問題:一級快取是每個執行緒自己獨有的,運行的時候,會先去一級快取里面找,如果沒有再去二級快取,最后去記憶體,所以如果多個執行緒對一個共享變數操作的話,就會導致一級快取里放置的資料是過期的,因此會產生問題, 下面這張圖是一個計算機架構模型

每個核心都有自己的控制器和計算器,控制器又包含一組暫存器和操作控制器, 由于cache的存在會導致記憶體不可見問題, synchronized關鍵字是Java提供的一種原子性內置鎖,Java內置的使用者看不到的鎖叫做內部鎖,又稱為監視器鎖,執行緒的執行代碼在進入到synchronied陳述句的時候,會自動獲取內部鎖,這時候,如果其他執行緒如果想要獲取該共享物件就會進入阻塞狀態,除非原執行緒釋放鎖,或者拋出例外,或者原執行緒呼叫了wait方法主動釋放了該鎖,其他執行緒才能拿到資源, 內置鎖是一中排他鎖,也就是當一個執行緒釋放了鎖之后,其他執行緒才能取得這把鎖,
1.為什么synchronized性能低下
因為使用synchronized會造成背景關系切換,容易造成多執行緒阻塞,
2.執行緒一致性
Java中的執行緒是與作業系統的原生執行緒是一一對應的,所以當一個執行緒阻塞的時候,需要從用戶態切換到內核態來執行阻塞操作,
3.synchronized實作基本原理
一切操作都是基于記憶體中的資料來進行的,基本上cache中的資料過時性問題就不存在,總是取記憶體中的最新資料,總是把最新資料重繪到記憶體中去,
四、volatile關鍵字
使用該關鍵字,基本實作和synchronized一致,都是直接讀記憶體而不是讀取執行緒的作業記憶體,并且重繪值也是直接重繪到記憶體,
package com.ruigege.OtherFoundationOfConcurrent2;
public class ThreadNotSafeInteger {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
上面的代碼是不安全的,下面舉兩個執行緒安全的例子
package com.ruigege.OtherFoundationOfConcurrent2;
public class ThreadSafeInteger1 {
private int value;
public synchronized int getValue() {
return value;
}
public synchronized void setValue(int value) {
this.value = value;
}
}
package com.ruigege.OtherFoundationOfConcurrent2;
public class ThreadSafeInteger2 {
private volatile int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
五、原始碼:
所在包:com.ruigege.OtherFoundationOfConcurrent2 https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050 博客園:https://www.cnblogs.com/ruigege0000/ 歡迎關注微信公眾號:傅里葉變換,個人賬號,僅用于技術交流 
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/225095.html
標籤:Java
下一篇:tomcat求助
