最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java面試最容易被刷的重難點(diǎn)之鎖的使用策略

 更新時(shí)間:2021年10月18日 09:17:57   作者:春風(fēng)~十一載  
鎖像synchronized同步塊一樣,是一種線程同步機(jī)制,但比Java中的synchronized同步塊更復(fù)雜。因?yàn)殒i(以及其它更高級(jí)的線程同步機(jī)制)是由synchronized同步塊的方式實(shí)現(xiàn)的,所以我們還不能完全擺脫synchronized關(guān)鍵字

在多線程的學(xué)習(xí)中,很多時(shí)候都要用到鎖,但我們都知道,加鎖這個(gè)操作是一個(gè)計(jì)算機(jī)中開(kāi)銷比較大的操作,因此,本篇文章我會(huì)帶大家學(xué)習(xí)在不同場(chǎng)景中進(jìn)行不同的加鎖處理方式,以讓程序更高效一些有關(guān)鎖策略不僅僅局限于某一種語(yǔ)言,在很多語(yǔ)言中都可能會(huì)遇到加鎖操作,而且這部分知識(shí)點(diǎn)也是面試中常見(jiàn)的問(wèn)題,所以本篇文章內(nèi)容基本都是需要大家自己認(rèn)真理解并做到會(huì)用自己的語(yǔ)言組織起來(lái)的。內(nèi)容均為博主認(rèn)真總結(jié),大家可以收藏起來(lái)慢慢學(xué)習(xí),希望可以幫到大家哦!

在這里插入圖片描述

一. 樂(lè)觀鎖和悲觀鎖

1. 字面理解

樂(lè)觀鎖認(rèn)為多個(gè)線程訪問(wèn)同一個(gè)共享數(shù)據(jù)時(shí)產(chǎn)生并發(fā)沖突的概率不大,并不會(huì)真的加鎖, 而是直接嘗試訪問(wèn)數(shù)據(jù), 在訪問(wèn)的同時(shí)識(shí)別當(dāng)前的數(shù)據(jù)是否出現(xiàn)訪問(wèn)沖突,若沖突,則會(huì)返回當(dāng)前的錯(cuò)誤信息讓用戶去決定如何去處理悲觀鎖會(huì)認(rèn)為多個(gè)線程訪問(wèn)同一個(gè)共享數(shù)據(jù)時(shí)產(chǎn)生并發(fā)沖突的概率很大,因此往往會(huì)在取數(shù)據(jù)時(shí)會(huì)進(jìn)行加鎖操作,這樣的話其他線程想要拿到這個(gè)數(shù)據(jù)時(shí)就會(huì)阻塞等到直到其他線程獲取到鎖

補(bǔ)充:在Java中synchronized這一加鎖操作主要以悲觀鎖為主,初始使用樂(lè)觀鎖策略,但當(dāng)發(fā)現(xiàn)鎖競(jìng)爭(zhēng)比較頻繁的時(shí)候,就會(huì)自動(dòng)切換成悲觀鎖策略

2. 生活實(shí)例

在生活中有很多情況都能涉及到樂(lè)觀和悲觀的心態(tài),比如今天是陰天,A認(rèn)為可能會(huì)下雨,會(huì)提前帶好傘,這就對(duì)應(yīng)到了悲觀鎖這一策略;而B(niǎo)比較樂(lè)觀,不會(huì)認(rèn)為會(huì)下雨,因此B不會(huì)帶傘,這顯然可以類比為樂(lè)觀鎖這一策略。

在這里插入圖片描述

3. 基于版本號(hào)方式實(shí)現(xiàn)樂(lè)觀鎖

實(shí)現(xiàn)樂(lè)觀鎖策略這一功能的方式有很多,接下來(lái)我?guī)Т蠹胰W(xué)習(xí)一種:基于版本號(hào)方式。
假設(shè)我們要使用多線程修改用戶的賬戶余額,我們可以引入一個(gè)版本號(hào)來(lái)實(shí)現(xiàn),具體方法如下:

設(shè)當(dāng)前的余額為100,引入一個(gè)版本號(hào)version,將其初始值設(shè)為1,并且我們規(guī)定,提交版本必須大于數(shù)據(jù)庫(kù)中記錄的當(dāng)前版本號(hào)才能執(zhí)行更新余額的操作,若不滿足此條件,則認(rèn)為修改失敗

圖示
以線程1想把主內(nèi)存中的數(shù)據(jù)減50,線程2把主內(nèi)存中的數(shù)據(jù)減20為例:

在這里插入圖片描述

線程1此時(shí)準(zhǔn)備將主內(nèi)存中的數(shù)據(jù)讀入自己的工作內(nèi)存中并修改,而線程2也想將主內(nèi)存的數(shù)據(jù)讀入自己的工作內(nèi)存中并修改,此時(shí)線程1和線程2以及主內(nèi)存中的版本號(hào)都為1

當(dāng)線程1把主內(nèi)存的數(shù)據(jù)減50后,即修改后,會(huì)將自己工作內(nèi)存中的版本號(hào)加1,此時(shí)線程1工作內(nèi)存中的版本號(hào)大于主內(nèi)存中的版本號(hào)(2大于1),因此線程1成功修改了主內(nèi)存中的數(shù)據(jù),并將數(shù)據(jù)50寫(xiě)入主內(nèi)存中,最后將主內(nèi)存中的版本號(hào)加1(即為2)

在這里插入圖片描述

此時(shí)線程2修改了自己工作內(nèi)存中的數(shù)據(jù),隨后將自己的工作內(nèi)存版本號(hào)改為2:

在這里插入圖片描述

但正當(dāng)線程2準(zhǔn)備將其改好后的數(shù)據(jù)80寫(xiě)入主內(nèi)存時(shí),發(fā)現(xiàn)自己的版本號(hào)和主內(nèi)存的版本號(hào)都一樣,并不滿足大于關(guān)系,因此此次修改失敗,有效避免了多線程并發(fā)修改數(shù)據(jù)時(shí)引起的數(shù)據(jù)安全問(wèn)題。
總結(jié)

基于版本號(hào)這樣實(shí)現(xiàn)樂(lè)觀鎖的機(jī)制就是一種典型的實(shí)現(xiàn)方式,這個(gè)實(shí)現(xiàn)方式和之前所學(xué)過(guò)的單純的互斥的加鎖方式來(lái)說(shuō)更加輕量一些(只修改版本號(hào),只是在計(jì)算機(jī)中用戶態(tài)上進(jìn)行操作,而互斥加鎖方式會(huì)涉及到用戶態(tài)和內(nèi)核態(tài)之間的切換,不僅效率不太高,也容易引起線程阻塞)對(duì)于這個(gè)機(jī)制來(lái)說(shuō),如果修改數(shù)據(jù)失敗,就會(huì)涉及到重試操作,如果頻繁重試的話那么效率也就不高了,因此,最好在線程并發(fā)沖突率比較低的場(chǎng)景下使用樂(lè)觀鎖這一方式比較好

二. 讀寫(xiě)鎖

1. 理解

在這里插入圖片描述

我們都知道,當(dāng)我們通過(guò)多線程方式嘗試修改同一數(shù)據(jù)時(shí),一般都可能引發(fā)線程安全問(wèn)題,但當(dāng)我們通過(guò)多線程方式嘗試讀取同一數(shù)據(jù)時(shí),一般不會(huì)引發(fā)線程安全問(wèn)題,因此,我們可以根據(jù)讀和寫(xiě)的不同場(chǎng)景來(lái)給讀和寫(xiě)操作分別加上不同的鎖。
Java當(dāng)中的synchronized不會(huì)對(duì)讀和寫(xiě)進(jìn)行區(qū)分,默認(rèn)使用后線程都是互斥的

2. 用法

以Java為例,在標(biāo)準(zhǔn)庫(kù)中存在這樣一個(gè)類ReentrantReadWriteLock
源代碼如下

public class ReentrantReadWriteLock
        implements ReadWriteLock, java.io.Serializable {
    private static final long serialVersionUID = -6992448646407690164L;
    /** Inner class providing readlock */
    private final ReentrantReadWriteLock.ReadLock readerLock;
    /** Inner class providing writelock */
    private final ReentrantReadWriteLock.WriteLock writerLock;
    /** Performs all synchronization mechanics */
    final Sync sync;

    /**
     * Creates a new {@code ReentrantReadWriteLock} with
     * default (nonfair) ordering properties.
     */
    public ReentrantReadWriteLock() {
        this(false);
    }

該類中提供了兩個(gè)方法:

    public ReentrantReadWriteLock.WriteLock writeLock() { return writerLock; }

此方法可以創(chuàng)建出一個(gè)讀鎖實(shí)例

public ReentrantReadWriteLock.ReadLock  readLock()  { return readerLock; }

此方法可以創(chuàng)建出一個(gè)寫(xiě)鎖實(shí)例
某個(gè)線程被讀鎖修飾后,這兩個(gè)線程之間不會(huì)互斥,而是完全同時(shí)并發(fā)執(zhí)行,一般將讀鎖用于線程讀取數(shù)據(jù)比較多的場(chǎng)景;而當(dāng)某個(gè)線程被寫(xiě)鎖修飾后,這兩個(gè)線程會(huì)互斥,一個(gè)線程會(huì)執(zhí)行,而另一個(gè)線程會(huì)阻塞等待,因此必須是一個(gè)線程執(zhí)行完了,另一個(gè)線程才會(huì)執(zhí)行,一般用于修改數(shù)據(jù)比較多的場(chǎng)景

三. 重量級(jí)鎖和輕量級(jí)鎖

1. 原理

鎖的核心特性 “原子性”,這樣的機(jī)制追根溯源是 CPU 這樣的硬件設(shè)備提供的

1.CPU 提供了 “原子操作指令”。
2. 操作系統(tǒng)基于 CPU 的原子指令,實(shí)現(xiàn)了 mutex 互斥鎖.
3. JVM 基于操作系統(tǒng)提供的互斥鎖。實(shí)現(xiàn)了 synchronized 和 ReentrantLock 等關(guān)鍵字和類。

在這里插入圖片描述

注意:synchronized 并不僅僅是對(duì) mutex 進(jìn)行封裝, 在 synchronized 內(nèi)部還做了很多其他的工作

2. 理解

1.重量級(jí)鎖依賴了OS提供的mutex,的開(kāi)銷一般很大,往往是通過(guò)內(nèi)核來(lái)完成的
2.輕量級(jí)加鎖一般不使用mutex,開(kāi)銷一般比較小,一般通過(guò)用戶態(tài)就能直接完成

3. 區(qū)分用戶態(tài)和內(nèi)核態(tài)

我們可以類比一個(gè)生活中的例子,當(dāng)去銀行辦理業(yè)務(wù)時(shí),如果是通過(guò)用戶在銀行工作人員的指導(dǎo)下自己在窗口外完成,那么效率會(huì)比較高,就像計(jì)算機(jī)中的用戶態(tài)一樣。而當(dāng)我們把自己的業(yè)務(wù)交給銀行相關(guān)人員去完成時(shí),由于銀行工作人員的閑忙時(shí)間是不可控的,因此無(wú)法保證效率,就好比計(jì)算機(jī)中的內(nèi)核態(tài)。

四. 自旋鎖

1. 理解

當(dāng)兩個(gè)線程為了完成任務(wù)同時(shí)競(jìng)爭(zhēng)一把鎖時(shí), 拿到鎖的那個(gè)線程會(huì)立馬執(zhí)行任務(wù),而沒(méi)拿到就會(huì)阻塞等待,當(dāng)一個(gè)線程把鎖釋放后,另一個(gè)線程不會(huì)被立即喚醒,而是等操作系統(tǒng)將其進(jìn)行一系列的調(diào)度到CPU中的操作才能被喚醒然后執(zhí)行任務(wù),這種鎖叫做掛起等待鎖,線程在搶鎖失敗后進(jìn)入阻塞狀態(tài),放棄 CPU,需要過(guò)很久才能再次被調(diào)度。但實(shí)際上,大部分情況下,雖然當(dāng)前搶鎖失敗,但過(guò)不了很久,鎖就會(huì)被釋放,所以沒(méi)必要就放棄 CPU。這個(gè)時(shí)候就可以使用自旋鎖來(lái)處理這樣的問(wèn)題。

2. 實(shí)現(xiàn)方式

自旋鎖的偽代碼為:while (搶鎖(lock) == 失敗) {}

如果獲取鎖失敗,就會(huì)立即再嘗試獲取鎖,無(wú)限循環(huán),直到獲取到鎖為止。第一次獲取鎖失敗, 第二次的嘗試會(huì)在非常短的時(shí)間內(nèi)到來(lái),一旦鎖被其他線程釋放, 就能第一時(shí)間獲取到鎖

3. 優(yōu)缺點(diǎn)

自旋鎖是一種典型的輕量級(jí)鎖的實(shí)現(xiàn)方式,它沒(méi)有放棄 CPU, 不涉及線程阻塞和調(diào)度,一旦鎖被釋放,就能第一時(shí)間獲取到鎖,這樣會(huì)大大提高代碼的執(zhí)行效率,但如果鎖被其他線程持有的時(shí)間比較久, 那么就會(huì)持續(xù)地消耗 CPU 資源。(而掛起等待的時(shí)候是不消耗 CPU 的)
因此,我們應(yīng)該注意自旋鎖的適用場(chǎng)合:

  • 如果多個(gè)線程執(zhí)行任務(wù)時(shí)鎖的沖突比較低,或者線程持有鎖的時(shí)間比較短,此時(shí)使用自旋鎖比較合適
  • 如果某個(gè)線程任務(wù)對(duì)CPU比較敏感,且不希望吃太多CPU資源,那么此時(shí)就不太適合使用自旋鎖。

注意:synchronized自身已經(jīng)設(shè)置好了自旋鎖和掛起等待鎖,會(huì)根據(jù)不同的情況自動(dòng)選擇最優(yōu)的使用方案

五. 公平鎖和非公平鎖

1. 理解

若有三個(gè)線程 A,B,C。
A先嘗試獲取鎖,獲取成功了,因?yàn)橹挥幸话焰i,所以B和C線程都會(huì)阻塞等待,那么如果A用完了鎖后,B和C線程哪一個(gè)會(huì)最先獲取到鎖呢?

  • 公平鎖:遵守先來(lái)后到原則,因?yàn)锽線程比C線程來(lái)的早一點(diǎn),所以B線程先獲取到鎖
  • 非公平鎖:沒(méi)有先來(lái)后到原則,B和C線程獲取到鎖的概率是隨機(jī)的

2. 注意事項(xiàng)

操作系統(tǒng)內(nèi)部的線程調(diào)度就可以視為是隨機(jī)的,如果不做任何額外的限制,鎖就是非公平鎖。如果要想實(shí)現(xiàn)公平鎖,就需要依賴額外的數(shù)據(jù)結(jié)構(gòu)(比如隊(duì)列) 來(lái)記錄線程們的先后順序。公平鎖和非公平鎖沒(méi)有好壞之分, 關(guān)鍵還是看適用場(chǎng)景(大部分情況下非公平鎖就夠用了,但當(dāng)我們希望線程的調(diào)度時(shí)間成本是可控的,那么此時(shí)就需要用到公平鎖了)

注意:synchronized為非公平鎖

六. 可重入鎖和不可重入鎖

1. 為什么要引入這兩把鎖

(1)實(shí)例一

在介紹可重入鎖和不可重入鎖之前,大家先來(lái)思考一個(gè)問(wèn)題,為什么Java中的main函數(shù)要用static來(lái)修飾?

public class Test {
    public static void main(String[] args) {
        
    }
}

試想以下,如果main函數(shù)不是static來(lái)修飾的話:

public class Test {
    public void main(String[] args) {
        Test a=new Test();
        a.main();
    }
}

那么此時(shí)這段代碼能否被執(zhí)行呢?答案是不能,因?yàn)樵趈ava中,沒(méi)有static的變量或函數(shù),如果想被調(diào)用的話,是要先新建一個(gè)對(duì)象才可以。而main函數(shù)作為程序的入口,需要在其它函數(shù)實(shí)例化之前就啟動(dòng),這也就是為什么要加一個(gè)static。main函數(shù)好比一個(gè)門(mén),要探索其它函數(shù)要先從門(mén)進(jìn)入程序。static提供了這樣一個(gè)特性,無(wú)需建立對(duì)象,就可以啟動(dòng)。也可以利用反證法說(shuō)明,如果不是static修飾的,若不是靜態(tài)的,main函數(shù)調(diào)用的時(shí)候需要new對(duì)象,new完對(duì)象才能調(diào)用main函數(shù)。那么你既想進(jìn)入到main函數(shù)new對(duì)象,又想new完對(duì)象來(lái)調(diào)用main函數(shù),那么就不行了,相當(dāng)于自己把自己鎖在里面出不來(lái)了

(2)實(shí)例二

另外一個(gè)Java當(dāng)中的例子:

 synchronized void func1(){
        func2();
    }
    synchronized void func2(){
        
    }

我們對(duì)func1這個(gè)方法進(jìn)行加鎖時(shí),是可以成功的,但當(dāng)我們對(duì)func2這個(gè)方法再次加鎖后,就比較危險(xiǎn)了。因?yàn)橐獔?zhí)行完func1這個(gè)方法,就必須執(zhí)行完func2,而此時(shí)鎖已經(jīng)被func1這個(gè)方法占用了,func2獲取不到鎖,所以func2就會(huì)一直阻塞等待,去等f(wàn)unc1釋放鎖,但func1一直執(zhí)行不完成,所以鎖永遠(yuǎn)不會(huì)釋放,func2永遠(yuǎn)也獲取不到鎖,這樣就形成了一個(gè)閉環(huán),相當(dāng)于自己把自己鎖在里面出不來(lái)了,此時(shí)這個(gè)線程就會(huì)崩潰,是比較危險(xiǎn)的

2. 實(shí)現(xiàn)方案

了解了上面兩個(gè)實(shí)例的嚴(yán)重性后,我們引入了可重入鎖這個(gè)機(jī)制,當(dāng)我們形成死鎖后,如果是可重入鎖的話,它不會(huì)讓線程阻塞等待最終死鎖從而奔潰,而是運(yùn)用計(jì)數(shù)器的方法,去記錄當(dāng)前某個(gè)線程針對(duì)某把鎖嘗試加了幾次,每加一次鎖計(jì)數(shù)都會(huì)加1,每次解鎖計(jì)數(shù)都會(huì)減1,這樣當(dāng)計(jì)數(shù)器里面的計(jì)數(shù)完全為0的時(shí)候才會(huì)真正釋放鎖,正是因?yàn)橛辛诉@樣的機(jī)制,才有效避免了死鎖問(wèn)題。而在Java中,synchronized就是一把可重入鎖,它給我們提供了很大的方便,保證在我們即使造成死鎖問(wèn)題時(shí),程序也不至于崩潰。

七. 面試題

第一題

如何理解樂(lè)觀鎖和悲觀鎖,具體實(shí)現(xiàn)方式如何 如何理解?

見(jiàn)樂(lè)觀鎖和悲觀鎖字面理解部分(嘗試用自己的語(yǔ)言組織)實(shí)現(xiàn)方式:
(1)樂(lè)觀鎖:見(jiàn)基于版本號(hào)方式實(shí)現(xiàn)樂(lè)觀鎖部分
(2)悲觀鎖:多個(gè)線程訪問(wèn)同一個(gè)共享數(shù)據(jù)時(shí)產(chǎn)生并發(fā)沖突時(shí),會(huì)在取數(shù)據(jù)時(shí)會(huì)進(jìn)行加鎖操作,這樣的話其他線程想要拿到這個(gè)數(shù)據(jù)時(shí)就會(huì)阻塞等到直到其他線程獲取到鎖

第二題

簡(jiǎn)單介紹一下讀寫(xiě)鎖

讀寫(xiě)鎖實(shí)際是一種特殊的自旋鎖,它能把同一塊共享數(shù)據(jù)的訪問(wèn)者分為讀者和寫(xiě)者,讀寫(xiě)鎖會(huì)把讀操作和寫(xiě)操作分別進(jìn)行加鎖,且讀鎖和讀鎖之間的線程不會(huì)發(fā)生互斥,寫(xiě)鎖和寫(xiě)鎖之間以及讀鎖和寫(xiě)鎖之間的線程會(huì)發(fā)生互斥。讀鎖適用于線程讀取數(shù)據(jù)比較多的場(chǎng)景,而寫(xiě)鎖適用于線程修改數(shù)據(jù)比較多的場(chǎng)景。

第三題

簡(jiǎn)單介紹一下自旋鎖

  • 理解:當(dāng)兩個(gè)線程為了完成任務(wù)同時(shí)競(jìng)爭(zhēng)一把鎖時(shí), 拿到鎖的那個(gè)線程會(huì)立馬執(zhí)行任務(wù),而沒(méi)拿到鎖的線程就會(huì)立即再嘗試獲取鎖,無(wú)限循環(huán),直到獲取到鎖為止,這樣的鎖就叫自旋鎖
  • 優(yōu)點(diǎn)和缺點(diǎn):見(jiàn)自旋鎖優(yōu)缺點(diǎn)部分

第四題

簡(jiǎn)單介紹一下Java中synchronized充當(dāng)了哪些鎖

  • 主要以悲觀鎖為主,初始使用樂(lè)觀鎖策略,但當(dāng)發(fā)現(xiàn)鎖競(jìng)爭(zhēng)比較頻繁的時(shí)候,就會(huì)自動(dòng)切換成悲觀鎖策略
  • 并不區(qū)分讀寫(xiě)鎖
  • synchronized自身已經(jīng)設(shè)置好了自旋鎖和掛起等待鎖,會(huì)根據(jù)不同的情況自動(dòng)選擇最優(yōu)的使用方案
  • synchronized是一把非公平鎖
  • synchronized就是一把可重入鎖

到此這篇關(guān)于Java面試最容易被刷的重難點(diǎn)之鎖的使用策略的文章就介紹到這了,更多相關(guān)Java 鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java執(zhí)行JS腳本工具

    Java執(zhí)行JS腳本工具

    今天小編就為大家分享一篇關(guān)于Java執(zhí)行JS腳本工具,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java判斷文件或者文件夾是否存在的功能(不存在創(chuàng)建,存在刪除)

    Java判斷文件或者文件夾是否存在的功能(不存在創(chuàng)建,存在刪除)

    在Java中,要判斷文件或文件夾是否存在,并根據(jù)判斷結(jié)果來(lái)執(zhí)行創(chuàng)建或刪除操作,你可以使用java.io.File類或者java.nio.file包中的類,本文介紹Java判斷文件或者文件夾是否存在,不存在創(chuàng)建,存在刪除,感興趣的朋友一起看看吧
    2025-03-03
  • Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式

    Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式

    這篇文章主要介紹了Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • IDEA2020導(dǎo)入非maven項(xiàng)目并部署tomcat的方法

    IDEA2020導(dǎo)入非maven項(xiàng)目并部署tomcat的方法

    這篇文章主要介紹了IDEA 2020 導(dǎo)入非maven項(xiàng)目并部署tomcat的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • JAVA異常和自定義異常處理方式

    JAVA異常和自定義異常處理方式

    這篇文章主要介紹了JAVA異常和自定義異常處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring spel表達(dá)式使用方法示例

    Spring spel表達(dá)式使用方法示例

    這篇文章主要介紹了Spring spel表達(dá)式使用方法示例,通過(guò)一些實(shí)例向大家展示了spel表達(dá)式的用法,需要的朋友可以了解下。
    2017-09-09
  • java反射實(shí)現(xiàn)javabean轉(zhuǎn)json實(shí)例代碼

    java反射實(shí)現(xiàn)javabean轉(zhuǎn)json實(shí)例代碼

    基于java反射機(jī)制實(shí)現(xiàn)javabean轉(zhuǎn)json字符串實(shí)例,大家參考使用吧
    2013-12-12
  • 利用Spring Session和redis對(duì)Session進(jìn)行共享詳解

    利用Spring Session和redis對(duì)Session進(jìn)行共享詳解

    這篇文章主要給大家介紹了關(guān)于利用Spring、Session和redis對(duì)Session進(jìn)行共享的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)

    簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)

    這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn),包括網(wǎng)絡(luò)編程發(fā)送和接受數(shù)據(jù)的一些基礎(chǔ)知識(shí)整理,需要的朋友可以參考下
    2016-01-01
  • Idea中指定xml文件失效的解決過(guò)程

    Idea中指定xml文件失效的解決過(guò)程

    最近在開(kāi)發(fā)的過(guò)程中遇到了一個(gè)奇怪的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Idea中指定xml文件失效的解決過(guò)程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論

乌海市| 封丘县| 宜春市| 舞钢市| 蓬溪县| 安岳县| 康定县| 青河县| 广丰县| 西昌市| 陇川县| 广河县| 土默特右旗| 乡城县| 铜山县| 达尔| 兴安县| 稷山县| 康保县| 富宁县| 扶沟县| 临湘市| 昭平县| 中方县| 叙永县| 宁城县| 华蓥市| 余干县| 县级市| 资源县| 同德县| 祁阳县| 攀枝花市| 乃东县| 太仆寺旗| 大港区| 汤原县| 桐梓县| 共和县| 吐鲁番市| 凌源市|