亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析

 更新時間:2013年08月16日 10:22:26   作者:  
以下是對小編對JAVA多線程與并發(fā)的學(xué)習(xí)進行了總結(jié)介紹,需要的朋友可以過來參考下

1.計算機系統(tǒng)
使用高速緩存來作為內(nèi)存與處理器之間的緩沖,將運算需要用到的數(shù)據(jù)復(fù)制到緩存中,讓計算能快速進行;當(dāng)運算結(jié)束后再從緩存同步回內(nèi)存之中,這樣處理器就無需等待緩慢的內(nèi)存讀寫了。

緩存一致性:多處理器系統(tǒng)中,因為共享同一主內(nèi)存,當(dāng)多個處理器的運算任務(wù)都設(shè)計到同一塊內(nèi)存區(qū)域時,將可能導(dǎo)致各自的緩存數(shù)據(jù)不一致的情況,則同步回主內(nèi)存時需要遵循一些協(xié)議。

亂序執(zhí)行優(yōu)化:為了使得處理器內(nèi)部的運算單位能盡量被充分利用。

2.JAVA內(nèi)存模型
目標(biāo)是定義程序中各個變量的訪問規(guī)則。(包括實例字段、靜態(tài)字段和構(gòu)成數(shù)組的元素,不包括局部變量和方法參數(shù))

1.所有的變量都存儲在主內(nèi)存中(虛擬機內(nèi)存的一部分)。
2.每條線程都由自己的工作內(nèi)存,線程的工作內(nèi)存中保存了該線程使用到的變量的主內(nèi)存副本拷貝,線程對變量的所有操作都必須在工作內(nèi)存中進行,而不能直接讀寫主內(nèi)存中的變量。
3.線程之間無法直接訪問對方的工作內(nèi)存中的變量,線程間變量的傳遞均需要通過主內(nèi)存來完成。

內(nèi)存間交互操作:

Lock(鎖定):作用于主內(nèi)存中的變量,把一個變量標(biāo)識為一條線程獨占的狀態(tài)。

Read(讀取):作用于主內(nèi)存中的變量,把一個變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中。

Load(加載):作用于工作內(nèi)存中的變量,把read操作從主內(nèi)存中得到的變量的值放入工作內(nèi)存的變量副本中。

Use(使用):作用于工作內(nèi)存中的變量,把工作內(nèi)存中一個變量的值傳遞給執(zhí)行引擎。

Assign(賦值):作用于工作內(nèi)存中的變量,把一個從執(zhí)行引擎接收到的值賦值給工作內(nèi)存中的變量。

Store(存儲):作用于工作內(nèi)存中的變量,把工作內(nèi)存中的一個變量的值傳送到主內(nèi)存中。

Write(寫入):作用于主內(nèi)存中的變量,把store操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。

Unlock(解鎖):作用于主內(nèi)存中的變量,把一個處于鎖定狀態(tài)的變量釋放出來,之后可被其它線程鎖定。

規(guī)則:

1.不允許read和load、store和write操作之一單獨出現(xiàn)。

2.不允許一個線程丟棄最近的assign操作,變量在工作內(nèi)存中改變了之后必須把該變化同步回主內(nèi)存中。

3.不允許一個線程沒有發(fā)生過任何assign操作把數(shù)據(jù)從線程的工作內(nèi)存同步回主內(nèi)存中。

4.一個新的變量只能在主內(nèi)存中誕生。

5.一個變量在同一時刻只允許一條線程對其進行l(wèi)ock操作,但可以被同一條線程重復(fù)執(zhí)行多次。

6.如果對一個變量執(zhí)行l(wèi)ock操作,將會清空工作內(nèi)存中此變量的值,在執(zhí)行引擎使用這個變量前,需要重新執(zhí)行read、load操作。

7.如果一個變量事先沒有被lock操作鎖定,則不允許對它執(zhí)行unlock操作。

8.對一個變量執(zhí)行unlock操作前,必須先把該變量同步回主內(nèi)存中。

3.volatile型變量
1.保證此變量對所有線程的可見性。每條線程使用此類型變量前都需要先刷新,執(zhí)行引擎看不到不一致的情況。
運算結(jié)果并不依賴變量的當(dāng)前值、或者確保只有單一的線程修改變量的值。

變量不需要與其他的狀態(tài)變量共同參與不變約束。

1.禁止指令重排序優(yōu)化。普通的變量僅保證在方法執(zhí)行過程中所有依賴賦值結(jié)果的地方都能獲取到正確的結(jié)果。而不能保證賦值操作的順序與程序代碼中的順序一致。
2.load必須與use同時出現(xiàn);assign和store必須同時出現(xiàn)。

4.原子性、可見性與有序性
原子性:基本數(shù)據(jù)類型的訪問讀寫是具備原子性的,synchronized塊之間的操作也具備原子性。

可見性:指當(dāng)一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。synchronized(規(guī)則8)和final可以保證可見性。Final修飾的字段在構(gòu)造器中一旦被初始化完成,并且構(gòu)造器沒有把this的引用傳遞出去,那么在其他線程中就能看見final字段的值。

有序性:volatile本身包含了禁止指令重排序的語義,而synchronized則是由規(guī)則5獲得的,這個規(guī)則決定了持有同一個所的兩個同步塊只能串行地進入。

5.先行發(fā)生原則
Java內(nèi)存模型中定義的兩項操作之間的偏序關(guān)系,如果操作A先行發(fā)生于操作B,其實就是說在發(fā)生操作B之前,操作A產(chǎn)生的影響能被操作B觀察到。

程序次序規(guī)則:在一個線程內(nèi),按照代碼控制流順序,在前面的操作先行發(fā)生于后面的操作。

管程鎖定規(guī)則:一個unlock操作先行發(fā)生于后面對同一個鎖的lock操作。

Volatile變量規(guī)則:對一個volatile變量的寫操作先行發(fā)生于后面對這個變量的讀操作。

線程啟動規(guī)則:Thread對象的start()方法先行發(fā)生于此線程的每個操作。

線程終止規(guī)則:線程中的所有操作都先行發(fā)生于對此線程的終止檢測。

線程中斷規(guī)則:對線程的interrupt()方法的調(diào)用先行發(fā)生于被中斷線程的代碼檢測中斷事件的發(fā)生。

對象終結(jié)過則:一個對象的初始化完成先行發(fā)生于它的finalize()方法的開始。

傳遞性:如果操作A先行發(fā)生于操作B,操作B現(xiàn)象發(fā)生于操作C,那么就可以得出操作A先行發(fā)生于操作C的結(jié)論。

時間上的先后順序與先行發(fā)生原則之間基本上沒有太大的關(guān)系。

6.線程實現(xiàn)
使用內(nèi)核線程實現(xiàn):

內(nèi)核線程Kernel Thread:直接由操作系統(tǒng)內(nèi)核支持的線程,這種線程由內(nèi)核類完成線程切換,內(nèi)核通過操縱調(diào)度器對線程進行調(diào)度,并負責(zé)將線程的任務(wù)映射到各個處理器上。

輕量級進程Light Weight Process:每個輕量級進程都由一個內(nèi)核線程支持。

局限性:各種進程操作都需要進行系統(tǒng)調(diào)用(系統(tǒng)調(diào)用代價相對較高,需要在用戶態(tài)和內(nèi)核態(tài)中來回切換);輕量級進程要消耗一定的內(nèi)核資源,一次一個系統(tǒng)支持輕量級進程的數(shù)量是有限的。

使用用戶線程實現(xiàn):
用戶線程:完全建立在用戶空間的線程庫上,系統(tǒng)內(nèi)核不能直接感知到線程存在的實現(xiàn)。用戶線程的建立、同步、銷毀和調(diào)度完全在用戶態(tài)中完成,不需要內(nèi)核的幫助。所有的線程操作都需要用戶程序自己處理。

混合實現(xiàn):
將內(nèi)核線程和用戶線程一起使用的方式。操作系統(tǒng)提供支持的輕量級進程則作為用戶線程和內(nèi)核線程之間的橋梁。

Sun JDK,它的Windows版和Linux版都是使用一對一的線程模型來實現(xiàn)的,一條Java線程映射到一條輕量級進程之中。

7.線程調(diào)度
線程調(diào)度是指系統(tǒng)為線程分配處理器使用權(quán)的過程:協(xié)同式、搶占式。

協(xié)同式:線程的執(zhí)行時間由線程本身控制,線程把自己的工作執(zhí)行完了之后,要主動通知系統(tǒng)切換到另一個線程上。壞處:線程執(zhí)行時間不可控制。

搶占式:每個線程將由系統(tǒng)來分配執(zhí)行時間,線程的切換不由線程本身來決定。Java使用該種調(diào)用方式。

線程優(yōu)先級:在一些平臺上(操作系統(tǒng)線程優(yōu)先級比Java線程優(yōu)先級少)不同的優(yōu)先級實際會變得相同;優(yōu)先級可能會被系統(tǒng)自行改變。

8.線程狀態(tài)
線程狀態(tài):
新建NEW:
運行RUNNABLE:

無限期等待WAITING:等得其他線程顯式地喚醒。

沒有設(shè)置Timeout參數(shù)的Object.wait();沒有設(shè)置Timeout參數(shù)的Thread.wait()。

限期等待TIMED_WAITING:在一定時間之后會由系統(tǒng)自動喚醒。

設(shè)置Timeout參數(shù)的Object.wait();設(shè)置Timeout參數(shù)的Thread.wait();Thread.sleep()方法。

阻塞BLOCKED:等待獲取一個排它鎖,等待進入一個同步區(qū)域。

結(jié)束TERMINATED:

9.線程安全
線程安全:當(dāng)多個線程訪問一個對象時,如果不用考慮這些線程在運行時環(huán)境下的調(diào)度和交換執(zhí)行,也不需要進行額外的同步,或者調(diào)用方進行任何其他的協(xié)調(diào)操作,調(diào)用這個對象的行為都可以獲得正確的結(jié)果,那這個對象就是線程安全的。

不可變:只要一個不可變的對象被正確地構(gòu)建出來。使用final關(guān)鍵字修飾的基本數(shù)據(jù)類型;如果共享數(shù)據(jù)是一個對象,那就需要保證對象的行為不會對其狀態(tài)產(chǎn)生任何影響(String類的對象)。方法:把對象中帶有狀態(tài)的變量都申明為final,如Integer類。有:枚舉類型、Number的部分子類(AtomicInteger和AtomicLong除外)。

絕對線程安全:
相對線程安全:對這個對象單獨的操作是線程安全的。一般意義上的線程安全。

線程兼容:需要通過調(diào)用端正確地使用同步手段來保證對象在并發(fā)環(huán)境中安全地使用。

線程對立:不管調(diào)用端是否采取了同步措施,都無法在多線程環(huán)境中并發(fā)使用的代碼。有:System.setIn()、System.setOut()、System.runFinalizersOnExit()

10. 線程安全的實現(xiàn)方法
1.1.互斥同步:同步是指在多個線程并發(fā)訪問共享數(shù)據(jù)時,保證共享數(shù)據(jù)在同一個時刻只被一條線程使用?;コ夥绞剑号R界區(qū)、互斥量和信號量。

Synchronized關(guān)鍵字:編譯后會在同步塊前后分別形成monitorenter和monitorexit這兩個字節(jié)碼指令。這兩個指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。如果沒有明確指定對象參數(shù),那就根據(jù)synchronized修飾的是實例方法還是類方法,去取對應(yīng)的對象實例或Class對象來作為鎖對象。

在執(zhí)行monitorenter指令時,首先嘗試獲取對象的鎖,如果沒有被鎖定或者當(dāng)前線程已經(jīng)擁有了該對象的鎖,則將鎖計數(shù)器加1,相應(yīng)的執(zhí)行moniterexit時,將鎖計數(shù)器減1,當(dāng)計數(shù)器為0時,鎖就被釋放了。如果獲取對象鎖失敗,則當(dāng)前線程就要阻塞等待。

ReentrantLock相對synchronized的高級功能:

等待可中斷:當(dāng)持有鎖的線程長期不釋放鎖時,正在等待的線程可以選擇放棄等待,改為處理其他事情。

公平鎖:多個線程在等待同一個鎖時,必須按照申請鎖的事件順序來一次獲取鎖;而非公平鎖在被釋放時,任何一個等待鎖的線程都有機會獲得鎖。Synchronized中的鎖是非公平鎖,ReentrantLock默認也是非公平鎖。

鎖綁定多個條件:一個ReentrantLock對象可以同時綁定多個Condition對象。

1.2. 非阻塞同步:
基于沖突檢測的樂觀并發(fā)策略:先進行操作,如果沒有其他線程爭用共享數(shù)據(jù),那操作就成功了;如果共享數(shù)據(jù)有爭用,產(chǎn)生了沖突,那就再進行其他的補償措施(一般是不斷的嘗試,直到成功為止)。

AtomicInteger等原子類中提供了方法實現(xiàn)了CAS指令。

1.3.無同步方案:
可重入代碼:可以在代碼執(zhí)行的任何時刻中斷它,轉(zhuǎn)而去執(zhí)行另一段代碼,而在控制權(quán)返回后,原來的程序不會出現(xiàn)任何錯誤。特征:不依賴存儲在堆上的數(shù)據(jù)和公用的系統(tǒng)資源、用到的狀態(tài)量都由參數(shù)傳入,不調(diào)用非可重入的方法等。如果一個方法,它的返回結(jié)果是可以預(yù)測的,只要出入了相同的數(shù)據(jù),就能返回相同的結(jié)果,那它就滿足可重入性的要求。

線程本地存儲:如果一段代碼中所需要的數(shù)據(jù)必須與其它代碼共享,那就看看這些共享數(shù)據(jù)的代碼是否能保證在同一個線程中執(zhí)行。

A.ThreadLocal類
ThreadLocal:線程級別的局部變量,為每個使用該變量的線程提供一個獨立的變量副本,每個線程修改副本時不影響其他線程對象的副本。ThreadLocal實例通常作為靜態(tài)私有字段出現(xiàn)在一個類中。

11.鎖優(yōu)化
1.1.自旋鎖
為了讓線程等待,讓線程執(zhí)行一個忙循環(huán)(自旋)。需要物理機器有一個以上的處理器。自旋等待雖然避免了線程切換的開銷,帶它是要占用處理器時間的,所以如果鎖被占用的時間很短,自旋等待的效果就會非常好,反之自旋的線程只會白白消耗處理器資源。自旋次數(shù)的默認值是10次,可以使用參數(shù)-XX:PreBlockSpin來更改。

自適應(yīng)自旋鎖:自旋的時間不再固定,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態(tài)來決定。

1.2.鎖清除
指虛擬機即時編譯器在運行時,對一些代碼上要求同步,但是被檢測到不可能存在共享數(shù)據(jù)競爭的鎖進行清除(逃逸分析技術(shù):在堆上的所有數(shù)據(jù)都不會逃逸出去被其它線程訪問到,可以把它們當(dāng)成棧上數(shù)據(jù)對待)。

1.3.鎖粗化
如果虛擬機探測到有一串零碎的操作都對同一個對象加鎖,將會把加鎖同步的范圍擴展到整個操作序列的外部。

HotSpot虛擬機的對象的內(nèi)存布局:對象頭(Object Header)分為兩部分信息嗎,第一部分(Mark Word)用于存儲對象自身的運行時數(shù)據(jù),另一個部分用于存儲指向方法區(qū)對象數(shù)據(jù)類型的指針,如果是數(shù)組的話,還會由一個額外的部分用于存儲數(shù)組的長度。

32位HotSpot虛擬機中對象未被鎖定的狀態(tài)下,Mark Word的32個Bits空間中25位用于存儲對象哈希碼,4位存儲對象分代年齡,2位存儲鎖標(biāo)志位,1位固定為0。

HotSpot虛擬機對象頭Mark Word

存儲內(nèi)容

標(biāo)志位

狀態(tài)

對象哈希碼、對象分代年齡

01

未鎖定

指向鎖記錄的指針

00

輕量級鎖定

指向重量級鎖的指針

10

膨脹(重量級鎖)

空,不記錄信息

11

GC標(biāo)記

偏向線程ID,偏向時間戳、對象分代年齡

01

可偏向


1.4. 輕量級鎖
在代碼進入同步塊時,如果此同步對象沒有被鎖定,虛擬機首先將在當(dāng)前線程的棧幀中建立一個名為鎖記錄(Lock Record)的空間,用于存儲所對象目前的Mark Word的拷貝。然后虛擬機將使用CAS操作嘗試將對象的Mark Word更新為執(zhí)行Lock Record的指針。如果成功,那么這個線程就擁有了該對象的鎖。如果更新操作失敗,虛擬機首先會檢查對象的Mark Word是否指向當(dāng)前線程的棧幀,如果是就說明當(dāng)前線程已經(jīng)擁有了這個對象的鎖,否則說明這個對象已經(jīng)被其它線程搶占。如果有兩條以上的線程爭用同一個鎖,那輕量級鎖就不再有效,要膨脹為重量級鎖。

解鎖過程:如果對象的Mark Word仍然指向著線程的鎖記錄,那就用CAS操作把對象當(dāng)前的Mark Word和和線程中復(fù)制的Displaced Mark Word替換回來,如果替換成功,整個過程就完成。如果失敗,說明有其他線程嘗試過獲取該鎖,那就要在釋放鎖的同時,喚醒被掛起的線程。

輕量級鎖的依據(jù):對于絕大部分的鎖,在整個同步周期內(nèi)都是不存在競爭的。

傳統(tǒng)鎖(重量級鎖)使用操作系統(tǒng)互斥量來實現(xiàn)的。

1.5. 偏向鎖
目的是消除在無競爭情況下的同步原語,進一步提高程序的運行性能。鎖會偏向第一個獲得它的線程,如果在接下來的執(zhí)行過程中,該鎖沒有被其它線程獲取,則持有鎖的線程將永遠不需要再進行同步。

當(dāng)鎖第一次被線程獲取的時候,虛擬機將會把對象頭中的標(biāo)志位設(shè)為01,同時使用CAS操作把獲取到這個鎖的線程的ID記錄在對象的Mark Word之中,如果成功,持有偏向鎖的線程以后每次進入這個鎖相關(guān)的同步塊時,都可以不進行任何同步操作。

當(dāng)有另一個線程去嘗試獲取這個鎖時,偏向模式就宣告結(jié)束。根據(jù)所對象目前是否處于被鎖定的狀態(tài),撤銷偏向后恢復(fù)到未鎖定或輕量級鎖定狀態(tài)。

12.內(nèi)核態(tài)和用戶態(tài)
操作系統(tǒng)的兩種運行級別,intel cpu提供-Ring3三種運行模式。

Ring0是留給操作系統(tǒng)代碼,設(shè)備驅(qū)動程序代碼使用的,它們工作于系統(tǒng)核心態(tài);而Ring3則給普通的用戶程序使用,它們工作在用戶態(tài)。運行于處理器核心態(tài)的代碼不受任何的限制,可以自由地訪問任何有效地址,進行直接端口訪問。而運行于用戶態(tài)的代碼則要受到處理器的諸多檢查,它們只能訪問映射其地址空間的頁表項中規(guī)定的在用戶態(tài)下可訪問頁面的虛擬地址,且只能對任務(wù)狀態(tài)段(TSS)中I/O許可位圖(I/O Permission Bitmap)中規(guī)定的可訪問端口進行直接訪問。

13. 常用方法
1.1.object.wait():
在其他線程調(diào)用此對象的notify()或者notifyAll()方法,或超過指定時間量前,當(dāng)前線程T等待(線程T必須擁有該對象的鎖)。線程T被放置在該對象的休息區(qū)中,并釋放鎖。在被喚醒、中斷、超時的情況下,從對象的休息區(qū)中刪除線程T,并重新進行線程調(diào)度。一旦線程T獲得該對象的鎖,該對象上的所有同步申明都被恢復(fù)到調(diào)用wait()方法時的狀態(tài),然后線程T從wait()方法返回。如果當(dāng)前線程在等待之前或在等待時被任何線程中斷,則會拋出 InterruptedException。在按上述形式恢復(fù)此對象的鎖定狀態(tài)時才會拋出此異常。在拋出此異常時,當(dāng)前線程的中斷狀態(tài)被清除。

只有該對象的鎖被釋放,并不會釋放當(dāng)前線程持有的其他同步資源。

1.2. object.notify()
喚醒在此對象鎖上等待的單個線程。此方法只能由擁有該對象鎖的線程來調(diào)用。

1.3. Thread.sleep()
在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行),此操作受到系統(tǒng)計時器和調(diào)度程序精度和準(zhǔn)確性的影響。監(jiān)控狀態(tài)依然保持、會自動恢復(fù)到可運行狀態(tài),不會釋放對象鎖。如果任何線程中斷了當(dāng)前線程。當(dāng)拋出InterruptedException異常時,當(dāng)前線程的中斷狀態(tài)被清除。讓出CPU分配的執(zhí)行時間。

thread.join():在一個線程對象上調(diào)用,使當(dāng)前線程等待這個線程對象對應(yīng)的線程結(jié)束。

Thread.yield():暫停當(dāng)前正在執(zhí)行的線程對象,并執(zhí)行其他線程。

thread.interrupt()
中斷線程,停止其正在進行的一切。中斷一個不處于活動狀態(tài)的線程不會有任何作用。

如果線程在調(diào)用Object類的wait()方法、或者join()、sleep()方法過程中受阻,則其中斷狀態(tài)將被清除,并收到一個InterruptedException。

Thread.interrupted():檢測當(dāng)前線程是否已經(jīng)中斷,并且清除線程的中斷狀態(tài)(回到非中斷狀態(tài))。

thread.isAlive():如果線程已經(jīng)啟動且尚未終止,則為活動狀態(tài)。

thread.setDaemon():需要在start()方法調(diào)用之前調(diào)用。當(dāng)正在運行的線程都是后臺線程時,Java虛擬機將退出。否則當(dāng)主線程退出時,其他線程仍然會繼續(xù)執(zhí)行。

14.其他
1.當(dāng)調(diào)用Object的wait()、notify()、notifyAll()時,如果當(dāng)前線程沒有獲得該對象鎖,則會拋出IllegalMonitorStateException異常。

1.如果一個方法申明為synchronized,則等同于在這個方法上調(diào)用synchronized(this)。
如果一個靜態(tài)方法被申明為synchronized,則等同于在這個方法上調(diào)用synchronized(類.class)。當(dāng)一個線程進入同步靜態(tài)方法中時,其他線程不能進入這個類的任何靜態(tài)同步方法。

1.線程成為對象鎖的擁有者:
1.通過執(zhí)行此對象的同步實例方法
2.通過執(zhí)行在此對象上進行同步的synchronized語句的正文
3.對于Class類型的對象,可以通過執(zhí)行該類的同步靜態(tài)方法。

1.死鎖:
死鎖就是兩個或兩個以上的線程被無限的阻塞,線程之間相互等待所需資源。

可能發(fā)生在以下情況:
當(dāng)兩個線程相互調(diào)用Thread.join();
當(dāng)兩個線程使用嵌套的同步塊,一個線程占用了另外一個線程必須的鎖,互相等待時被阻塞就有可能出現(xiàn)死鎖。

1.調(diào)用了Thread類的start()方法(向CPU申請另一個線程空間來執(zhí)行run()方法里的代碼),線程的run()方法不一定立即執(zhí)行,而是要等待JVM進行調(diào)度。
run()方法中包含的是線程的主體,也就是這個線程被啟動后將要運行的代碼。

相關(guān)文章

  • Java實現(xiàn)貪吃蛇游戲的示例代碼

    Java實現(xiàn)貪吃蛇游戲的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Java實現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Javafx實現(xiàn)國際象棋游戲

    Javafx實現(xiàn)國際象棋游戲

    這篇文章主要為大家詳細介紹了Javafx實現(xiàn)國際象棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之集合框架與常用算法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之集合框架與常用算法詳解

    Java集合框架是Java中常用的數(shù)據(jù)結(jié)構(gòu)庫,包括List、Set、Map等多種數(shù)據(jù)結(jié)構(gòu),支持快速的元素添加、刪除、查找等操作,可以用于解決各種實際問題。Java中也有多種常用算法,如排序、查找、遞歸等,在數(shù)據(jù)處理和分析中有廣泛應(yīng)用
    2023-04-04
  • SpringBoot+MyBatisPlus+Vue 前后端分離項目快速搭建過程(后端)

    SpringBoot+MyBatisPlus+Vue 前后端分離項目快速搭建過程(后端)

    這篇文章主要介紹了SpringBoot+MyBatisPlus+Vue 前后端分離項目快速搭建過程(后端),快速生成后端代碼、封裝結(jié)果集、增刪改查、模糊查找,畢設(shè)基礎(chǔ)框架,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Java實現(xiàn)從字符串中找出數(shù)字字符串的方法小結(jié)

    Java實現(xiàn)從字符串中找出數(shù)字字符串的方法小結(jié)

    這篇文章主要介紹了Java實現(xiàn)從字符串中找出數(shù)字字符串的方法,結(jié)合實例形式總結(jié)分析了Java查找數(shù)字字符串的常用技巧,需要的朋友可以參考下
    2016-03-03
  • Java使用volatile關(guān)鍵字的注意事項

    Java使用volatile關(guān)鍵字的注意事項

    volatile關(guān)鍵字是Java中的一種稍弱的同步機制,為什么稱之為弱機制。這篇文章主要介紹了Java使用volatile關(guān)鍵字的注意事項,需要的朋友可以參考下
    2017-02-02
  • Spring Boot搭建文件上傳服務(wù)的方法

    Spring Boot搭建文件上傳服務(wù)的方法

    這篇文章主要為大家詳細介紹了Spring Boot搭建文件上傳服務(wù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java實現(xiàn)每日給女友微信發(fā)送早安信息

    Java實現(xiàn)每日給女友微信發(fā)送早安信息

    這篇文章主要為大家詳細介紹了Java如何實現(xiàn)每日給女友微信發(fā)送早安等微信信息,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-12-12
  • SpringBoot實現(xiàn)優(yōu)雅停機的正確方法

    SpringBoot實現(xiàn)優(yōu)雅停機的正確方法

    什么叫優(yōu)雅停機?就是向應(yīng)用進程發(fā)出停止指令之后,能保證正在執(zhí)行的業(yè)務(wù)操作不受影響,直到操作運行完畢之后再停止服務(wù)。本文就來和大家聊聊SpringBoot實現(xiàn)優(yōu)雅停機的正確姿勢,希望對大家有所幫助
    2023-01-01
  • mybatis plus開發(fā)過程中遇到的問題記錄及解決

    mybatis plus開發(fā)過程中遇到的問題記錄及解決

    這篇文章主要介紹了mybatis plus開發(fā)過程中遇到的問題記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論