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