小猫的java基础知识点汇总(下)
1、線程和進(jìn)程有什么區(qū)別?
進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是任務(wù)調(diào)度和執(zhí)行的基本單位
線程是進(jìn)程的子集,一個(gè)進(jìn)程可以有很多線程,每條線程并行執(zhí)行不同的任務(wù)。
不同的進(jìn)程使用不同的內(nèi)存空間,而所有的線程共享一片相同的內(nèi)存空間。
2、如何在Java中實(shí)現(xiàn)線程?
繼承Thread類(lèi) class Handler extends Thread{public void run(){//方法重寫(xiě)}public static void main(String[] args){Thread thread = new Handler();//創(chuàng)建線程對(duì)象thread.start();//啟動(dòng)線程} } 實(shí)現(xiàn)Runnable接口 class Handler implements Runnable{public void run(){//方法實(shí)現(xiàn)}public static void main(String[] args){Handler handler = new Handler();Thread thread = new Thread(handler);//創(chuàng)建線程對(duì)象thread.start();//啟動(dòng)線程} }3、Java 關(guān)鍵字volatile 與 synchronized 作用與區(qū)別?
????1,volatile
? ??它所修飾的變量不保留拷貝,直接訪問(wèn)主內(nèi)存中的。
在Java內(nèi)存模型中,有main memory,每個(gè)線程也有自己的memory (例如寄存器)。
為了性能,一個(gè)線程會(huì)在自己的memory中保持要訪問(wèn)的變量的副本。這樣就會(huì)出現(xiàn)同一個(gè)變 量在某個(gè)瞬間,在一個(gè)線程的memory中的值可能與另外一個(gè)線程memory中的值,或者main memory中的值不一致的情況。?
一個(gè)變量聲明為volatile,就意味著這個(gè)變量是隨時(shí)會(huì)被其他線程修改的,因此不能將它c(diǎn)ache在線程memory中。
????2,synchronized
當(dāng)它用來(lái)修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。
一、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。
二、當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。
三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。
4、線程生命周期?
新建一個(gè)線程時(shí),它的狀態(tài)是New。當(dāng)我們調(diào)用線程的start()方法時(shí),狀態(tài)被改變?yōu)镽unnable。線程調(diào)度器會(huì)為Runnable線程池中的線程分配CPU時(shí)間并且將它們的狀態(tài)改變?yōu)镽unning。其他的線程狀態(tài)還有Waiting,Blocked?和Dead。
5、死鎖?
指多個(gè)進(jìn)程在運(yùn)行過(guò)程中因爭(zhēng)奪資源而造成的一種僵局,當(dāng)處于這種狀態(tài)時(shí),若無(wú)外力作用,它們都將無(wú)法再向前推進(jìn)。
原因可歸結(jié)為兩點(diǎn):競(jìng)爭(zhēng)資源、?進(jìn)程間推進(jìn)順序非法
產(chǎn)生死鎖的必要條件:
互斥條件:在一段時(shí)間內(nèi)某資源僅為一進(jìn)程所占用。
請(qǐng)求和保持條件:對(duì)已獲得的資源保持不放。
不剝奪條件:已獲得的資源只能由自己釋放。
環(huán)路等待條件:存在一個(gè)進(jìn)程--資源的環(huán)形鏈。
6、什么是線程池? 為什么要使用它?
創(chuàng)建線程要花費(fèi)昂貴的資源和時(shí)間,如果任務(wù)來(lái)了才創(chuàng)建線程那么響應(yīng)時(shí)間會(huì)變長(zhǎng),而且一個(gè)進(jìn)程能創(chuàng)建的線程數(shù)有限。
線程池實(shí)現(xiàn)了線程重復(fù)利用,節(jié)約了時(shí)間和資源。
// Java線程池的完整構(gòu)造函數(shù) public ThreadPoolExecutor(int corePoolSize, // 線程池長(zhǎng)期維持的線程數(shù),即使線程處于Idle狀態(tài),也不會(huì)回收。int maximumPoolSize, // 線程數(shù)的上限long keepAliveTime, TimeUnit unit, // 超過(guò)corePoolSize的線程的idle時(shí)長(zhǎng),// 超過(guò)這個(gè)時(shí)間,多余的線程會(huì)被回收。BlockingQueue<Runnable> workQueue, // 任務(wù)的排隊(duì)隊(duì)列ThreadFactory threadFactory, // 新線程的產(chǎn)生方式RejectedExecutionHandler handler) // 拒絕策略7、反射?
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱(chēng)為java語(yǔ)言的反射機(jī)制。
8、JDK 、 JRE 、JVM有什么區(qū)別和聯(lián)系?
JVM : Java 虛擬機(jī)。能夠?qū)?class 文件中的字節(jié)碼指令進(jìn)行識(shí)別并調(diào)用操作系統(tǒng)向上的 API 完成動(dòng)作。所以說(shuō),jvm 是 Java 能夠跨平臺(tái)的核心。
JRE :Java 運(yùn)行時(shí)環(huán)境。包含兩個(gè)部分,jvm和 Java 的一些基本類(lèi)庫(kù)。
JDK :Java 開(kāi)發(fā)工具包。jdk 是整個(gè) Java 開(kāi)發(fā)的核心,它集成了 jre 和一些好用的小工具。
這三者的關(guān)系是:一層層的嵌套關(guān)系。JDK>JRE>JVM。
9、深拷貝淺拷貝
? ? ? 數(shù)據(jù)類(lèi)型分為兩種基礎(chǔ)類(lèi)型和引用類(lèi)型:
基礎(chǔ)類(lèi)型:像Number、String、Boolean等這種為基本類(lèi)型
引用類(lèi)型:Object和Array
淺拷貝只是復(fù)制了對(duì)象的引用地址,兩個(gè)對(duì)象指向同一個(gè)內(nèi)存地址,修改其中任意的值,另一個(gè)值會(huì)隨之變化
深拷貝是將對(duì)象及值復(fù)制過(guò)來(lái),兩個(gè)對(duì)象修改其中任意的值另一個(gè)值不會(huì)改變。
10、JVM內(nèi)存分為哪幾部分?各個(gè)部分的作用是什么?
JVM內(nèi)存區(qū)域分為五個(gè)部分,分別是堆,方法區(qū),虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器。
1)堆。
堆是Java對(duì)象的存儲(chǔ)區(qū)域,任何用new字段分配的Java對(duì)象實(shí)例和數(shù)組。
2)方法區(qū)。
它用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù),方法區(qū),從JDK1.8永久代被移除。
3)虛擬機(jī)棧。
虛擬機(jī)棧中執(zhí)行每個(gè)方法的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。
4)本地方法棧。
與虛擬機(jī)棧發(fā)揮的作用相似,相比于虛擬機(jī)棧為Java方法服務(wù),本地方法棧為虛擬機(jī)使用的Native方法服務(wù),執(zhí)行每個(gè)本地方法的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。
5)程序計(jì)數(shù)器。
指示Java虛擬機(jī)下一條需要執(zhí)行的字節(jié)碼指令。
總:其中方法區(qū)和堆被JVM中多個(gè)線程共享,比如類(lèi)的靜態(tài)常量就被存放在方法區(qū),供類(lèi)對(duì)象之間共享,虛擬機(jī)棧,本地方法棧,pc寄存器是每個(gè)線程獨(dú)立擁有的,不會(huì)與其他線程共享。
11、為什么會(huì)出現(xiàn)4.0-3.6=0.40000001這種現(xiàn)象?
2進(jìn)制的小數(shù)無(wú)法精確的表達(dá)10進(jìn)制小數(shù),在計(jì)算10進(jìn)制小數(shù)的過(guò)程中要先轉(zhuǎn)換為2進(jìn)制進(jìn)行計(jì)算,這個(gè)過(guò)程中出現(xiàn)誤差。
12、“==”比較的是什么?
“==”兩邊是對(duì)象,比較地址。
“==”兩邊是基本類(lèi)型,比較數(shù)值。
?
總結(jié)
以上是生活随笔為你收集整理的小猫的java基础知识点汇总(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 链表排序-归并
- 下一篇: 215. 数组中的第K个最大元素 BFP