1. 鎖的優化有哪些手段?java
(1)下降 鎖 的範圍 例如:將方法上的鎖能夠加到 代碼快上安全
(2)鎖分離:讀讀之間不須要同步,讀寫和寫寫之間才須要同步,例如:讀寫鎖多線程
鎖分離延伸:只要操做互不影響,就能夠鎖分離,例如 LinkedBlockingQuene併發
(3)減小鎖力度:將一個大對象拆分紅對個小對象,每一個小對象能夠被一個線程訪問,例子:CurrentHashMap性能
(4)鎖粗化:爲了保證多線程間的有效併發,會要求每一個線程持有鎖的時間儘可能短,即在使用完 公共資源後,應該當即釋放鎖。只有這樣,等待在這個鎖上的其餘線程才能儘早的得到資源執行 任務。可是,凡事都有一個度,若是對同一個鎖不停的進行請求、同步和釋放,其自己也會消耗 系統寶貴的資源,反而不利於性能的優化優化
例子:for循環中 鎖 加在循環外比 加載循環裏 好spa
public void demoMethod(){ synchronized(lock){ //do sth. } //作其餘不須要的同步的工做,但能很快執行完畢 synchronized(lock){ //do sth. } }
==》粗化:線程
==》粗化code
(5)鎖消除:在即時編譯器時,若是發現不可能被共享的對象,則能夠消除這些對象的鎖操做對象
名稱:不可被共享的對象(方法中聲名的對象,且沒有越界:沒有將該對象return)
例如:StringBuffer不可被共享,但StringBuffer是線程安全的,全部須要去掉鎖
2. 什麼是大對象?
答:多個線程須要同時訪問的對象
3. 鎖消除是在哪兒作?
答:在 JVM中