synchroized和Lock的初級筆記

 

面試官:synchroized和Lock的區別是什麼?

一般公司開始面試多線程時第一個問題基本都是這個了,也是能最能看出面試者水平的一個問題了,有一句話:自己知道的越多,發現知道的越不多。聽起來是不是很拗口,就看你看待問題的深度了。。我這裏也是針對面試,沒有涉及到真正的底層語義。。
 
1、Lock是一個接口他有很多實現類,而synchroized是個關鍵字 ,是java唯一一個內置鎖
2、lock拿鎖和放鎖需要手動去操作,有一套標準的範式寫法try{拿鎖}finally{放鎖},synchroized的加鎖和放鎖        是jdk來幫我們完成
3、lock可以知道鎖的狀態,synchroized不能知道
4、lock拿鎖的方式多,有tryLock嘗試拿鎖、tryLock(outtime)帶超時時間的拿鎖,synchroized則單一的一種        方式拿鎖
5、lock只鎖代碼塊。synchroized 代碼塊,方法,類,引申下 加載普通方法上的是對象鎖,加在靜態方法上的是       類鎖(鎖額是.class文件,根據雙親委派模型 JVM裏一個類只會有一個.class文件,這就有引申另外一個常見       的面試題了,哈----)
6、synchroized是非公平鎖不能改,lock默認是非公平鎖,可以改變
7、如果只是很簡單的拿鎖和放鎖的操作,建議使用synchroized,Lock怎麼說也是個對象效率上比synchroized 要差一些,如果要知道其他一些鎖中間的狀態還是要使用lock的
8、lock和synchroized 都能保證原子性和可見性(volitile關鍵字只能保證可見性)
9、兩者都是可重入鎖(這也是個面試題:可重入鎖的原理?)

10.synchroized 使線程進入“阻塞“狀態,Lock使線程進入"等待"狀態

 
面試官:synchroized 是悲觀鎖還是樂觀鎖?
一般面試者:悲觀鎖!這樣回答也沒錯,但是可以更深入,synchroized  在jdk6以後進行了大量的優化加入了
(1)無鎖狀態,(2)偏向鎖,(3)輕量級鎖(4)重量級鎖,從(1-4)是鎖的升級,這裏注意是沒有鎖降級的,具體升級網上隨便找篇看吧,從(1-4)的變化中我們可以推導出 synchroized是整體是悲觀,在線程少的時候它是不會真加鎖的,畢竟拿鎖是個很耗時的操作
偏向鎖:當持有鎖的線程再次申請鎖時,不需要同步動作直接得到鎖,只有一個線程進入資源臨界區
輕量級鎖:多個線程交替進入資源臨界區
重量級鎖:多個線程同時進入資源臨界區
 
面試官:說下公平鎖和非公平鎖?
公平鎖 :可以想象有一個隊列 所以等待的線程按照順序執行。這樣能保證所有的線程都能執行,在效率上不如非公平鎖,因爲當一個線程執行完成去喚醒等待線程時需要頻繁的上下文切換(切記它是很耗時)
非公平 :想象是個混亂的地方 先到先得,但是在極端情況下會造成線程飢餓,導致線程一直在等待
 
面試官:自旋鎖瞭解嗎?
1.鎖競爭不激烈 且佔用所時間很短的代碼塊有很大的性能提升,因爲它可以減少線程阻塞喚醒消耗,不會造成上下文切換,上下文切換 要重新加載被選中線程的執行信息到工作內存,代價是很高的
2.競爭很激烈或者代碼塊執行時間很長的不要使用自旋鎖,佔着CPU不幹事也是一種罪啊
 
 
 

 

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