執行緒的基本操作(三)
阿新 • • 發佈:2018-11-02
volatile關鍵字:
修飾變數,可以保證變數的可見性,但是無法保證對變數複合操作的原子性,如:
static volatile int = 0;
public static class T implements Runnable{
public void run(){
for(int k=0;k<100;k++)
i++;
}
}
執行緒組:
public class ThreadGroupDemo implements runnable{
ThreadGroup tg = new ThreadGroup("StudyThread");
Thread t1 = new Thread(tg,new ThreadGroupDemo(),"ThreadForRead");
@Override
public void run(){......}
....
}
守護執行緒:
public class DaemonDemo{
public static class DaemonT extends Thread{
public void run(){
while(true){System.out.println("......")}//死迴圈列印省略號
}
}
public static void main(String [] args){
Thread t = new daemonT();
t.setDaemon(true);//設定執行緒t為守護執行緒
t.start();
Thread.sleep(2000);
}
}
上例中,main為使用者執行緒,t為守護執行緒,main在睡眠2s後執行結束,t也隨之結束;如果t不設定為守護執行緒,將一直列印........。設定了守護執行緒就是脣亡齒寒的關係,沒有設定守護執行緒在啟動後就各走各的了。
守護執行緒的設定一定要線上程啟動前執行。
執行緒優先順序:
由1~10十個整型表示,數字越大 優先順序越高,優先順序高的執行緒傾向於更快地執行完,但並不總是這樣,只是概率更高。
設定優先順序:new Thread().setPriority(7);
sychronized關鍵字:
對程式碼塊加鎖,以實現執行緒同步(保證該程式碼塊每次只有一個執行緒執行)。
sychronized指定加鎖物件:對給定物件加鎖,進入同步程式碼前要獲得給定物件的鎖;
sychronized作用於例項方法:相當於對當前例項加鎖,進入同步程式碼前要獲得當前例項的鎖;
sychronized作用於靜態方法:相當於對當前類加鎖,進入同步程式碼前要獲得當前類的鎖;
併發下的ArrayList:
ArrayList是一個執行緒不安全的容器,兩個執行緒同時對一個ArrayList各新增10000個元素,可能會得到三種結果:
1.正常結束,結果List中有20000個元素
2.丟擲陣列越界異常(在不斷新增元素過程中,List會擴容,因為沒有鎖的保護,執行緒訪問到了不一致的內部狀態)
ps:List擴容,就是重新構造一個更大的陣列,再把List原來的內容複製過去
3.執行緒正常結束,但是List元素個數是一個小於20000的數值(儲存List大小的變數,被多執行緒不正常地訪問,同時兩個執行緒對List的同一個位置進行了賦值)
-----------------------------------------------------《實戰Java高併發設計》筆記------------------------------------------------------