????????Java多線程中的同步機(jī)制會(huì)對(duì)資源進(jìn)行加鎖,保證在同一時(shí)間只有一個(gè)線程可以操作對(duì)應(yīng)的資源,避免多線程同時(shí)訪問相同資源發(fā)生沖突。Synchronized是java中的關(guān)鍵字,它是一種同步鎖,可以實(shí)現(xiàn)同步機(jī)制。
1、修飾普通方法


輸出結(jié)果

????????可以看到第一個(gè)線程執(zhí)行完成了才會(huì)執(zhí)行第二個(gè)線程。如果沒有用synchronized修飾的話,結(jié)果會(huì)是兩個(gè)線程隨機(jī)調(diào)度。另外如果是多個(gè)線程不同對(duì)象訪問的該方法,則無(wú)法保證同步。例如這樣,


? ? 可以看到,這樣是無(wú)法保證同步的。
二,修飾靜態(tài)方法
????????修飾靜態(tài)方法, 由于靜態(tài)方法是類方法,? 所以這種情況下鎖的是包含這個(gè)方法的類,也就是類對(duì)象;這樣如果多個(gè)線程不同對(duì)象訪問該靜態(tài)方法,也是可以保證同步的。



另外如果是多個(gè)線程不同對(duì)象訪問的該方法,也同樣能保證同步


三,修飾?代碼塊?
????????修飾代碼塊 其中普通代碼塊 如Synchronized(obj) 這里的obj 可以為類中的一個(gè)屬性、也可以是當(dāng)前的對(duì)象,它的同步效果和修飾普通方法一樣;Synchronized方法 (obj.class)靜態(tài)代碼塊它的同步效果和修飾靜態(tài)方法類似。
Synchronized方法控制范圍較大, 它會(huì)同步對(duì)象中所有Synchronized方法的代碼。Synchronized代碼塊控制范圍較小, 它只會(huì)同步代碼塊中的代碼, 而位于代碼塊之外的代碼是可以被多個(gè)線程訪問的。簡(jiǎn)單來(lái)說 就是 Synchronized代碼塊更加靈活精確

這樣和直接修飾普通方法是沒有區(qū)別的。
4,?java中實(shí)現(xiàn)同步的還有l(wèi)ock,它跟?Synchronized的區(qū)別可以看這里java中實(shí)現(xiàn)同步的兩種方式:syschronized和lock的區(qū)別和聯(lián)系。
另外volatile關(guān)鍵字也需要了解下,從多線程安全的角度說一下這個(gè)問題,每個(gè)線程都有自己獨(dú)立的工作空間,這個(gè)工作空間是為了存放被這個(gè)線程占用的資源,線程之間的工作空間不能共享,那么這樣會(huì)導(dǎo)致一個(gè)問題,被線程修改的數(shù)據(jù)沒有來(lái)得及從線程的工作空間刷新到主內(nèi)存中,導(dǎo)致數(shù)據(jù)的最新狀態(tài)不能達(dá)到同步的效果,volatile 就是為了解決這個(gè)問題而誕生的,被 volatile 關(guān)鍵字修飾的對(duì)象,一旦被修改之后會(huì)立馬刷新回到主內(nèi)存中,保證被其他線程訪問的時(shí)候是最新的數(shù)據(jù),但需要注意的是,?volatile?關(guān)鍵字不能解決線程安全的問題。大家可以自己去查,這里就不做過多解釋了。