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

  • Java并發編程之美
  • 翟陸續 薛賓田
  • 11字
  • 2019-07-25 11:53:59

第1章 并發編程線程基礎

1.1 什么是線程

在討論什么是線程前有必要先說下什么是進程,因為線程是進程中的一個實體,線程本身是不會獨立存在的。進程是代碼在數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,線程則是進程的一個執行路徑,一個進程中至少有一個線程,進程中的多個線程共享進程的資源。

操作系統在分配資源時是把資源分配給進程的,但是CPU資源比較特殊,它是被分配到線程的,因為真正要占用CPU運行的是線程,所以也說線程是CPU分配的基本單位。

在Java中,當我們啟動main函數時其實就啟動了一個JVM的進程,而main函數所在的線程就是這個進程中的一個線程,也稱主線程。

進程和線程的關系如圖1-1所示。

圖1-1

由圖1-1可以看到,一個進程中有多個線程,多個線程共享進程的堆和方法區資源,但是每個線程有自己的程序計數器和棧區域。

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

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

堆是一個進程中最大的一塊內存,堆是被進程中的所有線程共享的,是進程創建時分配的,堆里面主要存放使用new操作創建的對象實例。

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

主站蜘蛛池模板: 浦东新区| 巴林右旗| 广水市| 东兰县| 凤庆县| 酉阳| 诸城市| 张家港市| 景泰县| 阳曲县| 枣强县| 镇原县| 嘉禾县| 武功县| 嘉荫县| 颍上县| 锡林浩特市| 宜阳县| 昌平区| 长兴县| 开远市| 湘潭市| 林口县| 沽源县| 乌苏市| 理塘县| 济宁市| 织金县| 喀喇沁旗| 娱乐| 海晏县| 会理县| 台中市| 漯河市| 平安县| 铜陵市| 凯里市| 泗洪县| 博罗县| 云霄县| 杭州市|