線程同步機(jī)制是一套用于協(xié)調(diào)線程之間的數(shù)據(jù)訪問的機(jī)制.該機(jī)制可以保障線程安全。
Java平臺(tái)提供的線程同步機(jī)制包括: 鎖, volatile關(guān)鍵字, final關(guān)鍵字,static關(guān)鍵字,以及相關(guān)的API,如Object.wait()/Object.notify()等。
每一個(gè)服務(wù)進(jìn)程的運(yùn)行,都包含若干進(jìn)程(Thread),線程是調(diào)度的基本單位,進(jìn)程則是資源擁有的基本單位。
線程有自己的私有數(shù)據(jù),比如棧和寄存器,同時(shí)與其它線程共享相同的虛擬內(nèi)存和全局變量等資源,當(dāng)多個(gè)線程同時(shí)讀寫同一份共享資源的時(shí)候,會(huì)引起沖突,這時(shí)候就需要引入線程同步機(jī)制使各個(gè)線程排隊(duì)一個(gè)一個(gè)的對(duì)共享資源進(jìn)行操作,而不是同時(shí)進(jìn)行。
1、線程同步其實(shí)實(shí)現(xiàn)的是線程排隊(duì)。
2、防止線程同步訪問共享資源造成沖突。
3、變量需要同步,常量不需要(常量存放于方法區(qū))。
4、多個(gè)線程訪問共享資源的代碼有可能是同一份代碼,也有可能是不同的代碼;無論是否執(zhí)行同一份代碼,只要這些線程的代碼訪問同一份可變的共享資源,這些線程之間就需要同步。
多個(gè)線程同時(shí)訪問共享數(shù)據(jù)時(shí),防止數(shù)據(jù)被損壞。
1、實(shí)現(xiàn)比較繁瑣,而且容易出錯(cuò)。
必須對(duì)多個(gè)線程可能同時(shí)訪問的所有數(shù)據(jù),用額外的代碼包圍起來,以獲得和釋放一個(gè)同步鎖。這需要由程序員來保證沒有遺漏,對(duì)多線程共享的數(shù)據(jù)的加鎖工作。并且,在程序完成時(shí),需要進(jìn)行壓力測(cè)試以保證多個(gè)線程并發(fā)時(shí),結(jié)果如預(yù)期。
2、它會(huì)損害性能。
獲取和釋放一個(gè)鎖是需要時(shí)間的。因?yàn)樾枰~外的調(diào)用一些方法,并且需要協(xié)調(diào)調(diào)度下一個(gè)獲得鎖的線程。
3、每次只能允許一個(gè)線程訪問資源。這是鎖的全部意義所在,但也是問題所在,因?yàn)樽枞粋€(gè)線程可能會(huì)造成更多的線程被創(chuàng)建。
1、線程同步并不是一件好事,設(shè)計(jì)自己的應(yīng)用程序是應(yīng)酌情考慮,盡量避免線程同步。
2、避免使用一些共享數(shù)據(jù),如靜態(tài)字段。(如果有多線程同時(shí)讀寫這個(gè)靜態(tài)字段就有問題)
3、試著用值類型,因?yàn)橹殿愋涂偸菚?huì)被復(fù)制,每個(gè)線程操作的都是自己的那個(gè)副本。
4、多線程對(duì)共享數(shù)據(jù)進(jìn)行只讀訪問是沒有任何問題的。