官术网_书友最值得收藏!

  • Java并發(fā)編程之美
  • 翟陸續(xù) 薛賓田
  • 760字
  • 2019-07-25 11:53:59

第1章 并發(fā)編程線程基礎(chǔ)

1.1 什么是線程

在討論什么是線程前有必要先說下什么是進(jìn)程,因?yàn)榫€程是進(jìn)程中的一個(gè)實(shí)體,線程本身是不會(huì)獨(dú)立存在的。進(jìn)程是代碼在數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,線程則是進(jìn)程的一個(gè)執(zhí)行路徑,一個(gè)進(jìn)程中至少有一個(gè)線程,進(jìn)程中的多個(gè)線程共享進(jìn)程的資源。

操作系統(tǒng)在分配資源時(shí)是把資源分配給進(jìn)程的,但是CPU資源比較特殊,它是被分配到線程的,因?yàn)檎嬲加肅PU運(yùn)行的是線程,所以也說線程是CPU分配的基本單位。

在Java中,當(dāng)我們啟動(dòng)main函數(shù)時(shí)其實(shí)就啟動(dòng)了一個(gè)JVM的進(jìn)程,而main函數(shù)所在的線程就是這個(gè)進(jìn)程中的一個(gè)線程,也稱主線程。

進(jìn)程和線程的關(guān)系如圖1-1所示。

圖1-1

由圖1-1可以看到,一個(gè)進(jìn)程中有多個(gè)線程,多個(gè)線程共享進(jìn)程的堆和方法區(qū)資源,但是每個(gè)線程有自己的程序計(jì)數(shù)器和棧區(qū)域。

程序計(jì)數(shù)器是一塊內(nèi)存區(qū)域,用來記錄線程當(dāng)前要執(zhí)行的指令地址。那么為何要將程序計(jì)數(shù)器設(shè)計(jì)為線程私有的呢?前面說了線程是占用CPU執(zhí)行的基本單位,而CPU一般是使用時(shí)間片輪轉(zhuǎn)方式讓線程輪詢占用的,所以當(dāng)前線程CPU時(shí)間片用完后,要讓出CPU,等下次輪到自己的時(shí)候再執(zhí)行。那么如何知道之前程序執(zhí)行到哪里了呢?其實(shí)程序計(jì)數(shù)器就是為了記錄該線程讓出CPU時(shí)的執(zhí)行地址的,待再次分配到時(shí)間片時(shí)線程就可以從自己私有的計(jì)數(shù)器指定地址繼續(xù)執(zhí)行。另外需要注意的是,如果執(zhí)行的是native方法,那么pc計(jì)數(shù)器記錄的是undefined地址,只有執(zhí)行的是Java代碼時(shí)pc計(jì)數(shù)器記錄的才是下一條指令的地址。

另外每個(gè)線程都有自己的棧資源,用于存儲(chǔ)該線程的局部變量,這些局部變量是該線程私有的,其他線程是訪問不了的,除此之外棧還用來存放線程的調(diào)用棧幀。

堆是一個(gè)進(jìn)程中最大的一塊內(nèi)存,堆是被進(jìn)程中的所有線程共享的,是進(jìn)程創(chuàng)建時(shí)分配的,堆里面主要存放使用new操作創(chuàng)建的對(duì)象實(shí)例。

方法區(qū)則用來存放JVM加載的類、常量及靜態(tài)變量等信息,也是線程共享的。

主站蜘蛛池模板: 临澧县| 景洪市| 赤壁市| 崇义县| 义马市| 台南县| 商水县| 青浦区| 甘孜县| 松溪县| 苍梧县| 琼海市| 黎平县| 聂拉木县| 城市| 长武县| 内黄县| 左权县| 安陆市| 武安市| 江安县| 神池县| 揭东县| 阿图什市| 邵阳市| 宝坻区| 海淀区| 乐平市| 九寨沟县| 临西县| 宁化县| 固始县| 正阳县| 尼玛县| 廊坊市| 安乡县| 邵阳县| 江津市| 贺兰县| 娱乐| 山西省|