1.Synchronized
Java提供關(guān)鍵字synchronized來防止資源沖突康栈。當(dāng)任務(wù)要執(zhí)行被synchronized關(guān)鍵字保護(hù)的代碼片段時(shí)棉胀,它將檢查鎖是否可用理张,然后獲取鎖系瓢,執(zhí)行代碼,釋放鎖揖闸。
如果一個(gè)任務(wù)處于一個(gè)對(duì)標(biāo)記為synchronized的方法的調(diào)用中揍堕,那么在這個(gè)線程從該方法返回之前,其他所有要調(diào)用類中標(biāo)記為synchronized方法的線程都會(huì)被阻塞汤纸。
2.Lock
Lock對(duì)象必須被顯式的創(chuàng)建鎖定和釋放
Lock lock = new ReentrantLock();
lock.unlock();
3.volatile
a:volatile關(guān)鍵字為域變量的訪問提供了一種免鎖機(jī)制衩茸,
b:使用volatile修飾域相當(dāng)于告訴虛擬機(jī)該域可能會(huì)被其他線程更新,
c:因此每次使用該域就要重新計(jì)算贮泞,而不是使用寄存器中的值
d:volatile不會(huì)提供任何原子操作楞慈,它也不能用來修飾final類型的變量
5:使用局部變量實(shí)現(xiàn)線程同步
如果使用ThreadLocal管理變量,則每一個(gè)使用該變量的線程都獲得該變量的副本啃擦,
副本之間相互獨(dú)立囊蓝,這樣每一個(gè)線程都可以隨意修改自己的變量副本,而不會(huì)對(duì)其他線程產(chǎn)生影響议惰。
ThreadLocal() : 創(chuàng)建一個(gè)線程本地變量
get() : 返回此線程局部變量的當(dāng)前線程副本中的值
initialValue() : 返回此線程局部變量的當(dāng)前線程的"初始值"
set(T value) : 將此線程局部變量的當(dāng)前線程副本中的值設(shè)置為value
6.使用原子變量實(shí)現(xiàn)線程同步
原子操作就是指將讀取變量值慎颗、修改變量值、保存變量值看成一個(gè)整體來操作
即-這幾種行為要么同時(shí)完成言询,要么都不完成。
在java的util.concurrent.atomic包中提供了創(chuàng)建了原子類型變量的工具類傲宜,
使用該類可以簡(jiǎn)化線程同步运杭。
其中AtomicInteger表可以用原子方式更新int的值,可用在應(yīng)用程序中(如以原子方式增加的計(jì)數(shù)器)函卒,
但不能用于替換Integer辆憔;可擴(kuò)展Number,允許那些處理機(jī)遇數(shù)字類的工具和實(shí)用工具進(jìn)行統(tǒng)一訪問报嵌。
AtomicInteger類常用方法:
AtomicInteger(int initialValue) : 創(chuàng)建具有給定初始值的新的AtomicInteger
addAddGet(int dalta) : 以原子方式將給定值與當(dāng)前值相加
get() : 獲取當(dāng)前值