java多線程學習總結之四:線程的同步

線程的同步是保證多線程安全訪問競爭資源的一種手段。對於同步,在具體的Java代碼中須要完成一下兩個操做:把競爭訪問的資源標識爲private;同步哪些修改變量的代碼,使用synchronized關鍵字同步方法或代碼。 java

線程退出同步方法時將釋放掉方法所屬對象的鎖,但還應該注意的是,同步方法中還能夠使用特定的方法對線程進行調度。這些方法來自於java.lang.Object類。 安全

void notify()    
                    喚醒在此對象監視器上等待的單個線程。    
void notifyAll()    
                    喚醒在此對象監視器上等待的全部線程。    
void wait()    
                    致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法。    
void wait(long timeout)    
                    致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。    
void wait(long timeout, int nanos)    
                    致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。

對於同步,除了同步方法外,還能夠使用同步代碼塊,有時候同步代碼塊會帶來比同步方法更好的效果。追其同步的根本的目的,是控制競爭資源的正確的訪問,所以只要在訪問競爭資源的時候保證同一時刻只能一個線程訪問便可,所以Java引入了同步代碼快的策略,以提升性能。 多線程

注意: 性能

在使用synchronized關鍵字時候,應該儘量避免在synchronized方法或synchronized塊中使用sleep或者yield方法,由於synchronized程序塊佔有着對象鎖,你休息那麼其餘的線程只能一邊等着你醒來執行完了才能執行。不但嚴重影響效率,也不合邏輯。
一樣,在同步程序塊內調用yeild方法讓出CPU資源也沒有意義,由於你佔用着鎖,其餘互斥線程仍是沒法訪問同步程序塊。固然與同步程序塊無關的線程能夠得到更多的執行時間。
相關文章
相關標籤/搜索