synchronized
保證線程安全
volatile
具有可見性、有序性,不具備原子性(很容易讀到髒數據)。禁止指令重排。
https://www.infoq.cn/article/java-memory-model-4
Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者爲常量時,不必使用。
wait、join、notify
CountDownLatch
一組線程完成後進行其他操作,如統計等
ThreadLocal
Synchronized用於線程間的數據共享,而ThreadLocal則用於線程間的數據隔離。
ThreadLocal不能解決併發問題,主要用途是爲了保持線程自身對象和避免參數傳遞。
應用場景:
在線程中存放一些就像session、數據庫連接等的特徵變量,會針對不同的線程,有不同的值。
一句話理解ThreadLocal:向ThreadLocal裏面存東西就是向它裏面的Map存東西的,然後ThreadLocal把這個Map掛到當前的線程底下,這樣Map就僅僅屬於這個線程了。