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