1. 程式人生 > >(1)線程的常用方法 (2)線程的同步機制 (3)網絡編程的常識

(1)線程的常用方法 (2)線程的同步機制 (3)網絡編程的常識

2.3 可能 返回 實現 bool 微秒 實現原理 鎖定 行鎖

1.線程的常用方法
static void sleep(long millis)
- 用於使得當前正在執行的線程進入休眠狀態,休眠參數指定的毫秒(重點)。
static void sleep(long millis, int nanos)
- 用於休眠參數指定的毫秒+納秒,1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000納秒

int getPriority() - 用於獲取調用對象的優先級並返回。
void setPriority(int newPriority) - 用於設置調用對象的優先級。
- 優先級越高則表示優先獲取CPU時間片的機會越大,但不保證該線程一定先執行。

void join() - 用於等待調用對象所表示的線程終止(重點)。
void join(long millis) - 用於等待調用對象所表示線程終止的最長時間為參數指定毫秒
void join(long millis, int nanos) - 用於等待參數指定毫秒加上納秒。

boolean isDaemon() - 用於判斷調用對象所表示的線程是否為守護線程。
void setDaemon(boolean on) - 用於設置調用對象所表示線程為守護線程。
- 該方法的調用必須在線程調用start()方法之前。
- 當所有非守護線程結束時,則守護線程隨之結束。

2.線程的同步機制(重點)
2.1 基本概念
當多個線程同時訪問同一種共享資源時,可能會造成數據的不一致或覆蓋等問題,此時就需要對線程之間進行協調和通信,該方式就叫做線程的同步機制。

2.2 解決方案
由程序結果可知:當兩個線程同時進行取款時,導致最終的賬戶余額不合理。
原因:線程一還沒有來得及將取款後的余額寫入數據庫,但線程二已經開始執行。
解決方案:將線程的並發操作改為線程的串行操作即可。
引發問題:該方式會造成線程執行的效率降低,因此以後的開發中能不用則不用。

2.3 實現方式
在Java語言中可以借助synchronized關鍵字實現同步鎖/對象鎖機制,來保證線程執行的原子性,具體方式如下:
(1)使用同步語句塊的機制來實現
synchronized(對象的引用){
編寫所有需要鎖定的代碼塊;
}
(2)使用synchronized關鍵字修飾整個方法,表示鎖定整個方法的方法體。
該方式等價於 synchronized(this){ 方法體; }。

2.4 實現原理(盡量理解)
當多個線程啟動之後同時去搶占共享資源,若其中一個線程搶到了共享資源,則其他線程進入阻塞/等待狀態,直到該線程執行完畢所有鎖定的代碼後會自動釋放對象鎖,此時等待的線程又可以搶占共享資源,搶到對象鎖的代碼執行鎖定的代碼,搶不到的線程繼續等待。

2.5 死鎖(了解)
線程一執行的代碼:
public void run(){

synchronized(a){ 持有對象鎖a,等待對象鎖b
synchronized(b){
代碼塊;
}
}
}
線程二執行的代碼:
public void run(){

synchronized(b){ 持有對象鎖b,等待對象鎖a
synchronized(a){
代碼塊;
}
}
}

經驗:
在以後的開發中切記不要使用同步語句塊的嵌套結構!!!

2.6 Object類中的常用方法
void wait()
- 用於讓當前線程進入等待狀態,直到其他線程調用notify()/notifyAll()方法。
void wait(long timeout)
- 用於讓當前線程進入等待狀態,直到其他線程調用notify()/notifyAll()方法,
或者參數指定的毫秒已經過去了。
void notify() - 用於喚醒等待狀態的一個線程(隨機)。
void notifyAll() - 用於喚醒等待狀態的所有線程。

(1)線程的常用方法 (2)線程的同步機制 (3)網絡編程的常識