Java中的棧(Stack)是一個先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),常用于方法調(diào)用和表達(dá)式求值。每個進(jìn)程都有自己的獨立棧空間,用來保存方法中局部變量、方法參數(shù)以及方法的返回地址等信息。Java中每個線程也有自己的棧空間,用來保存線程方法調(diào)用時的信息。
public class MyThread extends Thread { public void run() { // 線程入口點,保存在棧空間中 System.out.println("Hello World"); } }
當(dāng)我們啟動一個線程,JVM會為該線程創(chuàng)建對應(yīng)的棧空間,線程方法的調(diào)用會在該棧空間中進(jìn)行。每個線程都有自己的棧空間,它是線程獨享的,不會被其他線程訪問。在多線程編程中,我們需要注意線程棧空間的大小限制,過大會導(dǎo)致內(nèi)存耗盡,過小會導(dǎo)致棧溢出異常。
public class MyThread extends Thread { private int counter = 0; public void run() { // 不斷遞歸調(diào)用自身,導(dǎo)致棧溢出 System.out.println(counter++); run(); } }
當(dāng)我們在某個線程方法中不斷遞歸調(diào)用自身,棧空間會不斷分配,直到棧空間被耗盡,最終拋出棧溢出異常(StackOverflowError)。在編寫多線程程序時,我們應(yīng)該避免使用過多的遞歸調(diào)用,以免耗盡線程棧空間。