1.上下文切換爲什麼影響性能?
因爲CPU切換前會保存上一個任務的狀態,以便下次切換回這個任務時,可以再加載這個任務的狀態
2.多線程一定會比單線程快嗎?
不一定,多線程在創建線程及CPU上下文切換時會有一定的開銷。
3.如何避免死鎖?
1)避免一個線程同時獲取多個鎖
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (A) {
Thread.sleep(2000);
synchronized (B) {
System.out.println("1");
}
}
}
});
2)嘗試使用定時鎖lock.tryLock(timeout)來替代使用內部鎖機制
4.硬件和軟件的資源限制
在併發編程時,程序的執行速度受限於計算機硬件資源或軟件資源。
例如服務器帶寬爲2Mb/s,某個資源的下載速度爲1Mb/s,啓動10個線程下載,下載速度不會變成10Mb/s。
對於有數據庫操作時,如果SQL語句執行非常快,而線程的數量比數據庫連接數要大很多,則某些線程會被阻塞,等待數據庫連接。
5.synchronized關鍵字的使用
Java中的每一個對象都可以作爲鎖。
1)對於普通同步方法,鎖是當前實例對象
2)對於靜態同步方法,鎖是當前類的Class對象
3)對於同步方法塊,鎖是Synchronized括號裏配置的對象