1、多線程是什麼css
進程 :是一個正在執行中的程序,每個進程執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元;html
線程:就是進程中的一個獨立控制單元,線程在控制着進程的執行。一個進程中至少有一個進程。前端
多線程:一個進程中不僅有一個線程。java
2、爲何要用多線程mysql
①、爲了更好的利用cpu的資源;jquery
②、進程之間不能共享數據,線程能夠;linux
③、系統建立進程須要爲該進程從新分配系統資源,建立線程代價比較小;web
④、Java語言內置了多線程功能支持,簡化了java多線程編程。ajax
3、線程的生命週期:redis
4、建立線程的方法
一、繼承Thread類:
步驟:①、定義類繼承Thread;
二、實現Runnable接口: 接口應該由那些打算經過某一線程執行其實例的類來實現。類必須定義一個稱爲run 的無參方法。
實現步驟: ①、定義類實現Runnable接口
②、覆蓋Runnable接口中的run方法
將線程要運行的代碼放在該run方法中。
③、經過Thread類創建線程對象。
④、將Runnable接口的子類對象做爲實際參數傳遞給Thread類的構造函數。
自定義的run方法所屬的對象是Runnable接口的子類對象。因此要讓線程執行指定對象的run方法就要先明確run方法所屬對象
⑤、調用Thread類的start方法開啓線程並調用Runnable接口子類的run方法。
三、經過Callable和Future建立線程:
實現步驟:①、建立Callable接口的實現類,並實現call()方法,改方法將做爲線程執行體,且具備返回值。
②、建立Callable實現類的實例,使用FutrueTask類進行包裝Callable對象,FutureTask對象封裝了Callable對象的call()方法的返回值
③、使用FutureTask對象做爲Thread對象啓動新線程。
④、調用FutureTask對象的get()方法獲取子線程執行結束後的返回值。
5、線程狀態管理
一、線程睡眠---sleep:
二、線程讓步---yield:
三、線程合併---join:
四、中止線程:
特殊狀況:當線程處於了凍結狀態,就不會讀取到標記,也就不會結束。當沒有指定方法讓凍結的線程回覆到運行狀態時,咱們須要對凍結狀態進行清除,也就是強制讓線程恢復到運行狀態中來,這樣可就能夠操做標記讓線程結束。
Thread類提供該方法: interrupt();
六 爲何要進行線程同步?
java容許多線程併發控制,當多個線程同時操做一個可共享資源變量時(如對其進行增刪改查操做),會致使數據不許確,並且相互之間產生衝突。因此加入同步鎖以免該線程在沒有完成操做前被其餘線程調用,從而保證該變量的惟一性和準確性。
同步方法1:
同步函數:就是用synchronize關鍵字修飾的方法。由於每一個java對象都有一個內置鎖,當用synchronize關鍵字修飾方法時內置鎖會保護整個方法,而在調用該方法以前,要先得到內置鎖,不然就會處於阻塞狀態。
同步方法2:
同步代碼塊:就是擁有synchronize關鍵字修飾的語句塊,被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步。
7、死鎖
進程A中包含資源A,進程B中包含資源B,A的下一步須要資源B,B的下一步須要資源A,因此它們就互相等待對方佔有的資源釋放,因此也就產生了一個循環等待死鎖。
避免死鎖最簡單的方法就是阻止循環等待條件,將系統中全部的資源設置標誌位、排序,規定全部的進程申請資源必須以必定的順序(升序或降序)作操做來避免死鎖。
corePoolSize:核心池的大小
maximumPoolSize:線程池最大線程數
keepAliveTime:表示線程沒有任務執行時最多保持多久時間會終止
workQueue:一個阻塞隊列
threadFactory:用於設置建立線程的工廠
3、幾種重要的接口和類簡介
一、List(有序、可重複)
List裏存放的對象是有序的,同時也是能夠重複的,List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。由於往list集合裏插入或刪除數據時,會伴隨着後面數據的移動,全部插入刪除數據速度慢。
二、Set(無序、不能重複)
Set裏存放的對象是無序,不能重複的,集合中的對象不按特定的方式排序,只是簡單地把對象加入集合中。
三、Map(鍵值對、鍵惟1、值不惟一)
Map集合中存儲的是鍵值對,鍵不能重複,值能夠重複。根據鍵獲得值,對map集合遍歷時先獲得鍵的set集合,對set集合進行遍歷,獲得相應的值。
17.在Java中,HashMap是如何工做的?
HashMap在Map.Entry靜態內部類實現中存儲key-value對。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。當咱們經過傳遞key-value對調用put方法的時候,HashMap使用Key hashCode()和哈希算法來找出存儲key-value對的索引。Entry存儲在LinkedList中,因此若是存在entry,它使用equals()方法來檢查傳遞的key是否已經存在,若是存在,它會覆蓋value,若是不存在,它會建立一個新的entry而後保存。當咱們經過傳遞key調用get方法時,它再次使用hashCode()來找到數組中的索引,而後使用equals()方法找出正確的Entry,而後返回它的值。下面的圖片解釋了詳細內容。
其它關於HashMap比較重要的問題是容量、負荷係數和閥值調整。HashMap默認的初始容量是32,負荷係數是0.75。閥值是爲負荷係數乘以容量,不管什麼時候咱們嘗試添加一個entry,若是map的大小比閥值大的時候,HashMap會對map的內容進行從新哈希,且使用更大的容量。容量老是2的冪,因此若是你知道你須要存儲大量的key-value對,好比緩存從數據庫裏面拉取的數據,使用正確的容量和負荷係數對HashMap進行初始化是個不錯的作法。
21.HashMap和HashTable有何不一樣?
(1)HashMap容許key和value爲null,而HashTable不容許。
(2)HashTable是同步的,而HashMap不是。因此HashMap適合單線程環境,HashTable適合多線程環境。
(3)在Java1.4中引入了LinkedHashMap,HashMap的一個子類,假如你想要遍歷順序,你很容易從HashMap轉向LinkedHashMap,可是HashTable不是這樣的,它的順序是不可預知的。
(4)HashMap提供對key的Set進行遍歷,所以它是fail-fast的,但HashTable提供對key的Enumeration進行遍歷,它不支持fail-fast。
(5)HashTable被認爲是個遺留的類,若是你尋求在迭代的時候修改Map,你應該使用CocurrentHashMap。
25.ArrayList和LinkedList有何區別?
ArrayList和LinkedList二者都實現了List接口,可是它們之間有些不一樣。
(1)ArrayList是由Array所支持的基於一個索引的數據結構,因此它提供對元素的隨機訪問,複雜度爲O(1),但LinkedList存儲一系列的節點數據,每一個節點都與前一個和下一個節點相鏈接。因此,儘管有使用索引獲取元素的方法,內部實現是從起始點開始遍歷,遍歷到索引的節點而後返回元素,時間複雜度爲O(n),比ArrayList要慢。
(2)與ArrayList相比,在LinkedList中插入、添加和刪除一個元素會更快,由於在一個元素被插入到中間的時候,不會涉及改變數組的大小,或更新索引。
(3)LinkedList比ArrayList消耗更多的內存,由於LinkedList中的每一個節點存儲了先後節點的引用。
三、SpringMVC運行原理
流程說明:
(1)客戶端(瀏覽器)發送請求,直接請求到DispatcherServlet。
(2)DispatcherServlet根據請求信息調用HandlerMapping,解析請求對應的Handler。
(3)解析到對應的Handler後,開始由HandlerAdapter適配器處理。
(4)HandlerAdapter會根據Handler來調用真正的處理器開處理請求,並處理相應的業務邏輯。
(5)處理器處理完業務後,會返回一個ModelAndView對象,Model是返回的數據對象,View是個邏輯上的View。
(6)ViewResolver會根據邏輯View查找實際的View。
(7)DispaterServlet把返回的Model傳給View。
(8)經過View返回給請求者(瀏覽器)
容器啓動的時候,web,xml中spring的監聽器監聽到容器啓動,加載spring的配置文件,建立bean,加載到容器中。
在一個基於springmvc的web應用中,須要有一個web容器,通常咱們用tomacat,這個web容器提供了一個全局的上下文環境ServletContext,同時也是Spring IoC容器的宿主環境。
宿主容器啓動時,其入口文件即是web.xml。web.xml須要定義兩個最基本的內容,ContextLoaderListener和DispatcherServlet。
一、ContextLoaderListener是實現了ServletContextListener接口的監聽器,在項目啓動的時候會觸發容器初始化方法contextInitialized,容器初始化方法主要作3個事情
(1)執行initWebApplicationContext方法,啓動一個根上下文WebApplicationContext(一個接口類),其實現類爲XmlWebApplicationContext(即傳說的IOC容器)。
(2)根據配置路徑加載spring文件建立Bean的實例,這些bean都放入XmlWebApplicationContxt容器中。
(3)將加載好Bean實例的WebApplicationContext按指定的key註冊到ServletContext(Java Web全局變量宿主容器)容器中去。
二、contextLoaderListener監聽器監聽容器初始化完成以後,開始初始化web.xml中配置的Servlet(能夠配置多個),springmvc中以DispatcherServlet爲例。DispatcherServlet,前端控制器,也能夠叫請求分發控制器,用來接收、匹配、處理、轉發每一個servlet請求。DispatcherServlet會以WebApplicationServlet做爲本身的parent上下文,而後再初始化本身的上下文。DispatcherServlet初始化上下文主要包括處理器映射器,處理器適配器,視圖解析器等。最後再將初始化完成的Servlet註冊到ServletContext中,這樣每一個Servlet均可以持有本身的上下文,同時又能共享根上下文,即IOC容器上下文WebApplicationContext。
設計模式
https://www.cnblogs.com/feifeicui/p/10431161.html
單例,簡單工廠,代理模式,策略模式,適配器模式
String、List、Set、Sorted Set、hashes
網點信息
key 網點code、 value 網點entity、
|
角色說明 |
Provider |
暴露服務的服務提供方 |
Consumer |
調用遠程服務的服務消費方 |
Registry |
服務註冊與發現的註冊中心 |
Monitor |
統計服務的調用次調和調用時間的監控中心 |
Container |
服務運行容器 |
調用關係說明
服務容器負責啓動,加載,運行服務提供者。
服務提供者在啓動時,向註冊中心註冊本身提供的服務。
服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送
變動數據給消費者。
服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如
果調用失敗,再選另外一臺調用。
服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數
據到監控中心。
1 自我介紹
2介紹本身開發遇到的困難,日常工做中遇到的問題,最棘手的問題怎麼處理
3.值傳遞和引用傳遞的概念和區別;
值傳遞不會影響參數的值,引用傳遞會改變實際參數的值。
方法調用時,實際參數把它的值傳遞給對應的形式參數,函數接收的是原始值的一個copy,此時內存中存在兩個相等的基本類型,即實際參數和形式參數,後面方法中的操做
都是對形參這個值的修改,不影響實際參數的值。
方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,函數接收的是原始值的內存地址;
在方法執行中,形參和實參內容相同,指向同一塊內存地址,方法執行中對引用的操做將會影響到實際對象。
4.web service的思路;
服務提供者提供服務,並經過Web服務中介者發佈,在註冊中心註冊
服務請求者向服務中介請求特定的服務,中介者根據請求查詢註冊中心尋找知足請求的服務
服務中介者返回知足條件的web服務信息給服務請求者,這個描述信息用wsdl寫成
返回的描述信息生產相應的soap消息發送給請求者,實現服務的調用
服務提供者按soap消息執行相應的web服務,並將結果返回給請求者
5.如何用代碼實現http請求;
域名解析 --> 發起TCP的3次握手 --> 創建TCP鏈接後發起http請求 --> 服務器響應http請求,瀏覽器獲得html代碼
--> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶
6.xml,html的不一樣點;
1 html用來顯示數據,xml用來描述數據
2 xml比html 語法要求更嚴格
3 html與數據庫沒有直接聯繫 xml與數據庫都可對應和轉換
7.jquery ajax請求如何實現;
$.ajax() , $.get() , $.post()
8.如何解析xml;
DOM,SAX,JDOM,DOM4J
9. http 403,502,500的含義;
302:臨時重定向
403:服務器拒絕請求
500:服務器內部錯誤
200:請求成功
404:頁面沒法找到
502:服務器網關錯誤
10 js的加載優化
將<script>標籤放在頁面底部,也就是</body>以後,確保頁面都加載完成後再加載JS
合併腳本代碼,頁面中 <script>標籤,越少越好
11多態的理解 實如今哪些地方
多態就是說容許不一樣子類型的對象對同一消息作出不一樣的反應
方法重載,方法重寫
舉一個簡單的例子:好比說有個物流管理系統中,有兩種用戶:訂購客戶和賣方客戶,兩個客戶均可以登陸系統,他們有相同的方法login,
但登錄以後他們會進入不一樣的頁面,也就是在登陸的時候會有不一樣的操做,兩種客戶都繼承父類的login方法,但對於不一樣的對象,擁有不一樣的操做。
12方法重載和方法重寫(覆蓋)的區別?
相同點:都屬於多態機制
不一樣點:重載發生在同一個類中,方法名相同,參數列表不一樣。
重寫發生在繼承類中,方法名和參數列表相同,權限修飾符大於等於父類、返回值類型,拋出異常小於等於父類。
13 spring的原理及做用
spring有2個核心技術,ioc控制反轉或者說叫DI依賴注入和aop面向切面編程。我先說一下IOC,當某個java實例(調用者)須要調用另外一個java實例(被調用者)時,傳統狀況下,
經過new來建立被調用者的實例,
而在依賴注入的模式下建立被調用者的工做再也不由調用者來完成,所以稱之爲"控制反轉";建立被調用者實例的工做一般由Spring來完成,而後注入調用者,因此也稱之爲"依賴注入"。
設置注入:IoC容器使用屬性的setter方式注入被依賴的實例,
構造注入:IoC容器使用構造器來注入被依賴的實例
我再說一下aop,簡單地說,就是將那些與業務無關,卻爲業務模塊所共同調用的邏輯封裝起來,減小系統的重複代碼,下降模塊間的耦合度,讓代碼更易於維護。
程序中的一個管理者,整個程序的運行都依靠spring來管理
經過spring管理持久層的mapper(至關於dao接口)
經過spring管理業務層service,service中能夠調用mapper接口,並對事務進行控制。
經過spring管理表現層Handler,Handler中能夠調用service接口。
14 spring的事務 事務的隔離級別
我先說一下什麼是事務,事務就是一組操做,組成這組操做的各個操做,要麼一 起成功,要麼一塊兒失敗.事務有四個特性:
原子性 (atomicity):強調事務的不可分割.
一致性 (consistency):事務的執行的先後數據的完整性保持一致.
隔離性 (isolation):一個事務執行的過程當中,不該該受到其餘事務的干擾
持久性(durability) :事務一旦結束,數據就持久到數據庫
若是不考慮事務隔離性引起安全性問題:
髒讀 :一個事務讀到了另外一個事務的未提交的數據
不可重複讀 :一個事務讀到了另外一個事務已經提交的 update 的數據致使屢次查詢結果不一致.
虛幻讀 :一個事務讀到了另外一個事務已經提交的 insert 的數據致使屢次查詢結果不一致.
15 Spring支持五種事務隔離級別:
DEFAULT:使用數據庫自己使用的隔離級別 ORACLE(讀已提交) MySQL(可重複讀)
READ_UNCOMITTED:讀未提交(髒讀)最低的隔離級別,一切皆有可能。
READ_COMMITED:讀已提交,ORACLE默認隔離級別,有幻讀以及不可重複讀風險。
REPEATABLE_READ:可重複讀,解決不可重複讀的隔離級別,但仍是有幻讀風險。
SERIALIZABLE:串行化,最高隔離級別,杜絕一切隱患,缺點是效率低。
16 springmvc
一、 用戶發送請求至前端控制器DispatcherServlet。
二、 DispatcherServlet收到請求調用HandlerMapping處理器映射器。
三、 處理器映射器找到具體的處理器(能夠根據xml配置、註解進行查找),生成處理器對象返回給DispatcherServlet。
四、 DispatcherServlet調用HandlerAdapter處理器適配器。
五、 HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器)。
六、 Controller執行完成返回ModelAndView。
七、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
八、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
九、 ViewReslover解析後返回具體View。
十、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
十一、 DispatcherServlet響應用戶。
17 springmvc與Struts2的區別
spring mvc的入口是servlet,而struts2是filter
Struts2框架是類級別的攔截,SpringMVC是方法級別的攔截
SpringMVC開發效率和性能高於Struts2
Struts2用的攔截機制是Interceptor,SpringMVC這是用的是獨立的Aop方式
struts配置文件比較多,springmvc能夠認爲是零配置
18 restful風格
(1)每個URI表明一種資源,獨一無二
(2)客戶端和服務器之間,傳遞這種資源的某種表現層
(3)客戶端經過四個GET、POST、PUT和DELETE方法對服務器端資源進行操做,實現"表現層狀態轉化"。
19 dubbo四大組件
Provider:提供者
Consumer:消費者
registry:註冊中心(至關於中介)
monitor:監控中心
提供者在容器啓動時,向註冊中心註冊本身提供的服務,
消費者在啓動時,向註冊中心訂閱本身所需的服務
註冊中心返回提供者地址列表給消費者
消費者從提供者地址列表中,選一臺提供者進行調用
消費者和提供者在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心
用過什麼數據庫,怎麼優化,sql的聚合函數,sql優化,經常使用數據庫函數;數據鏈接池的種類,如何配置; 數據庫索引 怎麼讓索引失效,怎樣在數據庫添加成員
20 mysql和oracle
這個優化法則概括爲5個層次:
一、 減小數據訪問(減小磁盤訪問)
建立並使用正確的索引,只經過索引訪問數據
二、 返回更少數據(減小網絡傳輸或磁盤訪問)
數據分頁處理,只返回須要的字段
三、 減小交互次數(減小網絡傳輸)
批量提交數據,id in list
四、 減小服務器CPU開銷(減小CPU及內存開銷)
使用綁定變量,合理使用排序,減小比較操做
21sql優化
索引並非越多越好,索引提升相應的查詢效率,但同時也下降了 insert 及 update 的效率
1 避免全表掃描,首先應考慮在 where 及 order by 用到的列上創建索引
2 避免在 where 子句中使用!=或<>操做符,避免對字段進行 null 值判斷,避免使用 or 來鏈接條件,不然索引失效
3 避免在 where 子句中使用in 和 not in,like等進行模糊查詢
4 避免在 where 子句中使用 or 來鏈接條件,不然索引失效
5 用具體的字段列表代替「*」,不要返回用不到的任何字段
22 經常使用函數
AVG --求平均值
COUNT --統計數目
MAX --求最大值
MIN --求最小值
SUM --求和
23 數據鏈接池的種類
DBCP
C3PO
Proxool
BoneCP
24 在數據庫添加成員
--建立了一個名爲:test 密碼爲:1234 的用戶
create user 'test'@'localhost' identified by '1234';
--授予用戶test經過外網IP對數據庫「testdb」的所有權限
grant all privileges on 'testdb'.* to 'test'@'%' identified by '1234';
--刷新權限
flush privileges;
--授予用戶「test」經過外網IP對於該數據庫「testdb」中表的建立、修改、刪除權限,以及表數據的增刪查改權限
grant create,alter,drop,select,insert,update,delete on testdb.* to test@'%';
25 redis的數據類型, 優勢和缺點
string(字符串) list(列表) hash(散列) sets (集合) sorted set(有序集合)
26 redis優勢
a.單線程,利用redis隊列技術並將訪問變爲串行訪問,消除了傳統數據庫串行控制的開銷
b.redis具備快速和持久化的特徵,速度快,由於數據存在內存中。
c.分佈式 讀寫分離模式
d.支持豐富數據類型
e.支持事務,操做都是原子性,所謂原子性就是對數據的更改要麼所有執行,要不所有不執行。
f.可用於緩存,消息,按key設置過時時間,過時後自動刪除
mybatis工做原理
mybatis應用程序經過SqlSessionFactoryBuilder從配置文件中讀取配置信息,構建出SqlSessionFactory;
而後,SqlSessionFactory的實例直接開啓一個SqlSession,再經過SqlSession實例得到Mapper對象並運行Mapper映射的SQL語句,完成對數據庫的CRUD和事務提交,以後關閉SqlSession。
27 mybatis的一級緩存和二級緩存 二級緩存的替代方式 mybatis動態sql的實現 #和$區別
①、一級緩存是SqlSession級別的緩存。在操做數據庫時須要構造sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。不一樣的sqlSession之間的
緩存數據區域(HashMap)是互相不影響的。
②、二級緩存是mapper級別的緩存,多個SqlSession去操做同一個Mapper的sql語句,多個SqlSession能夠共用二級緩存,二級緩存是跨SqlSession的。
二級緩存的替代方式 redis替代
28 mybatis動態sql的實現
1. if 語句 (簡單的條件判斷)
2. choose (when,otherwize) ,至關於java 語言中的 switch ,與 jstl 中的choose 很相似.
3. trim (對包含的內容加上 prefix,或者 suffix 等,前綴,後綴)
4. where (主要是用來簡化sql語句中where條件判斷的,能智能的處理 and or ,沒必要擔憂多餘致使語法錯誤)
5. set (主要用於更新時)
6. foreach (在實現 mybatis in 語句查詢時特別有用)
29 #和$區別
1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。
2. $將傳入的數據直接顯示生成在sql中。
3.$方式通常用於傳入數據庫對象,例如傳入表名.
4 通常能用#,#方式可以防止sql注入
30 場景:10個訂單 for循環入庫 若是第三條到第三條異常,怎麼保證後面的都正常
try catch
31 i++是先賦值,而後再自增;++i是先自增,後賦值。
32 .集合類的相同/不一樣點;arraylist和linkedlist的區別和聯繫;
hashmap的原理 說一下 線程安全的map hashtab和hashmap的區別 ConcurrentHashMap的實現 他的鎖是怎麼實現的
33 HashTable與HashMap
相同點:
(1)都實現了Map<K,V>, Cloneable, Serializable 接口。
(2)都是存儲"鍵值對(key-value)"的散列表,並且都是採用拉鍊法實現的。
不一樣點:
(1)同步性:HashTable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 。
(2)對null值的處理:HashMap的key、value均可爲null,HashTable的key、value都不可爲null 。
(3)基類不一樣:HashMap繼承於AbstractMap,而Hashtable繼承於Dictionary。
(4)支持的遍歷種類不一樣:HashMap只支持Iterator(迭代器)遍歷。而Hashtable支持Iterator(迭代器)和Enumeration(枚舉器)兩種方式遍歷。
34 ConcurrentHashMap 是一個二級哈希表。在一個總的哈希表下面,有若干個子哈希表。
ConcurrentHashMap所使用的鎖分段技術,首先將數據分紅一段一段的存儲,而後給每一段數據配一把鎖,
當一個線程佔用鎖訪問其中一個段數據的時候,其餘段的數據也能被其餘線程訪問。
35 線程的運行狀態
線程五種狀態(新建、就緒、運行、阻塞、死亡)
36 怎麼保證線程安全
1 使用synchronized關鍵字:
2 使用鎖:
a.Lock使用起來比較靈活,但須要手動釋放和開啓;採用synchronized不須要用戶去手動釋放鎖,
b.Lock不是Java語言內置的,synchronized是Java語言的關鍵字,所以是內置特性
c.在併發量比較小的狀況下,使用synchronized是個不錯的選擇,可是在併發量比較高的狀況下,其性能降低很嚴重,此時Lock是個不錯的方案。
37 volatile的理解
是指線程之間的可見性,一個線程修改的狀態對另外一個線程是可見的。也就是一個線程修改的結果。另外一個線程立刻就能看到。
38 線程的通訊是怎麼實現的
1、傳統線程通訊synchronized + wait + notify
2、使用Condition控制線程通訊lock + condition + await + signal
3、使用阻塞隊列(BlockingQueue)控制線程通訊
39 線程池的應用 都有哪幾種線程池 線程池的參數
應用場景
1.單個任務處理的時間比較短
2.將需處理的任務的數量大
40
一、newCachedThreadPool 可緩存線程池
二、newFixedThreadPool 建立一個指定工做線程數量的線程池
三、newSingleThreadExecutor 建立一個單線程化的Executor,即只建立惟一的工做者線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。
四、newScheduleThreadPool 建立一個定長的線程池
41線程池參數
一、corePoolSize:核心線程數
二、queueCapacity:任務隊列容量(阻塞隊列)
三、maxPoolSize:最大線程數
四、 keepAliveTime:線程空閒時間
五、allowCoreThreadTimeout:容許核心線程超時
六、rejectedExecutionHandler:任務拒絕處理器
42線程池優缺點
1.減小在建立和銷燬線程上所花的時間以及系統資源的開銷
2.如不使用線程池,有可能形成系統建立大量線程而致使消耗完系統內存以及」過分切換」。
缺點是可能出現死鎖
43反射的應用場景 舉例
通俗的講就是反射能夠在運行時根據指定的類名得到類的信息。
平時的項目開發過程當中,基本上不多會直接使用到反射機制,可是實際上有不少設計、開發都與反射機制有關
舉例:①咱們在使用JDBC鏈接數據庫時使用Class.forName()經過反射加載數據庫的驅動程序;
②Spring框架也用到不少反射機制,最經典的就是xml的配置模式。Spring 經過 XML 配置模式裝載 Bean 的過程:
1) 將程序內全部 XML 或 Properties 配置文件加載入內存中;
2)Java類裏面解析xml或properties裏面的內容,獲得對應實體類的字節碼字符串以及相關的屬性信息;
3)使用反射機制,根據這個字符串得到某個類的Class實例;
4)動態配置實例的屬性。
43序列化
把對象轉換爲字節序列的過程稱爲對象的序列化。
把字節序列恢復爲對象的過程稱爲對象的反序列化。
序列化主要有兩種用途:
1) 把對象的字節序列永久地保存到硬盤上,一般存放在一個文件中;
2) 在網絡上傳送對象的字節序列。
44多線程的同步、緩存的保存與獲取等等
1 同步方法synchronized關鍵字修飾的方法
2 同步代碼塊
3 使用特殊域變量(volatile)實現線程同步
4 使用重入鎖實現線程同步
45怎麼堅定死鎖的問題,以及java內存溢出的處理方式
解決方式1:線程間通訊–經過構造方法共享數據
2.經過構造方法共享數據,並使用 (等待–喚醒) 機制實現線程間通訊
3.私有化鎖對象的成員變量,本身提供get和set方法供外界調用
46java內存溢出的處理方式
第一步,修改JVM啓動參數,直接增長內存。(-Xms,-Xmx參數必定不要忘記加。)
第二步,檢查錯誤日誌,查看「OutOfMemory」錯誤前是否有其它異常或錯誤。
第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。
第四步,使用內存查看工具動態查看內存使用狀況
47說幾個設計模式,
https://www.cnblogs.com/feifeicui/p/10431161.html
48 jvm的內存結構
方法區(也就是"持久代"),java8裏完全被移除,取而代之的是元數據區
堆
棧
PC寄存器
49 java垃圾回收機制?
在JVM中,有一個垃圾回收線程,它是低優先級的,在正常狀況下是不會執行的,只有在虛擬機空閒或者當前堆內存不足時,
纔會觸發執行,掃面那些沒有被任何引用的對象,並將它們添加到要回收的集合中,進行回收。
50 java中垃圾收集的方法有哪些?
標記-清除:
複製算法:
標記-整理
分代收集
簡述java類加載機制?
虛擬機把描述類的數據從Class文件加載到內存,並對數據進行校驗,解析和初始化,最終造成能夠被虛擬機直接使用的java類型。
12.linux,查詢java進程的命令;
ps -ef|grep java
52接口,抽象類
接口是用來實現類間多重繼承功能的結構.
接口不能實例化,即不能用new運算符建立對象。
一個類經過使用關鍵字implements聲明本身實現一個或多個接口。
在類體中可使用接口中定義的常量,並且必須實現接口中定義的全部方法
接口中的方法是自動公有的,接口中的方法都是抽象的。
抽象類必須使用abstract修飾符來定義,抽象方法也必須用abstract來修飾。
抽象類不能被實例化,不能用new關鍵字去產生對象。
抽象方法只能聲明,不能實現。
含有抽象方法的類必須被聲明爲抽象類,抽象類的子類必須覆蓋全部的抽象方法後才能被實例化,不然這個子類仍是個抽象類。
53Java的8種基本數據類型
byte,short,int,long,float,double,char,boolean
54 jvm類加載的過程
類從被加載到JVM中開始,到卸載爲止,整個生命週期包括:加載、驗證、準備、解析、初始化、使用和卸載七個階段。
其中類加載過程包括加載、驗證、準備、解析和初始化五個階段。
類加載階段就是由類加載器根據一個類名來讀取此類的二進制字節流到JVM內部,並存儲在運行時內存區的方法區,而後將其轉換爲一個與目標類型對應的java.lang.Class對象實例
驗證類數據信息是否符合JVM規範
爲類中的全部靜態變量分配內存空間,併爲其設置一個初始值
將常量池中的符號引用轉爲直接引用
如何優化一條sql
第一步:理解sql業務,邏輯上是否能夠優化
第二部:explain sql執行計劃,目測有沒有該走的索引沒有走
第三部:查看有無常見影響效率的錯誤,如null,列上使用函數,or不走組合索引,join以前減小join列數
第四部:增長合適的索引
第五步:還不行,嘗試限制需求(如只能夠統計指定範圍數據)或者其餘方式實現(如定時任務定時分析一批)
第六步:數據量超大,只能夠考慮分表分庫等手段了。
1 代碼review怎麼作的用到一款插件工具findbugs 1 代碼中的一些壞習慣 類名的命名,以大寫字母開頭, 方法名以小寫字母開頭, 字段名以小寫字母開頭 2 糟糕的代碼 對象建立了並無用 3 關於代碼性能相關方面的 字符串轉換成int 應該使用Integer.parseInt(「」) 代替Integer.valueOf(「」) 4 代碼正確性相關方面的 多線程使用本事就是不安全的,改進方法:須要建立多實例或線程同步