1. 程式人生 > >執行緒的基本操作(三)

執行緒的基本操作(三)

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