互聯網並發編程一
線程安全概念:當多個線程訪問某一個類(對象或方法)時,這個對象始終都能表現出正確的行為,那麽這個類(對象或方法)就是線程安全的。
分析:當多個線程訪問myThread的run方法時,以排隊的方式進行處理(這裏排對是按照CPU分配的先後順序而定的),一個線程想要執行synchronized修飾的方法裏的代碼:1 嘗試獲得鎖 2 如果拿到鎖,執行synchronized代碼體內容;拿不到鎖,這個線程就會不斷的嘗試獲得這把鎖,直到拿到為止,而且是多個線程同時去競爭這把鎖。(也就是會有鎖競爭的問題)
synchronized:可以在任意對象及方法上加鎖,而加鎖的這段代碼稱為"互斥區"或"臨界區"。取得的鎖都是對象鎖,而不是把一段代碼(方法)當做鎖,所以代碼中哪個線程先執行synchronized關鍵字的方法,哪個線程就持有該方法所屬對象的鎖(Lock),在靜態方法上加synchronized關鍵字,表示鎖定.class類,類一級別的鎖(獨占.class類)。
volatile:用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改後的值。volatile很容易被誤用,用來進行原子性操作。
AtomicInteger:一個提供原子操作的Integer的類。在Java語言中,++i和i++操作並不是線程安全的,在使用的時候,不可避免的會用到synchronized關鍵字。而AtomicInteger則通過一種線程安全的加減操作接口。
臟讀 :臟讀就是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。
在線程裏調用變量變量必須用final修飾
CountDownLatch:
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
構造方法參數指定了計數的次數
countDown方法,當前線程調用此方法,則計數減一
awaint方法,調用此方法會一直阻塞當前線程,直到計時器的值為0
ThreadLocal:ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。
同步類容器
並發類容器
互聯網並發編程一