模擬面試-線程向

設計模式切入?

1,設計模式爲了實現什麼功能

設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼讓代碼更容易被他人理解保證代碼可靠性
2,瞭解設計模式的六大原則麼

  • 開閉原則(對擴展開放,對修改關閉)
  • 里氏替換原則(任何有基類存在的地方,子類一定可以出現)
  • 依賴倒置原則(針對接口編程,依賴於抽象而不是依賴於具體)
  • 接口隔離原則(能用多個接口咱不用一個接口實現功能)
  • 迪米特法則(一個實體應該儘量與其他實體少發生相互作用)
  • 合成複用法則(儘量使用聚合/組合的方式,不使用繼承)

3,說說常見的幾種設計模式

單例模式http://blog.csdn.net/sinat_33087001/article/details/77774298
因爲要確保系統裏對象的唯一性,例如打印程序和打印任務,必須一個一個打。

工廠模式http://blog.csdn.net/sinat_33087001/article/details/77775151
適配器模式http://blog.csdn.net/sinat_33087001/article/details/77776712
觀察者模式http://blog.csdn.net/sinat_33087001/article/details/77776922

4,單例模式有哪些類型。類型的優缺點
懶漢(非線程安全,線程安全(方法加同步),雙重檢查,靜態內部類),餓漢
5,手寫一個雙重檢查的單例模式
6,這個設計模式有沒有可能出錯呢

怎麼避免出錯

1,談談volatile修飾怎麼避免出現錯誤

2,volatile怎麼實現可見性和有序性
3,併發編程還有哪些特性
4,synchronized是怎麼實現這三個性質的

  • jMM內存模型提供了lock和unlock兩種操作,體現在指令上就是moniterenter和moniterexit,體現在java代碼塊兒上就是synchronized同步塊兒。所以java同步塊兒能實現原子性。
  • 對一個變量執行unlock之前一定要將當前值同步到主內存中去(store and write)
    read—load—use–assign—store—-write

  • 一個變量在同一時刻只能被一條線程lock,同步塊之間是串行進入

5,synchronized的原理
怎麼實現三個性質的
6,volatile和synchronized有哪些區別,應用場景

  • volatile輕量級的同步機制,但不能保證原子性,synchronized可以保證原子性
  • volatile只能使用在變量級別,synchronized可使用在方法級別
  • volatile不會造成線程的阻塞,而synchronized可能會造成線程的阻塞.

鎖的狀態

1,既然synchronized可以實現併發編程的三個特性,那麼它是萬能的麼?缺點是什麼
頻繁的掛起和執行需要系統調用,而系統調用的代價相當高,需要再用戶態和內核態中來回切換。其次,每個輕量級進程都需要一個內核線程的支持,因此會消耗內核的資源。
2,java是通過什麼方式減少獲得鎖和釋放鎖所帶來的性能消耗?哪三種狀態切換
偏向鎖—-輕量級鎖—-重量級鎖
3,爲什麼使用這三種狀態。
http://blog.csdn.net/sinat_33087001/article/details/77849575
三種狀態的使用場景
4,還有哪些優化方案。
鎖的自旋和自適應自旋,鎖粗化和鎖消除(逃逸分析的數據支持,如果一段代碼中,堆上所有的數據都不會逃逸出去從而被其它線程訪問到,那就可以把它們當做棧上的數據對待,可以認爲是線程私有的,那麼就可以消除代碼內部的同步),而鎖粗化(是如果對同一個對象反覆加鎖和解鎖,那麼即使沒有線程競爭,也會帶來不必要的性能損耗)
http://blog.csdn.net/sinat_33087001/article/details/77644441
5,既然說到鎖,就談談爲什麼會發生死鎖。怎麼避免死鎖
6,了不瞭解happens-before

  • 程序次序規則(Program Order Rule):在一個線程內,按照程序代碼順序,書寫在前面的操作先行發生於書寫在後面的操作。準確地說,應該是控制流順序而不是程序代碼順序,因爲要考慮分支、循環等結構。
  • 傳遞性(Transitivity):如果操作A先行發生於操作B,操作B先行發生於操作C,那就可以得出操作A先行發生於操作C的結論。
  • 對象終結規則(Finalizer Rule):一個對象的初始化完成(構造函數執行結束)先行發生於它的finalize()方法的開始。
  • 管程鎖定規則(Monitor Lock Rule):一個unlock操作先行發生於後面對同一個鎖的lock操作。這裏必須強調的是同一個鎖,而“後面”是指時間上的先後順序。
  • volatile變量規則(Volatile Variable Rule):對一個volatile變量的寫操作先行發生於後面對這個變量的讀操作,這裏的“後面”同樣是指時間上的先後順序。
  • 線程啓動規則(Thread Start Rule):Thread對象的start()方法先行發生於此線程的每一個動作。
  • 線程終止規則(Thread Termination Rule):線程中的所有操作都先行發生於對此線程的終止檢測,我們可以通過Thread.join()方法結束、Thread.isAlive()的返回值等手段檢測到線程已經終止執行
  • 線程中斷規則(Thread Interruption Rule):對線程interrupt()方法的調用先行發生於被中斷線程的代碼檢測到中斷事件的發生,可以通過Thread.interrupted()方法檢測到是否有中斷髮生。

http://blog.csdn.net/sinat_33087001/article/details/77621189#t21

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