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

Java 同步關(guān)鍵字 synchronized用法 、場(chǎng)景及避坑指南

 更新時(shí)間:2025年12月22日 12:02:27   作者:heartbeat..  
synchronized 是 Java 最基礎(chǔ)、最常用的線程同步方式,優(yōu)點(diǎn)是 簡(jiǎn)單易用、無(wú)需手動(dòng)釋放鎖、JVM 自動(dòng)優(yōu)化,適合解決大多數(shù)線程安全問(wèn)題,本文給大家介紹Java 同步關(guān)鍵字 synchronized用法 + 場(chǎng)景 + 避坑指南,感興趣的朋友跟隨小編一起看看吧

Java 同步關(guān)鍵字 synchronized:用法 + 場(chǎng)景 + 避坑指南

一、介紹

在 Java 中,synchronized內(nèi)置的線程同步機(jī)制,用于解決多線程并發(fā)訪問(wèn)共享資源時(shí)的線程安全問(wèn)題(如競(jìng)態(tài)條件、數(shù)據(jù)不一致)。其核心原理是 通過(guò) “鎖” 控制多個(gè)線程對(duì)共享資源的互斥訪問(wèn),確保同一時(shí)刻只有一個(gè)線程能執(zhí)行臨界區(qū)代碼。

二、主要特點(diǎn)

  1. 互斥性:同一時(shí)刻,只有一個(gè)線程能持有鎖并執(zhí)行臨界區(qū)代碼(其他線程需阻塞等待鎖釋放)。
  2. 可見(jiàn)性:鎖釋放時(shí),線程對(duì)共享變量的修改會(huì)被 “刷新” 到主內(nèi)存;其他線程獲取鎖時(shí),會(huì)從主內(nèi)存重新讀取變量(避免緩存一致性問(wèn)題)。
  3. 有序性:禁止指令重排序(臨界區(qū)代碼在多線程視角下按順序執(zhí)行)。

舉個(gè)例子:

synchronized 就像一個(gè) “共享資源的專屬門(mén)衛(wèi)”

  • 它守著一個(gè) “資源入口”(臨界區(qū));
  • 每個(gè)想用資源的 “線程”,都得先跟門(mén)衛(wèi)要 “通行證”(獲取鎖);
  • 門(mén)衛(wèi)只給一個(gè)人發(fā)通行證,其他人只能在門(mén)口排隊(duì)(阻塞);
  • 拿到通行證的人用完資源后,必須把通行證還給門(mén)衛(wèi)(釋放鎖),下一個(gè)排隊(duì)的人才能拿到;
  • 門(mén)衛(wèi)還認(rèn)人(可重入性):同一個(gè)人再要通行證,直接給,不用排隊(duì);
  • 門(mén)衛(wèi)還能靈活守 “小門(mén)”(代碼塊)或 “大門(mén)”(整個(gè)方法):守小門(mén)效率高,守大門(mén)簡(jiǎn)單但容易堵。

synchronized 的核心作用 ——讓多線程 “排隊(duì)使用共享資源”,避免混亂和沖突。

三、使用場(chǎng)景(3 種形式)

synchronized 可修飾 方法代碼塊,本質(zhì)是對(duì) “鎖對(duì)象” 加鎖,鎖的粒度決定同步范圍。

1. 修飾實(shí)例方法(對(duì)象鎖)

  • 鎖對(duì)象:當(dāng)前 實(shí)例對(duì)象(this)。
  • 效果:同一實(shí)例的多個(gè)線程,競(jìng)爭(zhēng)同一把鎖;不同實(shí)例的線程互不影響(各自持有自己的鎖)。
public class SynchronizedDemo {
    // 實(shí)例方法加鎖:鎖是當(dāng)前對(duì)象(this)
    public synchronized void instanceMethod() {
        // 臨界區(qū):共享資源操作(如修改實(shí)例變量)
        System.out.println(Thread.currentThread().getName() + " 執(zhí)行實(shí)例方法");
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
    }
    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();
        // 兩個(gè)線程競(jìng)爭(zhēng) demo 實(shí)例的鎖,串行執(zhí)行
        new Thread(demo::instanceMethod, "線程1").start();
        new Thread(demo::instanceMethod, "線程2").start(); // 等待線程1釋放鎖
    }
}

2. 修飾靜態(tài)方法(類鎖)

  • 鎖對(duì)象:當(dāng)前類的 Class 對(duì)象(類的唯一全局鎖)
  • 效果:所有該類的實(shí)例(無(wú)論多少個(gè)對(duì)象)共享同一把鎖,多線程競(jìng)爭(zhēng)類鎖時(shí)串行執(zhí)行。
public class SynchronizedDemo {
    // 靜態(tài)方法加鎖:鎖是 SynchronizedDemo.class
    public static synchronized void staticMethod() {
        System.out.println(Thread.currentThread().getName() + " 執(zhí)行靜態(tài)方法");
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
    }
    public static void main(String[] args) {
        SynchronizedDemo demo1 = new SynchronizedDemo();
        SynchronizedDemo demo2 = new SynchronizedDemo();
        // 兩個(gè)線程競(jìng)爭(zhēng)同一把類鎖(SynchronizedDemo.class),串行執(zhí)行
        new Thread(demo1::staticMethod, "線程A").start();
        new Thread(demo2::staticMethod, "線程B").start(); // 等待線程A釋放鎖
    }
}

3. 修飾代碼塊(顯式指定鎖對(duì)象)

  • 鎖對(duì)象:可自定義(任意 非 null 對(duì)象,如 this、Class 對(duì)象、自定義對(duì)象)。
  • 效果:僅對(duì)代碼塊內(nèi)的邏輯加鎖,粒度更細(xì)(推薦,減少鎖競(jìng)爭(zhēng)開(kāi)銷)。
public class SynchronizedDemo {
    private final Object lock = new Object(); // 自定義鎖對(duì)象(推薦用 final,避免鎖對(duì)象被修改)
    private int count = 0;
    public void syncBlock() {
        // 1. 自定義對(duì)象鎖:鎖定 lock 對(duì)象
        synchronized (lock) {
            count++;
            System.out.println(Thread.currentThread().getName() + ":count=" + count);
        }
        // 2. 實(shí)例鎖(等價(jià)于修飾實(shí)例方法)
        synchronized (this) {
            // 臨界區(qū)邏輯
        }
        // 3. 類鎖(等價(jià)于修飾靜態(tài)方法)
        synchronized (SynchronizedDemo.class) {
            // 臨界區(qū)邏輯
        }
    }
    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();
        // 多線程競(jìng)爭(zhēng) lock 對(duì)象,count 自增線程安全
        for (int i = 0; i < 3; i++) {
            new Thread(demo::syncBlock, "線程" + i).start();
        }
    }
}

舉個(gè)示例:

假設(shè)某電商平臺(tái)有一款爆款商品,庫(kù)存僅剩 10 件。同時(shí)有 100 個(gè)用戶搶購(gòu)(每個(gè)用戶對(duì)應(yīng)一個(gè)線程),每個(gè)用戶搶購(gòu) 1 件商品。要求:

  1. 庫(kù)存不能為負(fù)數(shù);
  2. 最終賣出的商品數(shù)量 = 初始庫(kù)存(不能多賣,也不能少賣)。

如果不加 synchronized,會(huì)出現(xiàn) “超賣”(比如庫(kù)存 10,但賣出 12 件);加了 synchronized 后,能保證線程安全,精準(zhǔn)扣減庫(kù)存。

不加synchronized(線程不安全,會(huì)超賣)

public class StockDemo {
    // 商品初始庫(kù)存:10件
    private int stock = 10;
    // 搶購(gòu)方法(未加鎖)
    public void buy() {
        // 1. 檢查庫(kù)存是否充足
        if (stock > 0) {
            // 模擬網(wǎng)絡(luò)延遲(放大線程安全問(wèn)題)
            try { Thread.sleep(10); } catch (InterruptedException e) {}
            // 2. 庫(kù)存扣減
            stock--;
            // 3. 打印搶購(gòu)結(jié)果
            System.out.println(Thread.currentThread().getName() + " 搶購(gòu)成功!剩余庫(kù)存:" + stock);
        } else {
            System.out.println(Thread.currentThread().getName() + " 搶購(gòu)失??!庫(kù)存不足");
        }
    }
    public static void main(String[] args) {
        StockDemo stock = new StockDemo();
        // 100個(gè)用戶同時(shí)搶購(gòu)(100個(gè)線程)
        for (int i = 0; i < 100; i++) {
            new Thread(stock::buy, "用戶" + (i + 1)).start();
        }
    }
}

結(jié)果:

用戶1 搶購(gòu)成功!剩余庫(kù)存:9
用戶2 搶購(gòu)成功!剩余庫(kù)存:8
...
用戶10 搶購(gòu)成功!剩余庫(kù)存:0
用戶11 搶購(gòu)成功!剩余庫(kù)存:-1  // 超賣了!庫(kù)存為負(fù)數(shù)
用戶12 搶購(gòu)成功!剩余庫(kù)存:-2  // 繼續(xù)超賣

問(wèn)題原因:多個(gè)線程同時(shí)進(jìn)入 if (stock > 0) 判斷(比如庫(kù)存還剩 1 時(shí),5 個(gè)線程同時(shí)通過(guò)判斷),之后都執(zhí)行 stock--,導(dǎo)致庫(kù)存被多次扣減,出現(xiàn)負(fù)數(shù)。

加synchronized(線程安全,無(wú)超賣)

buy() 方法加 synchronized,或給 “庫(kù)存檢查 + 扣減” 的臨界區(qū)加鎖,保證同一時(shí)刻只有一個(gè)線程能執(zhí)行核心邏輯:

public class StockDemo {
    private int stock = 10;
    // 方案1:修飾實(shí)例方法(鎖對(duì)象是當(dāng)前 StockDemo 實(shí)例)
    public synchronized void buy() {
        if (stock > 0) {
            try { Thread.sleep(10); } catch (InterruptedException e) {}
            stock--;
            System.out.println(Thread.currentThread().getName() + " 搶購(gòu)成功!剩余庫(kù)存:" + stock);
        } else {
            System.out.println(Thread.currentThread().getName() + " 搶購(gòu)失??!庫(kù)存不足");
        }
    }
    // 方案2:修飾代碼塊(鎖對(duì)象自定義,粒度更細(xì),推薦)
    /*
    public void buy() {
        synchronized (this) {  // 鎖當(dāng)前實(shí)例,也可以用自定義鎖對(duì)象(如 private final Object lock = new Object();)
            if (stock > 0) {
                try { Thread.sleep(10); } catch (InterruptedException e) {}
                stock--;
                System.out.println(Thread.currentThread().getName() + " 搶購(gòu)成功!剩余庫(kù)存:" + stock);
            } else {
                System.out.println(Thread.currentThread().getName() + " 搶購(gòu)失??!庫(kù)存不足");
            }
        }
    }
    */
    public static void main(String[] args) {
        StockDemo stock = new StockDemo();
        // 100個(gè)用戶同時(shí)搶購(gòu)
        for (int i = 0; i < 100; i++) {
            new Thread(stock::buy, "用戶" + (i + 1)).start();
        }
    }
}

結(jié)果:

用戶1 搶購(gòu)成功!剩余庫(kù)存:9
用戶2 搶購(gòu)成功!剩余庫(kù)存:8
...
用戶10 搶購(gòu)成功!剩余庫(kù)存:0
用戶11 搶購(gòu)失?。?kù)存不足
用戶12 搶購(gòu)失?。?kù)存不足
...
用戶100 搶購(gòu)失?。?kù)存不足

擴(kuò)展:如果是多實(shí)例場(chǎng)景?

如果電商平臺(tái)部署了多個(gè)服務(wù)實(shí)例(每個(gè)實(shí)例都是一個(gè) StockDemo 對(duì)象),此時(shí) synchronized(對(duì)象鎖 / 類鎖)只能保證 “單個(gè)實(shí)例內(nèi)的線程安全”,無(wú)法跨實(shí)例同步(比如實(shí)例 1 的庫(kù)存 10,實(shí)例 2 的庫(kù)存 10,可能導(dǎo)致總超賣 20 件)。

這種情況需要 分布式鎖(如 Redis 分布式鎖、ZooKeeper 分布式鎖),本質(zhì)是把 “鎖” 放到多個(gè)實(shí)例都能訪問(wèn)的公共地方(如 Redis),實(shí)現(xiàn)跨實(shí)例的互斥。

但單實(shí)例內(nèi)的并發(fā)安全,synchronized 完全能搞定,且簡(jiǎn)單高效。

四、鎖的實(shí)現(xiàn)原理(JVM 層面)

synchronized 早期基于 重量級(jí)鎖(依賴操作系統(tǒng)內(nèi)核的互斥量 mutex,切換成本高),JDK 6 后引入 鎖優(yōu)化(偏向鎖、輕量級(jí)鎖、重量級(jí)鎖),通過(guò) 對(duì)象頭(Mark Word) 存儲(chǔ)鎖狀態(tài):

1. 對(duì)象頭(Mark Word)結(jié)構(gòu)

Java 對(duì)象在內(nèi)存中分為 3 部分:對(duì)象頭、實(shí)例數(shù)據(jù)、對(duì)齊填充。其中 Mark Word 是實(shí)現(xiàn)鎖的核心,存儲(chǔ)內(nèi)容隨鎖狀態(tài)變化:

鎖狀態(tài)Mark Word 存儲(chǔ)內(nèi)容
無(wú)鎖對(duì)象哈希碼、GC 分代年齡、是否偏向鎖(0)
偏向鎖偏向線程 ID、GC 分代年齡、是否偏向鎖(1)
輕量級(jí)鎖指向線程棧中鎖記錄(Lock Record)的指針
重量級(jí)鎖指向 JVM 中監(jiān)視器鎖(Monitor)的指針

2. 鎖升級(jí)流程(從低開(kāi)銷到高開(kāi)銷)

JVM 按 “競(jìng)爭(zhēng)程度” 動(dòng)態(tài)升級(jí)鎖,避免不必要的性能損耗:

  1. 偏向鎖:?jiǎn)尉€程場(chǎng)景下,線程獲取鎖后,Mark Word 記錄線程 ID,后續(xù)無(wú)需再次競(jìng)爭(zhēng)(直接復(fù)用鎖),開(kāi)銷極低。
  2. 輕量級(jí)鎖:多線程交替執(zhí)行臨界區(qū)(無(wú)激烈競(jìng)爭(zhēng)),線程通過(guò) CAS(原子操作) 將 Mark Word 替換為自己的鎖記錄指針,避免內(nèi)核態(tài)切換。
  3. 重量級(jí)鎖:多線程同時(shí)競(jìng)爭(zhēng)鎖(激烈競(jìng)爭(zhēng)),CAS 失敗的線程阻塞等待(依賴操作系統(tǒng) mutex),開(kāi)銷最高。

五、關(guān)鍵特性

  1. 可重入性:同一線程可多次獲取同一把鎖(不會(huì)死鎖)。例如:
public synchronized void methodA() {
    methodB(); // 同一線程再次獲取當(dāng)前對(duì)象鎖,允許執(zhí)行
}
public synchronized void methodB() {}
  1. 原理:鎖記錄中維護(hù) 重入計(jì)數(shù)器,線程首次獲取鎖時(shí)計(jì)數(shù)器 = 1,再次獲取時(shí)計(jì)數(shù)器 + 1,釋放時(shí)計(jì)數(shù)器 - 1,直至為 0 釋放鎖。
  2. 不可中斷性:線程獲取鎖時(shí)(如重量級(jí)鎖),若鎖被占用,線程會(huì)進(jìn)入 BLOCKED 狀態(tài),無(wú)法被中斷(需等待鎖釋放)。
  3. 非公平鎖:默認(rèn)是 非公平鎖(線程釋放鎖后,等待隊(duì)列中的線程和新請(qǐng)求鎖的線程競(jìng)爭(zhēng),新線程可能 “插隊(duì)”),無(wú)法直接改為公平鎖(需借助 ReentrantLock)。

六、與 Lock 接口的對(duì)比

synchronized 是 JVM 內(nèi)置鎖,java.util.concurrent.locks.Lock 是 API 層面的鎖,核心差異如下:

特性synchronizedLock(如 ReentrantLock)
鎖實(shí)現(xiàn)JVM 內(nèi)置(C++ 實(shí)現(xiàn))Java 代碼實(shí)現(xiàn)(API 層面)
鎖類型非公平鎖(默認(rèn))可公平 / 非公平(構(gòu)造函數(shù)指定)
可中斷性不可中斷(BLOCKED 狀態(tài))可中斷(lockInterruptibly()
超時(shí)獲取無(wú)(只能無(wú)限等待)支持超時(shí)獲?。?code>tryLock(long, TimeUnit))
條件變量隱式(通過(guò) wait()/notify()顯式(Condition 對(duì)象,支持多條件)
鎖釋放自動(dòng)釋放(方法退出 / 代碼塊結(jié)束)必須手動(dòng)釋放(unlock(),需在 finally 中)
性能優(yōu)化后(偏向 / 輕量級(jí)鎖)接近 Lock高并發(fā)下更靈活(如非阻塞獲?。?/td>

七、使用注意事項(xiàng)

  • 鎖粒度不宜過(guò)大:避免對(duì)整個(gè)方法加鎖(尤其是包含非臨界區(qū)邏輯時(shí)),優(yōu)先使用代碼塊鎖定最小臨界區(qū)(減少鎖競(jìng)爭(zhēng))。
  • 鎖對(duì)象不可變:代碼塊鎖的對(duì)象需用 final 修飾(避免鎖對(duì)象被重新賦值,導(dǎo)致多線程持有不同鎖,失去同步效果)。
  • 避免死鎖
    • 多個(gè)線程獲取鎖的順序保持一致(如線程 1 先鎖 A 再鎖 B,線程 2 也先鎖 A 再鎖 B);
    • 避免鎖嵌套過(guò)深;
    • 可使用超時(shí)鎖(Lock.tryLock())替代 synchronized 防止死鎖。
  • 避免鎖競(jìng)爭(zhēng)激烈場(chǎng)景
    • 高并發(fā)下,synchronized 重量級(jí)鎖的性能較差,可考慮用ConcurrentHashMap 等并發(fā)容器,或通過(guò)分段鎖、無(wú)鎖編程(CAS)優(yōu)化。

八、總結(jié)

synchronized 是 Java 最基礎(chǔ)、最常用的線程同步方式,優(yōu)點(diǎn)是 簡(jiǎn)單易用、無(wú)需手動(dòng)釋放鎖、JVM 自動(dòng)優(yōu)化,適合解決大多數(shù)線程安全問(wèn)題(如簡(jiǎn)單的共享變量修改、方法同步)。其核心是通過(guò) “鎖對(duì)象” 實(shí)現(xiàn)互斥訪問(wèn),結(jié)合 JDK 6 后的鎖升級(jí)機(jī)制,在低競(jìng)爭(zhēng)場(chǎng)景下性能優(yōu)異,高競(jìng)爭(zhēng)場(chǎng)景下可考慮用 Lock 接口或并發(fā)容器替代,若是多實(shí)例場(chǎng)景使用分布式鎖。

到此這篇關(guān)于Java 同步關(guān)鍵字 synchronized:用法 + 場(chǎng)景 + 避坑指南的文章就介紹到這了,更多相關(guān)Java 關(guān)鍵字 synchronized內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot詳解MySQL如何實(shí)現(xiàn)讀寫(xiě)分離

    SpringBoot詳解MySQL如何實(shí)現(xiàn)讀寫(xiě)分離

    當(dāng)響應(yīng)的瓶頸在數(shù)據(jù)庫(kù)的時(shí)候,就要考慮數(shù)據(jù)庫(kù)的讀寫(xiě)分離,當(dāng)然還可以分庫(kù)分表,那是單表數(shù)據(jù)量特別大,當(dāng)單表數(shù)據(jù)量不是特別大,但是請(qǐng)求量比較大的時(shí)候,就要考慮讀寫(xiě)分離了.具體的話,還是要看自己的業(yè)務(wù)...如果還是很慢,那就要分庫(kù)分表了...我們這篇就簡(jiǎn)單講一下讀寫(xiě)分離
    2022-09-09
  • Java高并發(fā)中的交換器Exchanger解析

    Java高并發(fā)中的交換器Exchanger解析

    這篇文章主要介紹了Java高并發(fā)中的交換器Exchanger解析,如果兩個(gè)線程并行處理,但在某個(gè)時(shí)刻需要互相交換自己已經(jīng)處理完的中間數(shù)據(jù),然后才能繼續(xù)往下執(zhí)行,這個(gè)時(shí)候就可以使用 Exchanger,需要的朋友可以參考下
    2023-12-12
  • JAVA多線程中join()方法的使用方法

    JAVA多線程中join()方法的使用方法

    雖然關(guān)于討論線程join()方法的博客已經(jīng)非常極其特別多了,但是前幾天我有一個(gè)困惑卻沒(méi)有能夠得到詳細(xì)解釋,當(dāng)系統(tǒng)中正在運(yùn)行多個(gè)線程時(shí),join()到底是暫停了哪些線程,所以本文詳細(xì)解釋一下希望能幫助到和我有相同困惑的同學(xué)
    2021-05-05
  • 基于@Table注解無(wú)法使用及報(bào)紅的解決

    基于@Table注解無(wú)法使用及報(bào)紅的解決

    這篇文章主要介紹了基于@Table注解無(wú)法使用及報(bào)紅的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • mybatis批量插入,批量更新以及null值問(wèn)題的解決

    mybatis批量插入,批量更新以及null值問(wèn)題的解決

    這篇文章主要介紹了mybatis批量插入,批量更新以及null值問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mybatis XML文件中使用CDATA標(biāo)簽的實(shí)現(xiàn)

    Mybatis XML文件中使用CDATA標(biāo)簽的實(shí)現(xiàn)

    本文主要介紹了Mybatis XML文件中使用CDATA標(biāo)簽,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • Java之注解@Data和@ToString(callSuper=true)解讀

    Java之注解@Data和@ToString(callSuper=true)解讀

    在使用Lombok庫(kù)的@Data注解時(shí),若子類未通過(guò)@ToString(callSuper=true)注明包含父類屬性,toString()方法只打印子類屬性,解決方法:1. 子類重寫(xiě)toString方法;2. 子類使用@Data和@ToString(callSuper=true),父類也應(yīng)使用@Data
    2024-11-11
  • vue+springboot項(xiàng)目上傳部署tomcat的方法實(shí)現(xiàn)

    vue+springboot項(xiàng)目上傳部署tomcat的方法實(shí)現(xiàn)

    本文主要介紹了vue+springboot項(xiàng)目上傳部署tomcat的方法實(shí)現(xiàn),包括環(huán)境準(zhǔn)備、配置調(diào)整以及部署步驟,文中通過(guò)圖文及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • PowerJob的MapProcessor工作流程源碼解讀

    PowerJob的MapProcessor工作流程源碼解讀

    這篇文章主要為大家介紹了PowerJob的MapProcessor工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Java打印數(shù)組的三種方法整理

    Java打印數(shù)組的三種方法整理

    許多學(xué)編程專業(yè)的同學(xué)面試的時(shí)候,考官都會(huì)問(wèn)到Java如何打印數(shù)組這樣的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Java打印數(shù)組的三種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評(píng)論

松江区| 山东| 珠海市| 黎平县| 元江| 昌宁县| 红桥区| 阜新| 福建省| 苏尼特左旗| 嵩明县| 津南区| 从江县| 威海市| 江孜县| 萨迦县| 贺州市| 巴彦淖尔市| 会同县| 虎林市| 淳化县| 南部县| 黑龙江省| 库车县| 靖远县| 宝鸡市| 庆云县| 吴旗县| 彰武县| 双牌县| 托里县| 大足县| 麦盖提县| 永丰县| 靖边县| 澳门| 云龙县| 农安县| 龙海市| 五指山市| 天镇县|