1. 程式人生 > >線程的基本操作(三)

線程的基本操作(三)

string art 無法 rri 進行 但是 每次 pan 高並發

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高並發設計》筆記------------------------------------------------------

線程的基本操作(三)