- 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)變量等信息,也是線程共享的。
- 手機(jī)安全和可信應(yīng)用開發(fā)指南:TrustZone與OP-TEE技術(shù)詳解
- 計(jì)算機(jī)圖形學(xué)編程(使用OpenGL和C++)(第2版)
- C#完全自學(xué)教程
- Rust編程從入門到實(shí)戰(zhàn)
- JavaScript by Example
- Mastering Google App Engine
- 自制編程語言
- Android系統(tǒng)原理及開發(fā)要點(diǎn)詳解
- Microsoft Azure Storage Essentials
- 零基礎(chǔ)Java學(xué)習(xí)筆記
- Swift 4 Protocol-Oriented Programming(Third Edition)
- Getting Started with Polymer
- 新印象:解構(gòu)UI界面設(shè)計(jì)
- App Inventor 2 Essentials
- Java EE Web應(yīng)用開發(fā)基礎(chǔ)