1.Java程序的運行原理
由java命令啓動JVM,JVM啓動就相當於啓動了一個進程。
接着有該進程創建了一個主線程去調用main方法。
2.jvm虛擬機的啓動是單線程的還是多線程的?
多線程的。
原因是垃圾回收線程也要先啓動,否則很容易會出現內存溢出。
現在的垃圾回收線程加上前面的主線程,最低啓動了兩個線程,所以,jvm的啓動其實是多線程的。
3.run()和start()的區別?
run()
:僅僅是封裝被線程執行的代碼,直接調用是普通方法
start()
:首先啓動了線程,然後再由jvm去調用該線程的run()方法。
4.實現多線程的兩種方式
推薦使用Runnable接口:
- 可以避免由於Java單繼承帶來的侷限性,支持多實現。
- 適合多個相同程序去處理同一個資源的情況,把線程同程序的代碼、數據有效分離,較好地體現了面對對象的設計思想。
5. 多線程安全的判斷依據
- 是否有多線程環境
- 是否有共享數據
- 是否有多條語句操作共享數據
6. 同步解決線程安全問題
(1)同步代碼塊
這裏的鎖對象可以是任意對象。
@Override
public void run() {
//創建鎖對象
private Object obj = new Object();// 可以是任意類的對象
synchronized(obj ) {
需要被同步的代碼;
...
}
}
(2)同步方法
把同步加在方法上。這裏的鎖對象是this
public void run() {
method1();//調用同步方法
}
// 定義同步方法
private synchronized void method1() {
...
}
(3)靜態同步方法
把同步加在方法上。
這裏的鎖對象是當前類的字節碼文件對象。
private static synchronized void method1() {
...
}
7.線程安全的集合
線程安全的集合包括:StringBuffer
、Vector
、Hashtable
用Collections工具類的方法可以把一個線程不安全的集合類變成一個線程安全的集合類。
8.Lock
是一個接口,是一種更方便實現同步的方式
* Lock:
* void lock(): 獲取鎖。
* void unlock():釋放鎖。
* ReentrantLock是Lock的實現類.
try {
lock.lock(); // 加鎖
同步內容...
} finally {
lock.unlock(); // 釋放鎖
}