java面試總結(三)-線程

java面試總結(三)

第三部分-線程
1線程概述
1.1 什麼是進程呢?
進程是指運行中的應用程序,每個進程都有自己獨立的地址空間(內存空間),比如用戶點擊桌面的IE瀏覽器,就啓動了一個進程,操作系統就會爲該進程分配獨立的地址空間。當用戶再次點擊左面的IE瀏覽器,又啓動了一個進程,操作系統將爲新的進程分配新的獨立的地址空間。目前操作系統都支持多進程。
1.2 什麼是線程呢?
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。線程有就緒、阻塞和運行三種基本狀態。
1.3 進程和線程的區別是什麼?
進程是執行着的應用程序,而線程是進程內部的一個執行序列。一個進程可以有多個線程。線程又叫做輕量級進程。
線程與進程的區別歸納:
a.地址空間和其它資源:進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。
b.通信:進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。
c.調度和切換:線程上下文切換比進程上下文切換要快得多。
d.在多線程OS中,進程不是一個可執行的實體。
1.4 java什麼叫線程安全?什麼叫不安全?
線程安全就是線程同步的意思,就是當一個程序對一個線程安全的方法或者語句進行訪問的時候,其他的不能再對他進行操作了,必須等到這次訪問結束以後才能對這個線程安全的方法進行訪問。
什麼叫線程安全:
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。
線程安全問題都是由全局變量及靜態變量引起的。
若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。
存在競爭的線程不安全,不存在競爭的線程就是安全的。
1.5 線程間通信
線程之間通信的兩個基本問題是互斥和同步。
線程同步是指線程之間所具有的一種制約關係,一個線程的執行依賴另一個線程的消息,當它沒有得到另一個線程的消息時應等待,直到消息到達時才被喚醒。
線程互斥是指對於共享的操作系統資源(指的是廣義的"資源",而不是Windows的.res文件,譬如全局變量就是一種共享資源),在各線程訪問時的排它性。當有若干個線程都要使用某一共享資源時,任何時刻最多隻允許一個線程去使用,其它要使用該資源的線程必須等待,直到佔用資源者釋放該資源。
線程通信的主要方法:wait()、notify()、notifyAll()。
2線程的狀態
2.1創建線程有幾種不同的方式?
有4種方式可以用來創建線程:
繼承Thread類
實現Runnable接口
應用程序可以使用Executor框架來創建線程池
還有一種方式是實現Callable接口
2.2 線程調度的三個方法
休眠方法sleep(毫秒數) sleep(毫秒數,納秒數) ; 暫停方法yield() a.yield() ; 掛起方法join() a.join()
3線程同步
3.1什麼是線程同步,什麼是線程異步?同步的好處與弊端

線程同步:是多個線程同時訪問同一資源,等待資源訪問結束,浪費時間,效率低
線程異步:訪問資源時在空閒等待時同時訪問其他資源,實現多線程機制
同步的好處與弊端:好處:解決了線程的安全問題 ;弊端:每次都有判斷鎖,降低了效率。但是在安全與效率之間,首先考慮的是安全。
3.2 Java同步機制有4種實現方式:
① ThreadLocal ② synchronized( ) ③ wait() 與 notify() ④ volatile
4線程死鎖
4.1死鎖是如何產生的?如何避免死鎖?

產生原因:

  • ①系統資源不足;
  • ②進程運行推進的順序不合適;
  • ③資源分配不當

產生死鎖的四個必要條件:

  • ①互斥條件:一個資源每次只能被一個進程使用;
  • ②請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放
  • ③不可剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪
  • ④循環等待條件:若干進程之間形成一種頭尾相連的循環等待資源關係
    避免:該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。(安全狀態、銀行家算法)。

避免嵌套鎖,只在需要的地方使用鎖和避免無限期等待是避免死鎖的通常辦法。
4.2 sleep() vs wait()
sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,把執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。
wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
5 如何結束一個線程?

一.程序運行結束,就停止了。
二.不能使用stop方法,應該使用通知的方式。例如:設置一個boolean類型的循環標記,在run方法中使用此循環標記做循環,添加一個公共的更改循環標記的方法,在希望停止線程時,調用此公共方法即可。

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