java多線程synchronized關(guān)鍵字詳解:
? ? 1.對資源進(jìn)行加鎖加袋,使得同一時(shí)間只有一個(gè)線程進(jìn)行操作哥艇,同步用以就解決多線程同時(shí)訪問可能出現(xiàn)的問題谐腰,當(dāng)synchronized方法執(zhí)行完成或發(fā)生異常,會自動釋放鎖框弛。
? ? 2.多個(gè)方法的多線程情況辛辨,如果一個(gè)對象有多個(gè)Synchronized方法召娜,某個(gè)時(shí)刻某個(gè)線程進(jìn)入某個(gè)Synchronized方法劳吠,那么該方法沒有執(zhí)行完畢前变过,其他線程是無法訪問該對象的任何synchronized方法
結(jié)論:當(dāng)synchronized關(guān)鍵字修飾方法時(shí)容贝,該方法叫同步方法劣欢,java中每個(gè)對象都有一個(gè)鎖寿谴,或者叫做監(jiān)視器砸捏,當(dāng)一個(gè)線程訪問某個(gè)對象的Synchronized方法竟闪,將該對象上鎖景殷,其他任何線程無法訪問該對象synchronized方法直到執(zhí)行完畢后或者出現(xiàn)異常溅呢,才會將該對象鎖釋放澡屡。
? ?3.考慮靜態(tài)的同步方法,當(dāng)一個(gè)方法被synchronized和static修飾咐旧,非靜態(tài)同步方法將對象上鎖驶鹉,靜態(tài)方法不屬于對象,屬于類铣墨,它將這個(gè)方法所在類的class對象上鎖
? ? ? 結(jié)論:如果每個(gè)synchronized方法是static室埋,當(dāng)線程訪問方法,它鎖的不是synchronized方法所在的對象而是Class對象伊约,因此當(dāng)線程分別訪問同一個(gè)類兩個(gè)對象的兩個(gè)static和synchronized方法時(shí)姚淆,他執(zhí)行的順序也是一個(gè)線程先去執(zhí)行方法,執(zhí)行完畢才會另一個(gè)線程才開始執(zhí)行屡律。
? 4.synchronized塊
? ? ? ?synchronized(object){}
? ? ? 表示線程執(zhí)行時(shí)將object對象上鎖腌逢,當(dāng)一個(gè)線程執(zhí)行,將object對象鎖住超埋,另一個(gè)線程就不能執(zhí)行對應(yīng)的塊了搏讶。可能方法只有幾行代碼涉及到線程同步問題所以synchronized塊比synchronized方法更加細(xì)粒度地控制了多個(gè)線程的訪問,只有synchronized塊中不能同時(shí)被多個(gè)線程所訪問霍殴,方法中其他語句仍可以被對象成所訪問