頭條三面技術四面HR,就是這么簡單

前言

看日期,今天都是4月了,這春招也差不多進入尾聲了。

近期任有不少朋友都在找工作,很多人開始抱怨,工作可真難找啊!身邊不少朋友問我咋搞呀,秋招都要結束了,工作還沒著落呢…額…這個…今年是有點難啊。說實話,面試只是對個人技術及應變能力的一次考驗。只有解決了一個問題,你才有機會遇見下一個問題。

這不,今天我總結了餓了么4面(Java崗)面經,問題如下,都是真真的經歷,準備面試找工作的朋友可自行檢測一下。

image

并發歷史

在計算機最早期的時候,沒有操作系統,執行程序只需要一個過程,那就是從頭到尾依次執行。任何資源都會為這個程序服務,這必然就會存在?浪費資源?的情況。

這里說的浪費資源指的是資源空閑,沒有充分使用的情況。

操作系統為我們的程序帶來了?并發性,操作系統使我們的程序同時運行多個程序,一個程序就是一個進程,也就相當于同時運行了多個進程。

操作系統是一個并發系統,并發性是操作系統非常重要的特征,操作系統具有同時處理和調度多個程序的能力,比如多個 I/O 設備同時在輸入輸出;設備 I/O 和 CPU 計算同時進行;內存中同時有多個系統和用戶程序被啟動交替、穿插地執行。操作系統在協調和分配進程的同時,操作系統也會為不同進程分配不同的資源。

操作系統實現多個程序同時運行解決了單個程序無法做到的問題,主要有下面三點

  • 資源利用率,我們上面說到,單個進程存在資源浪費的情況,舉個例子,當你在為某個文件夾賦予權限的時候,輸入程序無法接受外部的輸入字符,只能等到權限賦予完畢后才能接受外部輸入。綜合來講,就是在等待程序時無法執行其他工作。如果在等待程序的同時可以運行另一個程序,那么將會大大提高資源的利用率。(資源并不會覺得累)因為它不會劃水~
  • 公平性,不同的用戶和程序對于計算機上的資源有著同樣的使用權。一種高效的運行方式是為不同的程序劃分時間片使用資源,但是有一點需要注意,操作系統可以決定不同進程的優先級,雖然每個進程都有能夠公平享有資源的權利,但是每次前一個進程釋放資源后的同時有一個優先級更高的進程搶奪資源,就會造成優先級低的進程無法獲得資源,久而久之會導致進程饑餓。
  • 便利性,單個進程是無法通信的,通信這一點我認為其實是一種避雷針策略,通信的本質就是信息交換,及時進行信息交換能夠避免信息孤島,做重復性的工作;任何并發能做的事情,順序編程也能夠實現,只不過這種方式效率很低,它是一種?阻塞式?的。

但是,順序編程(也稱為串行編程)也不是一無是處的,串行編程的優勢在于其直觀性和簡單性,客觀來講,串行編程更適合我們人腦的思考方式,但是我們并不會滿足于順序編程,we want it more!!!?。資源利用率、公平性和便利性促使著進程出現的同時也促使著線程的出現。

如果你還不是很理解進程和線程的區別的話,那么我就以我多年操作系統的經驗(吹牛逼,實則半年)來為你解釋一下:進程是一個應用程序,而線程是應用程序中的一條順序流

線程會共享進程范圍內的資源,例如內存和文件句柄,但是每個線程也有自己私有的內容,比如程序計數器、棧以及局部變量。下面匯總了進程和線程共享資源的區別

線程被描述為一種輕量級的進程,輕量級體現在線程的創建和銷毀要比進程的開銷小很多。

注意:任何比較都是相對的。

在大多數現代操作系統中,都以線程為基本的調度單位,所以我們的視角著重放在對線程的探究。

線程

優勢和劣勢

合理使用線程是一門藝術,合理編寫一道準確無誤的多線程程序更是一門藝術,如果線程使用得當,能夠有效的降低程序的開發和維護成本。

在 GUI 中,線程可以提高用戶界面的響應靈敏度,在服務器應用程序中,并發可以提高資源利用率以及系統吞吐率。

Java 很好的在用戶空間實現了開發工具包,并在內核空間提供系統調用來支持多線程編程,Java 支持了豐富的類庫?java.util.concurrent?和跨平臺的內存模型,同時也提高了開發人員的門檻,并發一直以來是一個高階的主題,但是現在,并發也成為了主流開發人員的必備素質。

雖然線程帶來的好處很多,但是編寫正確的多線程(并發)程序是一件極困難的事情,并發程序的 Bug 往往會詭異地出現又詭異的消失,在當你認為沒有問題的時候它就出現了,難以定位?是并發程序的一個特征,所以在此基礎上你需要有扎實的并發基本功。那么,并發為什么會出現呢?

為什么是并發

計算機世界的快速發展離不開 CPU、內存和 I/O 設備的高速發展,但是這三者一直存在速度差異性問題,我們可以從存儲器的層次結構可以看出

CPU 內部是寄存器的構造,寄存器的訪問速度要高于高速緩存,高速緩存的訪問速度要高于內存,最慢的是磁盤訪問。

程序是在內存中執行的,程序里大部分語句都要訪問內存,有些還需要訪問 I/O 設備,根據漏桶理論來說,程序整體的性能取決于最慢的操作也就是磁盤訪問速度。

因為 CPU 速度太快了,所以為了發揮 CPU 的速度優勢,平衡這三者的速度差異,計算機體系機構、操作系統、編譯程序都做出了貢獻,主要體現為:

  • CPU 使用緩存來中和和內存的訪問速度差異
  • 操作系統提供進程和線程調度,讓 CPU 在執行指令的同時分時復用線程,讓內存和磁盤不斷交互,不同的?CPU 時間片?能夠執行不同的任務,從而均衡這三者的差異
  • 編譯程序提供優化指令的執行順序,讓緩存能夠合理的使用

我們在享受這些便利的同時,多線程也為我們帶來了挑戰,下面我們就來探討一下并發問題為什么會出現以及多線程的源頭是什么

最后分享一波,Java核心架構進階知識點

面試成功其實都是必然發生的事情,因為在此之前我做足了充分的準備工作,不單單是純粹的刷題,更多的還會去刷一些Java核心架構進階知識點,比如:JVM、高并發、多線程、緩存、Spring相關、分布式、微服務、RPC、網絡、設計模式、MQ、Redis、MySQL、設計模式、負載均衡、算法、數據結構、kafka、ZK、集群等。而這些也全被整理濃縮到了一份pdf——《Java核心架構進階知識點整理》,全部都是精華中的精華,本著共贏的心態,好東西自然也是要分享的

image

image

image

內容頗多,篇幅卻有限,這就不在過多的介紹了,大家可根據以上截圖自行腦補,不過這份《Java核心架構進階知識點整理pdf》以及前面P8整理的全套系列大廠面試題皆可免費分享給有需要的你,點擊這里即可免費領取文中所有資料

整理的全套系列大廠面試題皆可免費分享給有需要的你,點擊這里即可免費領取文中所有資料

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

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

相關文章

臨時表

tmp_table_size 這個配置限制了內存臨時表的大小,默認值是 16M。 如果臨時表大小超過了 tmp_table_size,那么內存臨時表就會轉成磁盤臨時表 磁盤臨時表使用的引擎默認是 InnoDB,是由參數 internal_tmp_disk_storage_engine 控制的。 轉載于:h…

如何保證Redis與數據庫的雙寫一致性?進階加薪全靠它!

我有話要說,請仔細看完 我發現一個現象,很多開發5年的程序員仍然停留在crud的階段,這是什么原因? 最主要的原因就是基礎很差,尤其對于JVM和并發編程這方面掌握的比較差,而JVM和并發編程就是非常非常重要的…

Swimming Balls

Swimming Balls https://vjudge.net/contest/318752#problem/J如果直接算,各種球的情況都不清楚,因為放一個球之后,水位的變化也會影響之前放入的球,不如,二分最終的水位高度,這樣每個球的貢獻就有了 #incl…

如何保證redis高可用?薪資翻倍

前言: 首先介紹一下我的同學,專科畢業應用電子技術專業,已經畢業快兩年了。因為專業的原因工作一年覺得沒什么發展前途就想轉行,身為他的“好基友”,他覺得我這個工作挺好的,就咨詢了我一下,經…

Linux中強大的輸入輸出重定向和管道

Linux中有三個最重要的輸入輸出流: Standard Input(STDIN) - 通常指鍵盤的輸入 Standard Output(STDOUT) - 通常指顯示器的輸出 Standard Error(STDERR) - 通常也是重定向到顯示器 默認情況下,分別是0表示標準輸入(stdin),1表示標準輸出(stdout),2表示標準錯誤。 參…

如何保證消息隊列的高可用?透徹分析源碼

前言 成為優秀的架構師是大部分初中級工程師的階段性目標。優秀的架構師往往具備七種核心能力:編程能力、調試能力、編譯部署能力、性能優化能力、業務架構能力、在線運維能力、項目管理能力和規劃能力。 這幾種能力之間的關系大概如下圖。編程能力、調試能力和編…

rails 放在 apache一個目錄下面的配置方法

<Location /redmine> ProxyPass http://localhost:3000 ProxyPassReverse http://localhost:3000/</Location>然后&#xff0c;配置additional_environment.rb文件中config.action_controller.relative_url_root /redmine這樣基本就可以了&#xff0c;但是&…

如何化身BAT面試收割機?不吃透都對不起自己

前言 多線程相對于其他 Java 知識點來講&#xff0c;有一定的學習門檻&#xff0c;并且了解起來比較費勁。在平時工作中如若使用不當會出現數據錯亂、執行效率低&#xff08;還不如單線程去運行&#xff09;或者死鎖程序掛掉等等問題&#xff0c;所以掌握了解多線程至關重要。…

Tensorflow2.0開啟,從此忘記1.*版本

1.可使用GPU&#xff0c;提升上百倍的效率 2.可自動求導 3.內置神經網絡API 使用cast&#xff0c;可以轉換成相應的類型 轉載于:https://www.cnblogs.com/ningxinjie/p/11412653.html

如何在面試中通過工廠模式來給自己加分?逆襲面經分享

拼多多三面慘敗&#xff0c;java中間件、數據庫與spring框架&#xff0c;答不上… 面試開火箭&#xff0c;工作擰螺絲…月初有個朋友面試拼多多&#xff0c;一面自信滿滿過了&#xff0c;結果三面卻慘敗…昨天朋友約我出來討論問題在哪里&#xff0c;三面就答不上了&#xff0…

CNN/RNN TF1.4

###CNN###import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data這些是tf1.*版本&#xff0c;現在我已經升級到2.0版本&#xff0c;上方數據集都用不了了...黑白圖片&#xff0c;因此這里使用的是2Dmnistinput_data.read_data_sets("MNIST…

Java-類與對象

Java&#xff0c;從一開始學習這門技術&#xff0c;我們就被注入了一個概念——“Java是一門面向對象編程語言。”是的&#xff0c;Java之所以簡單而具有優勢&#xff0c;就是因為面向對象所帶來的方便。這種方式免去了C 中反復而難以理解的指針和多繼承&#xff0c;“可以讓程…

Hibernate學習筆記(一)

####1.1Hibernate框架的學習路線?第一天&#xff1a;Hibernate的入門&#xff08;Hibernate的環境搭建、Hibernate的API、Hibernate的CRUD&#xff09;?第二天&#xff1a;Hibernate的一級緩存、其他的API?第三天&#xff1a;Hibernate的一對多配置、Hibernate的多對多的配置…

Java-進階:Java-File--IO—1

#目錄 一、File 類 二、IO流 三、字節輸出流 四、字節輸入流 五、字節流文件復制 六、字符輸出流 七、字符輸入流 八、字符流復制文本文件 ##一、File 類 ###1. 概述 文件 和 目錄路徑名 的抽象表達形式 Java中把文件或者目錄&#xff08;文件夾&#xff09;都封裝成 File對象…

北理工爬蟲課程學習記錄

Requests post方法如果提交字典會被存到form下&#xff0c;如果直接提交字符串&#xff0c;會被存到data下 put方法和post類似&#xff0c;只不過他會覆蓋原始數據 ###各個方法的使用### 13個 訪問參數 url修改的字段 //模擬瀏覽器進行訪問 //模擬不同的IP地址對這個網站進行訪…

Java-進階:Java-File--IO—2

目錄 一、轉換流 二、字節緩沖流 三、字符緩沖流 四、序列化流與反序列化流 五、打印流 六、標準輸入、輸出流 七、IO流總結 一、轉換流 1. OutputStreamWriter 類 &#xff08;1&#xff09; 概述 java.io.OutputStreamWriter繼承 Writer類&#xff1b;就是一個字符輸出流…

Hibernate學習筆記(二)

Hibernate概述&#xff1a; 什么是Hibernate:是一個持久層的ORM的框架 什么是ORM: ORM:對象關系映射,指的是將一個java中的對象與關系型數據庫中的表建立一種映射關系&#xff0c;從而操作對象就可以完成數據庫的相關操作為什么學習Hibernate 簡化JDBC的開發 性能很好Hibernate…

Java-進階:多線程1

目錄 一、概述 二、Thread 類 三、創建線程&#xff1a;繼承 Thread 類 四、創建線程&#xff1a;實現 Runnable 接口 五、線程優先級 六、線程的生命周期 七、同步代碼塊 一、概述 1. 進程和線程 進程&#xff1a;進程指正在運行的程序。線程&#xff1a;線程是進程中的一個…

Struts2學習筆記(一)--入門常見配置

Struts2框架的學習路線 l 第一天&#xff1a;Struts2的概述、Struts2的入門、Struts2常見的配置、Struts2的Action的編寫 l 第二天&#xff1a;Struts2的數據的封裝、結果頁面配置 l 第三天&#xff1a;Struts2的值棧和OGNL表達式 l 第四天&#xff1a;Struts2的標簽庫 Struts2…

Java-進階:多線程2

目錄 一、Lock 接口 二、線程間的通信 三、線程池 四、定時器 Timer 五、多線程和異常 一、Lock 接口 1. 線程鎖 鎖是控制多個線程對共享資源進行訪問的工具。通常&#xff0c;鎖提供了對共享資源的獨占訪問。一次只能有一個線程獲得鎖&#xff0c;對共享資源的所有訪問…