




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
力口油YES,ICAN
==和equals的區別
基本類型比較的是數值
*引用類型比較的堆內存中的地址
關equk
"字符串比較的是值,因為重寫了StHng的
StringStrngBufferStringBuild
SWing長度不可變,追加或修改數據會產生新的對象(消耗系統資源)
為Stri八gBuffer支持追加,多線程安全,效率必StH八gBUildsg八ch/Ohized
包裹
*StringBuild支持追加,線程不安全,效率高
局部內部類或者匿名內部類,使用局部變量為啥要用final
修飾
1.從編譯分析:會被編譯成倆個.dass文件,主函數結束不意味著他們結束,主
函數的局部變量會被JVMgc回收,產生調用不存在的變量
興2.從數據一致性方面考慮:內部類修改變量,外面函數無法感知數據變化,會
產生數據不一致問題
final關鍵字的功能概述
1.如果引用為基本數據類型,則該引用為常量,該值無法修改;
2.如果引用為引用數據類型,比如對象、數組,則該對象、數組本身可以
修改,但指向該對象或數組的地址的引用不能修改。
3.如果引用時類的成員變量,則必須當場賦值,否則編譯會報錯。
重載和重寫區別:
重載和重寫的區別
重勒發生在同一^中,方法名必須相同,參數類型不同、個數不同、順序不同,方法返回值和訪問修飾符可
以不同,發生在編譯時.
重寫:發生在父子類中,方法名、參數列表必須相同,返回值范圍小于等于父類,拋出的異常范圍小于等于父
類,訪問修畸范圖大于等于父類;如果父類方法訪問修飾符為private則子類就不能直寫該方法.
抽象類和接口
?抽象類可以存在普通成員函數,而接口中只能存在publicabstract方法。
?抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是publicstaticfinal類型的。
?抽象類只能繼承一個,接口可以實現多個。
使用場景:當你關注一個事物的本質的時候,用抽象類;當鯉綽■-個當作鯉嬰,用接口。
集成抽象類必須重寫里面的方法
List和Set的區別
List:有序、允許重復、可以有多個null值,支持iterator循環遍歷,或者
getlnderO獲取元素
Set:無需、不允許重復、最多有一個null值,只支持iterator遍歷數據
ArrayList和LinkList的區別
ArrayList和LinkedList區別J―-一
ArrayUst:基于動態數組,連續內存存儲,適合下標訪問(隨機訪問),擴容機制:因為數組長度固定,超出長
度存數據時需要新建數組,然后將老數組的數據拷貝到新數組,如果不是尾部插入數據還鐘及到元素的移動(往
后短制一份,插入新元素),使用尾插法由雪初始容■可以斗大提升性能,空超過link詼大(需要創建大?
的node對象)—'■—
戶、入
LinkedList:基于鏈表,可以存儲在分散的內存中,鑫做數據插入及捌碌作,曲曾直詢《箍逐一遍歷.
遍歷LinkedLis學須使用iterator不能使用for健環,因為每次for?環體內通過gel漓得某一元素時都需要對lis1重?+(
僦行靦,蹣肖耗極大.y**
另外不要試圖使用index。售返回元素索引,并利用其進行遍歷,使用indexl。網lis謎行了遍歷]當結果為空時會
遍歷整不列表."
HashMap和HashTable的區別以及底層實現
HashMap和HashTable有什么區別?其底層實現
是什么?
區別:
(1)HashMap方添殳有synchronized桶,百非安全,HashTable蟠安全;
(2)HashMap允許keyftjvalue為null,而HashTable不允許
2.底層實現:數組+糙表實現
jdk8開始搭表高度到8、數組長度超過64,鏈表轉變為紅黑愧,元素以內部類Node節點存在
?計算ke和hashflfl,二次hash然后對數組長度取橫,對應到數組下標,
?如果沒有產生hash沖弟下標位置沒有元素),則直接創建Node存入數組,
?如果產生hash沖突,先進行equal比較,相同則取代該元素,不同,則判斷鏈表高度播入愜表,鏈表高度達到
8,并且數組長度到64則轉變為紅黑忸,工度低于6則將紅黑樹轉回鏈表
?key為null,存在下際0的位■
數組獷容
數組+鏈表HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要
為了解決哈希沖突而存在的,如果定位到的數組位置不含鏈表(當前entry的
next指向null),那么查找,添加等操作很快,僅需一次尋址即可;如果定位到
的數組包含鏈表,對于添加操作,其時間復雜度為0(n),首先遍歷鏈表,存在
即覆蓋,否則新增;對于查找操作來講,仍需遍歷鏈表,然后通過key對象的
equals方法逐一比對查找。所以,性能考慮,HashMap中的鏈表出現越少,性能
才會越好。
如何實現一個IOC容器
1.配置文件配置包掃描路徑
2.遞歸包掃描獲取.class文件
3.反射、確定交給I0C容器托管的類
4.對需要注入的類進行依賴注入
如何實現一個IOC容器
1、配置文件配置包掃描路徑
2、遞歸包掃描獲取.class文件
3、反射、確定需要交給IOC管理的類
4、對需要注入的類進行依賴注入
?配置文件中指定需要掃描的包路徑
?定義一些注解,分別表示訪問控制震、業務服務層、數據持久層、依賴注入注解、獲取配置文件注解
?從配置文件中獲取需要掃描的包路徑,獲取到當前路徑下的文件信息及文件夾信息,我們將當前路徑下所有
以.class結尾的文件添加到一個Set5S合中進行存儲
?遍歷這個set集合,獲取在類上有指定注解的類,并將其交給IOC容器,定義一個安全的Map用來存儲這些對
象
?遍歷這個IOC容熙,獲取到每一個莞的實例,判斷里面是有有依賴其他的類的實例,然后進行遞歸注入
字節碼是什么?帶來的好處
我們編寫的Java源碼,編譯后會生成一種.class文件,稱為字節碼文件。Java
虛擬機就是負責將字節碼文件翻譯成特定平臺下的機器碼然后運行。也就是說,
只要在不同平臺上安裝對應的JVM,就可以運行字節碼文件,運行我們編寫的
Java程序。
編譯的結果不是生成機器碼,而是生成字節碼,字節碼不能直接運行,必須通過
JVM翻譯成機器碼才能運行。不同平臺下編譯生成的字節碼是一樣的,但是由JVM
翻譯成的機器碼卻不一樣
注意:跨平臺的是Java程序,不是JVM。JVM是用C/C++開發的,是編譯后的機
器碼,不能跨平臺,不同平臺下需要安裝不同版本的JVM.
JAVA類加載器有哪些?作用?
BootstrapclassLoader:主要負責加載核心的類庫(java.lang.*等),構造
ExtClassLoader和APPClassLoadero
ExtClassLoader:主要負責加載jre/lib/ext目錄下的一些擴展的jar。
AppClassLoader:主要負責加載應用程序的主函數類
雙親委派機制流程?
BootstrapCIassLoader
巳
tms
tt
及
M不
s加
AppClassLoader
ClassNotFoundException
整體流程:
1.先判斷該類是否被加載過,如果沒有加載找到父類重復判斷是否加載,直到Bootstrap
加載器進行判斷,如果都沒有判斷被加載,然后往下遞歸自己是否可以加載
2.開始已經被加載了,就不用加載了
Redis事務異常類型和觸發條件
1.編譯性異常:編譯異常就是值語法都編譯不通過,肯定是語法錯誤啦,事務
回滾。
2.運行異常:類似不同類型的數據進行賦值,事務不回滾。
Java異常體系
Java中的異常體系“八/T
Java中的所有異常都來自頂級父酒@倉>
Throwable下有兩個子避當Mgg和肛)h
Error是程序無i珊理船歌,一旦出血&錯誤,則程序將被迫傳it運行.―-
說eptiop不會導致好序慢生.又分為兩個部分RunTime弊eption運行時異丘在“叩ricn正女.
RunTimeExc吧cn常甯發生在延序運行過程中,會異臂序當前整執行失;ifcFckedExcepti/贏發生在
程序贏過孱,莖導致程序編譯不通過.
頂級父類Throwable
倆個子類Exception和Error
Error是程序無法處理的錯誤,例如00M內存溢出,沒有運行內存,需要jvm調
優
Exception不會導致程序停止,會導致當前線程執行失敗
GC是如何判斷對象可以被回收的?
1.引用計數法,被其他對象引用計數器+1,引用釋放的時候缺點:對象相互引用,計
數器用不為o,無法回收。
2.可達性分析法。
GC如何判斷對象可以被回收
?引用計數法:每個對象有一個引用計數屬』,新增一個引用時計數加1,引用釋放時計數減1,計數為o時可以
回收,
1?可達性分析法:從GCRoois開始向下搜索,搜索所壬過的路行稱為引用鏈.當一個R急到GCRoots沿有仟
|何引用鏈相連時,則證明此對象是不可用的,那么虛擬嬴判斷是可回收對象。
1=1永玩無法於同收._______________________________________________________________________________
GCROOtS的對冢有:
?虛擬機棧(棧幀中的本地變■表)中引用的對象
?方法區中類睜態屬性引用的對象
?方法區中常量引用的對象
?本堆方法棧中JNI(即一般說的Na【ive方法)引用的對象
線程的生命周期和狀態
2.阻塞的情況又分為三種:
⑴、等待阻塞:運行的線程執行wail方法,該線程會釋放占用的所有資源,JVM會把該線相放入?等待池”中.進入
這個狀態后,是不能自動喚醒的,必須依鼐其磔程調用notify或noUfyAII方法才能被喚醒,wait是object類的方
法
(2)、同步阻塞:運行的嫌在獲取對象的同步鎖時,若該同步鎖被的融占用,則JVM會把該線程放入鎖
池”中.
(3)、其他阻塞:運行的線程執行sleep或join方法,或者發出了I/O請求時,JVM會把該線程■為阻塞狀態.當
sleep狀態超時、join等待線程終止或者超時、或者I/O處理完畢時,線程更新轉入就緒狀態,sleep是Thread類的
方法
1.新建狀態但三):新創建了一個線程對象。
2.就緒狀態(Runnable]:線程5寸象創建后,其硬漉調用了該對象的s【art方替.該狀態的統程位于可運行線程
池中,變得可運行,等需獲取CPU的使用權."
3.運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。
4.阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,留時停止運行.直到線程進入就緒狀
態,才有機會轉到運行狀態.
5.死亡狀態(Dead):線程執行完了或者因異常退出了run方法,該線程束生命周期.
1.new新建狀態
2.就緒狀態,線程對象調用start。方法,等待獲取CPU使用權
3.運行狀態,線程獲取CPU資源,執行run方法內的代碼
4.阻塞狀態,因為某種原因,釋放了CPU,停止運行,直到線程進入就緒狀態,
重新競爭CPU資源
等待阻塞:線程調用了wait方法,jvm把該線程放入等待池中,不能自動喚
醒,必須依賴其他線程進行notify進行喚醒,是Object類的方法。
同步阻塞:線程獲取鎖的時候,已經被上鎖,進入鎖池中
其他阻塞:線程執行join或者sleep方法,sleep方法,該線程不會釋放鎖資
源
5.死亡狀態:異常中斷,或者退出了run方法
Sleepwaityieldjoin理解
1.sleep拿到鎖之后不釋放鎖
2.Wait不設置超時時間就必須等待喚醒
3.Yield線程進入就緒狀態,依然可以競爭cpu資源
4.線程加入
1、peep是Thread類的靜態李地方法,陽i型是Object類的本地方法。
2、sleep方法不會釋放lock,但是wait會釋放,而且會加入到等待隊列中.
s1eep、1f"pu$:J執■"貨格和執彳";,,.<一」;二」.:」.;cpy」..cpu..;
LU.cpu;:w;屋Ji-h行/?面如果si。叩時該畿程仃俊,那么sleep不會擇放這個鎮,‘而世把鐐帶在進入,凍結狀
態,也就是說其他需要這個鎖的伐程根本不可能佚取到這個鎮.也就是說無法執行程序.如果在睡眠期向代他畿程調用了這
個線程的interrupt。法,4;么這個線程也力拋出interruptexception抹"'1",這點制wait及?樣的.
3、sleep方法不依穎于同步器synchronized,但是wai【需要依賴synchronized關鍵字.
4、sleep不需要被喚醒(休眠之后推出阻塞),但星wait需要(不指定時間需要被別人中斷).
5、sleep一般用于當前線程休眠,或者輪循暫停操作,wail則多用于多線程之間的通信.
6、sleep會讓出CPU執行時間且強制上下文切換,而wail則不一定,wait后可能還是有鞏會重新競爭到鎖繼續
執行的.
yield()執行后線程直接迸入就緒狀態,馬上釋放了cpu的執行權,但是依然保留了cpu的ft行資格,所以有可能
CDU下次講行線程調電泳會i卜漢令線程獲05電im行權繼綠執行
對線程安全的理解
對線程安全的理解就是內存的安全,堆是內存共享,可以被所有線程訪問
每一個線程都有自己的棧,Cpu運行的時候會上下切換棧,棧是線程安全的,沒有垃圾,不
需要gc,棧用完就彈出
對線程安全的理解
不是線程安全、應該是內存安全,堆是共享內存,可以被所有線程訪問
當多個線程訪”?個對象時,如果小川進行欷外的同步控制或其他的協調操作,調用這個對望的行為都可以獲得正確的結
果,我們就說送個對象是找程安全的I
堆是進程和線程共有的空間,分全局堆和局部堆.全局堆就是所有沒有分fig的空間,局M上班5罌葭回.
堆在操作系統對進程初始化的時候分配,運行過程中也可以向系統要額外M堆,但是用完了要還給操作系統,要不
然就是內存泄漏.
在J.a中,堆劇ava虛擬ML所管理的內存中最大的一塊,杲所有線程共享的一塊內存區域,在虛擬機啟動時gl
建。[堆所存在誦內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例以及數組都在這里分配內存J
云界埼g1:M■以r公峭St通疝“司的三Q店室;近線程開始的時候初始化,每個線程的錢互相獨立,
因此,我是線程安全的.操作系統在切換線程的時候會自動切換棧.棧空間不需要在離級語言里面顯式的分配和釋
放.
目前主流操作系統都是多任務的,即多個進程同時運行.為了保證安全,每個進程只畿訪問分8貽自己的內存空
間,而不能訪問別的進程的,這是由操作系統保障的.
在毋個進程時內存空間中都會有一塊特姝的公區區域,通常稱內堆(內仔).進程內的所自選槎都OJ以訪I可到餒區
域,這就是造成問題的潛在原因.
什么事守護線程
對守護線程的理解
I
守護線程:為所有非守護線程提供服分的線程;任何一個守護線程都是整個JVM中所有非守滬線程的保姆;
守護線程類似于整個進程的一個默默無聞的小嘍嘍;它的生死無關重要,它卻依賴整個進程而運行;哪天其頓程
結束了,沒有要執行的了,程序就結束了,理都沒理守護線程,就把它中斷了;
注意:由于守護線程的終止是自身無法控制的,因此千萬不要把10、File等重要操作邏輯分配給它;因為它不靠
譜;
GC垃圾回收線程,典型的守護線程
Threadlocal的使用場景和原理
ThreadLocal的原理和使用場景
每~介Thread對象均含有一個ThreadLocalMap類型的成員變量threadLocals,它存儲本比程中所有
ThreadLocal對象及其對應的值1
ThreadLocalMap由一個■個Entry對象為成
Entry繼承自weakReference<ThreadLoca1v?>>,一個Entry由ThreadLocal對象和Object構成.由此可
見,Entry的key息ThreadLocal對象,并且是一個弱引用.當沒指向keyfi9強引用后,該key就會被垃圾收集器回
收
當執行set方法時,ThreadLocal首先會獲取當前線程對象,然后獲取當前線程的ThreadLocalMap對象.再以當前
ThreadLocal對象為key,將值存fifi^ThreadLocalMap對象中.
get方法執行Q程類似.ThreadLocal苜光會獲取當前線程對象,然后獲取當前線程的ThreadLocalM叩對象.再以
當所hreadLocal對象為key,應協alue.
由于每一條線程均含有名自私商的Thre2dsealMap容88,這些容即相互獨立互不影響,因此不會存在線程安全性
問題,從而也無需使用同步機制來保證多條線程訪問容疆的互斥性.
使用場景:
1、在進行對象跨層傳遞的時候,使用ThreadLocal可以避免多次傳遞,打破層次間的約束.1
2、線程間數據隔離
3、進行事務操作,用于存儲線程事箔信息。
4、數據庫連接,Session會話管理。
為每一個線程提供變量副本
ThreadLocal的實現原理,每一個Thread維護一個ThreadLocalMap,key為使用S5弓I用的ThreadLocal實例,
value為線程變量的副本
〃可以拋出異常.仃返回值
classTask(
//①逋過匿名內部類亂源ThreadLocal的initialValue()方法,指定初始值
privatestaticThreadLocal<Integer>seqNum=ThreadLocal.withlnitial^)-
//②獲取F?個序列值
publicintgetNextNum(){
seqNum.set(seqNum.get0+1);
returnseqNum.get。;
)
publicvoidtest(){
for(int1=0;i<3;i++){
System.out.printIn(Thread.current77)read().getName()+getNextNum())
)
)
Threadlocal內存泄露,如何避免
Threadlocalkey為弱引用,線程結束就被GC回收,value為強引用,不會被回收,
造成key為null,value無法刪除的情況。Key為當前線程
因此,Throcdlcral內存泄漏的根源是:由士工hreadlcralMap的生命周期跟Thread一樣長.如果沒有手動刪除對
應key就會導致內存泄漏,而不是因為弱引用.--
ThreadLocal正確的使用方法
憚次使用完ThreadLocal都調用它的remove。方法消除數更
(?將ThreadLocal變量定義成叩vgiesialic.這樣就一直存在ThreadLocal的強弓I用.也壁憑證任何時候都能
通過ThreadLocal吧易引用訪問到Entry的valuefg,進而清除掉."
避免:
每次使用完remover方法
變量定義privatestatic,改為強引用
并發、并行、串行的區別
。“5u4
并發、并行、串行的區別°內
串行在時間上不可能發生重疊,前一夕壬務沒搞定,下一個任務就只能等著(
并行在時間上是重疊的,兩個任務在同一時刻互不干擾的同時執行。
并發允許兩個任^彼此干擾。統一時間點、只有一個任務運行,交替執行
?
并行時間重疊,可以同一時刻一起執行
并發通過時刻只有一個任務運行,交替運行,充分利用CPU資源
并發的三大特性
原子性、可見性、有序性
1.原子性
含義
一個或多個操作,要么全部執行且在執行過程中不被任何因素打斷,要么全部不
執行。
在Java中,對基本數據類型的變量的讀取和賦值操作是原子性操作。
重要
不采取任何的原子性保障措施的自增操作并不是原子性的。
如何保證原子性
?通過synchronized關鍵字定義同步代碼塊或者同步方法保障原子性。
?通過Lock接口保障原子性。
.通過Atomic類型保障原子性。
2.可見性
含義
當一個線程修改了共享變量的值,其他線程能夠看到修改的值。
Java內存模型是通過在變量修改后將新值同步回主內存,在變量讀取前從主內
存刷新變量值這種依賴主內存作為傳遞媒介的方法來實現可見性的。
volatile變量和普通變量區別
普通變量與volatile變量的區別是volatile的特殊規則保證了新值能立即
同步到主內存,以及每次使用前立即從主內存刷新,因此我們可以說volatile
保證了多線程操作時變量的可見性,而普通變量則不能保證這一點。
如何保證可見性
?通過volatile關鍵字標記內存屏障保證可見性。
?通過synchronized關鍵字定義同步代碼塊或者同步方法保障可見性。
?通過Lock接口保障可見性。
?通過Atomic類型保障可見性。
?通過final關鍵字保障可見性
3.有序性
含義
即程序執行的順序按照代碼的先后順序執行。
JVM存在指令重排,所以存在有序性問題。
如何保證有序性
?通過synchronized關鍵字定義同步代碼塊或者同步方法保障可見性。
?通過Lock接口保障可見性。
?Volatile關鍵字,設置內存屏障,防止指令重排
什么是線程池?線程參數解釋
線程池,threadpool,是一種線程使用模式,線程池維護著多個線程,等待著
監督管理者分配可并發執行的任務。
三個方法(單一線池,固定線池,緩存線池)
*七個參數
通過設置corepoolsize和maxmumpoolsize來構造不同的線程池
七大參數:
核心線程池
最大線程池
心跳
時間
等待隊列
線程池工廠
拒絕策略
publicThreadPoolExecutor(intcorePoolSize,
intmaximumPoolSize,
longkeepAliveTime,
TimeUnitunit,
BlockingQueue<Runnable>workQueue,
ThreadFactorythreadFactory,
RejectedExecutionHandlerhandler){
使用線程池的好處:
1、降低資源消耗;提高線程利用率,降低創建和銷毀線程的消耗。
2、提高響應速度;任務來了,直接有線程可用可執行,而不是先創建線程,再執行。
3、提高線程的可管理性;線程是稀缺資源,使用線程池可以統一分配調優監控。
提高線程復用,監控和管理
線程池處執行流程
線程池阻塞隊列的作用?為什么要先添加到阻塞隊列而不
是直接創建最大線程?
I
1、一般的隊列只能保證作為一個有限長度的埴沖區,如果超出了緩沖長度,就無法保卬當前的任務了,阻塞隊列
通過阻塞可以保留住當前想要繼續入隊的任務.
阻塞隊列可以保證任務隊列中沒有任務時陽惠獲取任務的線程,使得線程進入wail狀態,釋放cpu資源.
阻塞隊列自帶用塞和唉醒的功能,不需要幼枚b理,無任務執行時,境程池利用阻塞隊列的take方法掛起,從而維
持核心線程的存活、不至于一直占用cpu資源
2、在創建新線程的時候,是要獲取全局談的,這個時候反它的就得阻塞,影響了整體效率.
就好比一位業里面有10個(core)正式工的名額,最多招10個正式工,要是任務超過正式工A數(task,
core)的情況下,工廠領導(線程池)不是苜先擴招工人,還是這10人,但是任務可以稍微積壓一下,即先放到
隊列去(代價低)?正式工慢1肝,遲早會干完的,要是任務還在繼續增加,超過正式工B9加班忍耐極限了
(隊列滿了),就的招外包幫忙了(注意是臨時工)要是正式工力口上外包還是不能完成任務,目斷來的任務就會被
領導拒絕了(線程池的拒絕策略).
創建線程的時候要獲取全局鎖,其他線程和會阻塞
線程池實現復用的原理
同一個線程可以從阻塞隊列里不斷獲取新的任務進行執行,對Thread進行了封裝,擺渡了
一個線程必須對應一個任務的限制。并不是每次執行都會調用start方法,通過循環任務進
行任務斷定
線程池中線程復用原理…一'1nd
線程池將線程和任務進行解耦,線程是里呈,任務是任務.擺脫了之前通過Thread創建線程時的一個線程必
須對應一令壬務的限制。"
在線程池中,同一個線程可以從阻塞隊列中不斷獲取新任芬來執行,其核心原理在于線程池對Thread迸行了
封裝,并不「每次執行任務都會調踵reads1吧)來創建新線程,而是在每個線程去執行一個“循環任務",在這
個“循林任務"中不停檢便是合句銬標被執行一茹果有則卸妾執行.也塞遇出住若中的耍印去,將run萬
法當成一個普通的方法執行,通過這種方式只使用固定的線程就將所有任芬的「孟方法串底繇:
集合都不安全
方法沒有用synoitt包裹,多線程情況下使用C。八C〃K七八土提供的類型保證線程
安全
Lis僅StH八g〉list=MWCopy。八WriteArr〃gList<>0;
Se僅String〉set=CoZecttocs.sg八ckKoniNedSeWnewHaskSet<>0);//方
法工.并發安全
Map<S±HngQbject〉set-MwC。八c“”C八±H〃skM即<>();
Cabbleable和runnable的區另U
i.可以有返回值
為2.可以拋出異常
//FutureTask是Ru八八〃詠接口的實現類,坐中間商使用,起連接作用,因
為處理的是ruiaable接口
FutureTaskfutureTask-MwFutureTask(callableTestl-);
2.
生產者消費者問題
六字核心判斷等待業務通知喚醒
Condition的作用
C。”(加M取代了對象監視器的使用,優點:可以實現精確喚醒線程
實現線程通信,取代了wait和notif,可以實現精準喚醒
線程資源類的作用
資源類,降低耦合,線程處理資源類
CountDownLatch
初始化線程個數
coc(八tDow八Latch.cou八tDow八();//減一
c。“八tDownLatch.await。;〃等待計數器歸零,在執行后面操作
CyclicBarrier
線程數量自增一
*CyclicBarrier線程數時H增一
*
*力/
publicclassCyclicBarrierTest{
?//舉例?七個線程集齊七個龍珠,不喚神龍
publicstaticvoidmain(String[]args){
〃線程數達到指定個數,執行參數電血的線程
CyclicBarrierCyclicBarrier=newCyclicBarrier(parties8,newThread(()
System.out.printing'召喚神龍,許愿“);
},name:"悟空"));
for(inti=1;i<=7;i++){
finalinttemp=i;
newThread(()-><
System.out.printin("集齊第"+temp+"顆龍珠");
try{
cyclicBarrier.await();“加線程數
Semaphore
Scj/vxapkoira信號量處理并發
*類似搶車位行為處理并發問題
ReadWriteLock讀寫鎖細粒度
同時只有一個線程去進行寫操作(保證原子性)
同時可以有多個線程去進行讀操作
獨占領(寫鎖)保證原子性
共享鎖(讀鎖)
BlockingQueue阻塞隊列
并阻塞隊列有四種阻塞處理機制(隊列存取數據采用的方法不同,就是不同的
處理策略)
興工.拋出異常(阻塞拋異常)
共2.有返回值,不拋異常(有Boolca八返回值)
殺3.阻塞等待(一直等,不拋異常)
*4.超時等待(超時結束,不拋異常)
四個拒絕策略
MWThreadPoo/ExecutorAbortPolicyO//不處理,拋出異常
*MWTlareadPoolExecutor.CallerRb(ia$Policy()//哪里來的回哪里去
newTTareadPoolExecutor.PiscardPolicyC)f丟棄任務,
不會拋出異常
*M\A/ThreadPoo/Executor.DiscardOlde$tPoticy()//隊列滿了,嘗試
與最早的線程競爭,
四大函數式接口
〃函數式接口編程C。仲2只有參數沒有返回值
//函數式接口Function有一"個傳入參數,有一個傳出參數
//斷定性接口,一個傳入參數類型,boolean返回值
//Sapph'eK供給性接口,沒有參數,只有返回值
Volatile關鍵字作用
工.保證可見性(每個線程都有自己的工作空間,數據從內存中讀取,可能未及時
更新數據)
興2.不保證原子性(如果要保證原子性,可以使用原子性類去創建對應數據類型)
興二避免指令重排(設置前后內存屏障,禁止指令重排)
單列模式
餓漢式
餓漢式單例(線程安全)
*一開始就創建
共優點:這種寫法比較簡單,就是在類裝載的時候就完成實例化。避免了線程
同步問題。
缺點:在類裝載的時候就完成實例化,沒有達到LazgLoadi八g的效果。如
果從始至終從未使用過這個實例,則會造成內存的浪費。
publicclassHungry{
privateintage;
privateStringname;
privatefinalstaticHungryhungry=newHungry();
nriVAtAMlinar
)
IpublicstaticHungrygetlnstance(){returnhungry;}
publicHungry(intage,Stringname){
this.age=age;
this.name=name;
)
懶漢式
方式一(不安全,if只判斷一次,可能同時有多個線程去執行)
/*
*懶漢式(線程不安全):
*使用在創建
★*/
publicclassLazyTestl(
privatestaticLazyTestllazyTest!;
privateLazyTestl(){};
publicstaticLazyTestlgetlnstance(){
多線程卜..可能多個線程經過if判斷,創建個對?實例|
lazyTest1-neviLazyTestl();
)
returnlazyTestl;
I
}
方式二添加sg八chnmized鎖
?WI-9
/*
*懶漢式(線程安全,效率太低,不推薦使用):
*使用在創建
★*/
publicclassLazyTest2(
privatestaticLazyTest2lazyTest!;
privateLazyTest2(){};
//添加synchronized鎖,線程安全,效率低,每?次執行都要獲取鎖
publicstaticsynchronizedLazyTest2getlnstance(){
if(lazyfest7==null){
lazyTest1=ne^LazyTest2();
}
returnlazyTest!;
}
)
方式三雙重檢測機制
/*
*雙垂檢索,推薦使用,線程安全,效率商)
飛〃
publicclassLazyTest3{
“volatile關鍵字,防止指令肅排J
privatestaticvolatileLazyTest3lazyTest!;
LazyTest3()(};
publicstaticLazyTest3getlnstance(){
if(lazyfest7==null){-
〃鎖住類模板.同?個時刻只有?個線程獲取鎖然后創建對您.只執彳f?次即可,效乎消
synchronized(LazyTest3.class){
if(Iazyrest/==null){
lazylest7=newLazyTest3();
)
)
)
returnlazyTestl;
}
)
方式四枚舉
packagecom.tql.test_13;MS八
/*
*借助JDK1.5中添加的枚舉來實現單例模式.不僅能避免多線程同步問題?而11還能防止反序列化成新、
p*/
publicenumLazyTe|st4(
Instance;
publicvoidgetlnstance(){}
)
枚舉為什么是線程安全的
我們定義的一個枚舉,在第一次被真正用到的時候,會被虛擬機加載并初始化,
而這個初始化過程是線程安全的。而我們知道,解決單例的并發問題,主要解決
的就是初始化過程中的線程安全問題。
所以,由于枚舉的以上特性,枚舉實現的單例是天生線程安全的。
普通類的反序列化是通過反射實現的,枚舉類的反序列化不是通過反射實現的。
所以,枚舉類也就不會發生由于反序列化導致的單例破壞
可重入鎖概念
*synchronized鎖獲取外面的鎖自動獲取里面的鎖
共lock鎖要配對出現(上鎖,就要解鎖)
ReentrantLock和synchronized不一樣,需要手動釋放鎖,所以使用ReentrantLock的時候一定要
手動釋放鎖,并IL加鎖次數和釋放次數要一樣
如何解決死鎖問題
(互相抱有對方的資源不釋放)
興工.互斥條件:一個資源每次只能被一個進程使用;
2.請求與保持條件:個進程因請求資源而阻塞時,對已獲得的資源保持不放;
二不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪;
4.循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系;
Spring是什么
spring是什么?
輕量級的開源的J2EE框架.它是一個容器框架,用來裝javabean(java對象),中間層框架(萬能膠)可以起一
個連接作用,比如說把Strutsffihibernate粘合在一起運用,可以讓我們的企業開發更快、更簡潔
Spring是一個輕量級的控制反轉(loC廂面向切面(AOP)的容88框架
-從大小與開銷兩方面而言Spring都是輕量級的。
--通過控制反轉(I。。的技術達到松燃合的目的
-提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務進行內聚性的開發
-包含并管理應用對象(Bean)的配置和生命周期,這個意義上是一個容器.
--將簡單的組件配置、組合成為復雜的應用,這個意義上是一個框架.
I
AOP理解
橫向切面,對系統功能進行增強,如日志、事務讓關注點代碼與業務邏輯代碼分
離面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的
一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中
的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的
各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可
重用性,同時提高了開發的效率。
13*RAspect:指定當前類為切面類
14*/
15?Component〃加入到IoC容器
16?Aspect〃指定節將類為切面類
17publicclassAop{
18
19
20//gPointcut("execution(*com.bi?.aop.UserDao.save(..))")..代表所行參數
21//gPointcut("execution(,com.bie.aop.UserDao.*())")指定所右的方法
22//gPointcut("execution(*com.bie.aop.UserDao.save())")指定save方法
23
@Pointcut("execution(,com.bie.aop.UserDao.*(..))")
25publicvoidpointcut(){
26
271
28
29@Before("pointcut()")
30publicvoidbegin(){
System.out.printIn("JFA'!T^");
32}
33
34?After("pointcut()")
35publicvoidclose(){
System.out.printin;
37}
38
39}
如果ioc是處理解耦的話,那么aop就是來提升內聚的
IOC理解(控制反轉)
對象由spring容器去創建和注入,不需要程序要去手動創建,就是控制翻轉。實
現低耦合
依賴注入:
'蒙得依賴對象的過程被反轉了%控制被反轉之后,獲得礴對象的過程由自身管理變為了由ioc容器主動注入.
依賴注入是實現IOC的方法,就是由IOC容器在運行期間,動態地將某種依賴關系注入到對象之中.
Bean的作用域
解釋下Spring支持的幾種bean的作用域。J5/
?singleton:默認,每個容黯中只看一個bean的實例,單例的橫式由BeanFaaorv自身來維護.該對象的生命
周期是與SpringIOC容器一致的,:但在第一次被注入時才會創建)?J''
?prouxje:為受二個bean請求提供一個實例.在每次注入時都會創建一個新的龍象
?requestbean被定義為在每個HTTP請求中創建一個單例對象,也就是說在單個請求中都會復用這一單例
?oSC過皿-與request范圍類似,確保每個session中有一^bean的實照在session過期后,bean會隨之失
城~
?叩plicalion:bean被定義為在SeMeiContext的生命周期中復用一個單例對象.
?websocket:bean被定義為在websocket的生命周期中復用一個單例對象.
global-session:全局作用域,global-session和Porilei應用相關.當你的應用部署在PorUei容需中工作時,
它包含很多porile【.如果你想要聲明讓所有的porUe【共用全局的存儲變■的話,那么這全局變量需要存儲在
global-session中。全局作用域與Servlei中的session作用域效果相同。
spring框架中的bean是線程安全的嗎
Bean默認是單例模式
存儲數據不安全推薦ThreadLocal
不存儲數據安全
Spring框架采用了那些設計模式和應用場景?
動態代理模式
簡單工廠模式
適配器模式
單例模式
工廠模式
觀察者模式
策略模式
Spring實現事務方式和隔離級別
實現方式基于編程式或者基于注解@Transaction
隔離級別:
讀未提交(臟讀、不可重復度、幻讀)
讀已提交(不可重復度、幻讀)
可重復讀(幻讀)
串行化
KE)褶式9)視解M主也⑴?M(tD
Spring事務的實現方式和原理以及隔離級別?
在使用Spring框架時,可以有兩種使用事分的方式,一種是編程式的,一種是申明式的,@Transactional注解就
是申明式的。
首先,事芬這個概念是數據庫層面的,Sprin卿是基于數據庫中的事務進行了擴展,以及提供了一些能讓程序員更
加方便操作事芬的方式.
比如我們可以通過在某個方法上增加@一9(1乳3。M1注解,就可以開啟事務,這個方法中所有的sql都會在一個事
務中執行,統一成功或失敗。
在f方法上加了@Transaciional注解后,Spring會基于這個類生成一個代理對象,會將這個代理對象作為
bean,當在使用這個的對象的方法時,如果這個方法上存在@Transaaional注解,那么代理邏輻會先把事務的
自動提交設■為false,然后再去執行原本的業務邏輯方法,如果執行業務邏輯方法沒有出現異常,那么代理邏輯
中就會將事務進行提交,如果執行業若建輯方法出現了異常,那么則會將事多進行回潦.
當然,針對哪些異常回滾事芬是可以配■的,可以利用@Transaaional注解中的rollbackFor屬性進行配置,默認
情況下會對RunUmeExcepHon和Error進行回流.
spring事務隔離級別就是數據庫的隔離級別:外加一個默認級別
?readuncommitted(未提交讀)
?readcommitted(提交讀、不可窗復讀)
?repeatableread(可康復讀)
?sriali7口hip由衿生\
spring事務什么時候會失效
事務是基于AOP進行實現的,生成bean代理對象注入到容器中,使用事務必須
從容器中獲取,不然不起作用
1.自調用,不可以使用this去調用,this對象不是代理對象
2.方法修飾符不是public
3.沒有注入到bean容器中
4.數據庫不支持事務
spring事務什么時候會失效?
springW?09JRMAOP,進行7切面喇,那么失效的根本原因JB這個AOP不起作用力對見情況存如下幾種
1、型自調用,類里面使用(his學用本類的方法([his通常丘略)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑行業安全生產合同
- 合同制員工福利待遇調整趨勢
- 代理區域銷售合同書
- 【課件】串聯電路與并聯電路+課件-高二上學期物理人教版(2019)必修第三冊
- 2025年度IT服務外包合同范本
- 云南省元馬中學重點中學2025年初三下學期第一次質量抽測數學試題含解析
- 供水供電合同
- 天津天獅學院《機械制圖上》2023-2024學年第二學期期末試卷
- 蘇州科技大學天平學院《幼兒歌曲彈唱》2023-2024學年第一學期期末試卷
- 浙江海洋大學《半導體制造與工藝》2023-2024學年第二學期期末試卷
- 機電一體化畢業論文范文(精選十五篇)
- (讀書筆記)禮物的流動:一個中國村莊中的互惠原則和社會網絡
- 《醫療垃圾的分類》課件
- 江蘇師范大學成人繼續教育網絡課程《英語》單元測試及參考答案
- 雙堿法脫硫操作規程
- 全國中學生物理競賽及實驗課件
- 病案信息技術基礎知識考試重點梳理(最新最全)
- 安全施工作業票(模版)
- 環保管理制度(適用于軟件企業)
- DB 33-T 1015-2021居住建筑節能設計標準(高清正版)
- 鋼結構門式剛架廠房設計土木工程畢業設計
評論
0/150
提交評論