面試題-線程

1.什么是線程 ?線程和進程的區別 ?

線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。而進程是系統中

正在運行的一個程序,程序一旦運行就是進程。

區別:(1)線程是 CPU 調度的基本單位,沒有獨立的地址空間;進程是資源分配的基本單位,有獨立的地址空

間。

(2)進程間切換代價大,線程間切換代價小。

(3)進程擁有的資源多,線程擁有的資源少。

(4)一個進程無法直接訪問另一個進程的資源,同一進程內的多個線程可以共享該進程的資源。

(5)線程屬于進程,不能獨立執行,每一個進程至少要有一個線程,并成為主線程。

2.描述 CPU 和多線程的關系 ?

(1)第一階段:單CPU時代,單CPU在同一時間點,只能執行單一線程。

(2)第二階段:單CPU多任務階段,計算機在同一時間點,并行執行多個線程。但這并非真正意義上的同時執

行,而是多個任務共享一個CPU,操作系統協調 CPU 在某個時間點執行某個線程,因為CPU在線程之間切換比較

快,給人的感覺就好像是多個任務在同時運行。

(3)第三階段:多 CPU 多任務階段,真正實現了在同一時間點運行多個線程。

3.什么是線程安全和線程不安全 ?

(1)線程安全:指多個線程在執行同一段代碼的時候采用加鎖機制,使每次的執行結果和單線程執行的結果都是

一樣的,不存在執行程序時出現意外結果。

(2)線程不安全:指不提供加鎖保護機制,有可能出現多個線程先后更改數據造成所得到的數據是臟數據。

4.描述線程的生命周期 ?(畫圖)

線程的生命周期包括五個階段:創建、就緒、運行、阻塞、銷毀。

(1)創建:用 new 關鍵字建立一個線程后,該線程對象就處于創建狀態,處于新生狀態的線程有自己的內存空

間,通過調用 start() 方法進入就緒狀態。

(2)就緒:調用線程的 start() 方法后,線程進入就緒狀態,這時候線程處于等待 CPU 分配資源階段,誰先搶的

CPU資源,誰開始執行。

(3)運行:當就緒的線程被調度并獲得 CPU 資源時,便進入運行狀態,run() 方法定義了線程的操作和功能。

(4)阻塞:在運行狀態的時候,可能因為某些原因導致運行狀態的線程變成了阻塞狀態,比如 sleep()、wait() 之

后線程就處于了阻塞狀態,這個時候需要其它機制將處于阻塞狀態的線程喚醒,比如調用 notify() 或者 notifyAll()

方法,喚醒的線程不會立刻執行 run() 方法,他們要再次等待 CPU 分配資源進入運行狀態。

(5)銷毀:如果線程正常執行完畢后或線程被提前強制性的終止或者出現異常導致結束,那么線程就要被銷毀,

同時釋放資源。

5.wait、sleep、join、yield 的區別 ?

(1)wait:wait 方法是屬于 Object 類中的,wait 過程中線程會釋放對象鎖,只有當其它線程調用 notify 時才能

喚醒此線程。wait 使用時必須先獲取對象鎖,即必須在 Synchronized 修飾的代碼塊中使用,那么相應的 notify

方法同樣也必須在 Synchronized 修飾的代碼塊中使用,如果沒有在 Synchronized 修飾的代碼塊中使用,那么在

運行時就會拋出 IllegalMonitorStateException 異常。

(2)sleep:在指定時間內讓當前正在執行的線程暫停執行,sleep 過程中線程不會釋放鎖,只會阻塞線程,當到

了指定的時間后才會自動恢復運行狀態。

(3)join:等待調用 join 方法的線程結束之后,程序將會繼續執行。

(4)yield:暫停當前正在執行的線程對象,yield 過程中不會釋放資源鎖,和 sleep 不同的是 yield 方法并不會讓

線程進入阻塞狀態,而是讓線程重回就緒狀態,允許其它具有相同優先同級的線程獲得運行的機會。

6.Synchronized 和 Lock 的區別 ?

(1)Lock 是一個接口,而 Synchronized是 java 的一個關鍵字。

(1)Lock 有比 Synchronized 更精確的線程語義和更好的性能。

(2)Synchronized 會自動釋放鎖,從而可以避免死鎖,而 Lock 一定要求程序員手工釋放,可能引起死鎖,并且

必須在 finally 從句中釋放。

7.ThreadLocal、Volatile、Synchronized 的作用和區別 ?

(1)ThreadLocal 不是為了解決多線程訪問共享變量,而是為每個線程創建一個單獨的變量副本,提供了保持對

象的方法和避免參數傳遞的復雜性。

(2)Volatile 主要是用來在多線程中同步變量。

(3)Synchronized 關鍵字保證了數據讀寫一致和可見性等問題。

8.同步方法和同步代碼塊哪個更好 ?

(1)同步代碼塊是更好的選擇,因為它不會鎖住整個對象,而同步方法會鎖住整個對象,哪怕這個類中有多個不

相關聯的同步代碼塊,這通常會導致他們停止執行并需要等待獲得這個對象上的鎖。

(2)同步代碼塊更符合開發調用的原則,只要在需要鎖住的代碼塊中鎖住相應的對象,這樣從側面來說也可以避

免死鎖。

  • 同步方法使用 Synchronized 修飾方法,在調用該方法前,需要獲得內置鎖(java每個對象都有一個內置

    鎖),否則就處于阻塞狀態。

  • 同步代碼塊使用 Synchronized(object){} 進行修飾,在調用該代碼塊時,需要獲得內置鎖,否則就處于阻塞狀

    態。

9.什么是死鎖 ?如何避免死鎖 ?

線程死鎖:是指由于兩個或者多個線程競爭資源或者互相持有對方所需要的資源,導致這些線程處于等待狀態,無

法前往執行,當兩個線程相互等待對方釋放資源時,就會發生死鎖。

(1)避免多次鎖定。

(2)具有相同的加鎖順序。

(3)使用定時鎖。

(5)死鎖檢測。

10.常見的線程池叫什么 ?線程池的作用是什么 ?

常見的線程池有:FixedThreadPool、CachedThreadPool、SingleThreadPool、ScheduledThreadPool。

作用:(1)減少在創建和銷毀線程上所花的時間以及系統資源的開銷 。

? (2)如果不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存以及 ”過度切換”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450458.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

區塊鏈入門教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 區塊鏈(blockchain)是眼下的大熱門,新聞媒體大量報道,宣稱它將創造未來。 可是&#xf…

響應式面包屑菜單

在線演示 本地下載 轉載于:https://www.cnblogs.com/qixidi/p/10064991.html

5個能提高你工作效率的Excel技巧

Excel的應用在工作中還是十分廣泛的,那么下面小編就來為大家分享5個Excel技巧來幫助大家輕松提高工作效率。1. 不用數據驗證或數據有效性,自動生成下拉列表方法:按【Alt↓】組合鍵注意點:光標要定位在已有數據區域的下一個單元格&…

很好的推薦書籍

五百本編程書籍推薦【信息化類】 書號書名作者出版時間定價對應頁碼TP02041企業資源計劃(ERP)教程羅鴻2006-1¥28.00—TP02031ERP理論、方法與實踐周玉清 等2005-12¥39.00—TP01059ERP原理設計實施(第3版)羅…

消息推送

我有一個運動類app軟件,它的服務器是集群式的,有N臺服務器。現在我想在app上開發一個功能,在每天的晚上11點進行消息推送,他會推送今天走多少步,是否健康,明天至少走多少步。請問如何11點能準時觸達到用戶?…

day10:函數進階

1,函數的命令空間(內置命名空間,全局命名空間,局部命名空間),內置大于全局大于局部 2,內置命名空間,就是Python解釋器一啟動就可以使用的名字,存儲在內置命名空間中&…

mysql導入source注意點

mysql的導入導出要注意字符集,防止查詢亂碼! 導入前設置字符集 set names utf8; //導入指定編碼source /xxx.sqlcommit;

嗶哩嗶哩修改視頻速度

按住f12,打開控制臺,先輸入 const video document.querySelector("video"); video.play() // 開始 video.pause() // 暫停 video.playbackRate3 // 三倍速

編譯預處理

C語言編譯中,什么時候應該使用32位編譯程序? 32位編譯程序應該在32位操作系統上使用。由32位編譯程序生成的32位程序比16位程序運行得更快,這正是任何32位的東西都很熱門的原因。有那么多不同版本的Microsoft Windows,它們和哪種編譯程序組成…

去除List集合中的重復值(四種好用的方法)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 最近項目中需要對list集合中的重復值進行處理,大部分是采用兩種方法,一種是用遍歷list集合判斷后賦給另一個list…

jQuery---過濾選擇器

4、過濾選擇器 過濾選擇器主要是通過特定的過濾規則來篩選出所需的DOM元素,過濾規則與CSS 中的偽類選擇器語法相同,即選擇器都以一個冒號(:)開頭。按照不同的過濾規則, 過濾選擇器可以分為基本過濾、內容過濾、可見性過濾、屬性過濾、子元素過…

安裝Frida抓包工具

curl https://bootstrap.pypa.io/get-pip.py | python3 pip install frida pip install frida-tools

正則介紹_grep

2019獨角獸企業重金招聘Python工程師標準>>> 10月16日任務 9.1 正則介紹_grep上 9.2 grep中 9.3 grep下 grep基本用法 grep [-cinvABC] word filename centos7.x版本的grep實則為grep --colorauto-c 顯示匹配到的行數[rootlocalhost ~]# cp /etc/passwd /tmp [rootl…

[國家集訓隊]middle

嘟嘟嘟 有誰能想到這題會用到主席樹呢?(不愧是WJMZBMR出的題) 首先考慮如果區間是固定的話,中位數該怎么求。 沒錯,二分。如果大于當前二分值\(mid\)的數比小于\(mid\)的數多,說明\(mid\)還可以再變大&…

Java List<Object>去掉重復對象-java8

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 public List<String> removeStringListDupli(List<String> stringList) {Set<String> set new LinkedHashSet<&g…

Vue + webpack 項目配置化、接口請求統一管理

準備工作 需求由來&#xff1a; 當項目越來越大的時候提高項目運行編譯速度、壓縮代碼體積、項目維護、bug修復......等等成為不得不考慮而且不得不做的問題。 又或者后面其他同事接手你的模塊&#xff0c;或者改你的bug時避免人家看的眼痛以及心里千百句mamaipi...問候。 并且…

Python實現Adaboost

1.Adaboost概念 提升方法的思路是綜合多個分類器&#xff0c;得到更準確的分類結果。 即“三個臭皮匠頂個諸葛亮”。《統計學習方法》稱AdaBoost是提升算法的代表&#xff0c;所謂提升算法&#xff0c;指的是一種常用的統計學習方法&#xff0c;應用廣泛且有效。在分類問題中&a…

Java List<T>去重方法,引用類型集合去重

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、實體類中要重寫比較方法equals&#xff0c;最好也重寫hashcode方法 public class WorkWeightDto implements Serializable {privat…

MyBatis知識點

一、MyBatis簡介 1.1 框架概念 框架&#xff0c;就是軟件的半成品&#xff0c;完成了軟件開發過程中的通用操作&#xff0c;程序員只需很少或者不用進行加工就能夠實現特定的功能&#xff0c;從而簡化開發人員在軟件開發中的步驟&#xff0c;提高開發效率。 1.2 常用框架 MVC…

android studio : clang++.exe: error: invalid linker name in argument '-fuse-ld=bfd

公司jenkins上的C編譯器最近換成了clang&#xff0c;今天更新了代碼發現本地的C/C代碼用NDK編譯不過了&#xff0c;提示&#xff1a; “clang.exe: error: invalid linker name in argument -fuse-ldbfd” 解決辦法&#xff1a; 將Android.mk文件中的“LOCAL_LDFLAGS -fuse-ld…