線程同步機制是一套用于協(xié)調(diào)線程之間的數(shù)據(jù)訪問的機制.該機制可以保障線程安全。
Java平臺提供的線程同步機制包括: 鎖, volatile關(guān)鍵字, final關(guān)鍵字,static關(guān)鍵字,以及相關(guān)的API,如Object.wait()/Object.notify()等。
每一個服務(wù)進程的運行,都包含若干進程(Thread),線程是調(diào)度的基本單位,進程則是資源擁有的基本單位。
線程有自己的私有數(shù)據(jù),比如棧和寄存器,同時與其它線程共享相同的虛擬內(nèi)存和全局變量等資源,當多個線程同時讀寫同一份共享資源的時候,會引起沖突,這時候就需要引入線程同步機制使各個線程排隊一個一個的對共享資源進行操作,而不是同時進行。

1、線程同步其實實現(xiàn)的是線程排隊。
2、防止線程同步訪問共享資源造成沖突。
3、變量需要同步,常量不需要(常量存放于方法區(qū))。
4、多個線程訪問共享資源的代碼有可能是同一份代碼,也有可能是不同的代碼;無論是否執(zhí)行同一份代碼,只要這些線程的代碼訪問同一份可變的共享資源,這些線程之間就需要同步。
多個線程同時訪問共享數(shù)據(jù)時,防止數(shù)據(jù)被損壞。
1、實現(xiàn)比較繁瑣,而且容易出錯。
必須對多個線程可能同時訪問的所有數(shù)據(jù),用額外的代碼包圍起來,以獲得和釋放一個同步鎖。這需要由程序員來保證沒有遺漏,對多線程共享的數(shù)據(jù)的加鎖工作。并且,在程序完成時,需要進行壓力測試以保證多個線程并發(fā)時,結(jié)果如預(yù)期。
2、它會損害性能。
獲取和釋放一個鎖是需要時間的。因為需要額外的調(diào)用一些方法,并且需要協(xié)調(diào)調(diào)度下一個獲得鎖的線程。
3、每次只能允許一個線程訪問資源。這是鎖的全部意義所在,但也是問題所在,因為阻塞一個線程可能會造成更多的線程被創(chuàng)建。
1、線程同步并不是一件好事,設(shè)計自己的應(yīng)用程序是應(yīng)酌情考慮,盡量避免線程同步。
2、避免使用一些共享數(shù)據(jù),如靜態(tài)字段。(如果有多線程同時讀寫這個靜態(tài)字段就有問題)
3、試著用值類型,因為值類型總是會被復(fù)制,每個線程操作的都是自己的那個副本。
4、多線程對共享數(shù)據(jù)進行只讀訪問是沒有任何問題的。