摘自:https://www.cnblogs.com/caotao0918/p/10699785.html
在多線程的環境中,經常會碰到數據的共享問題,即當多個線程需要訪問同一個資源時,它們需要以某種順序來確保該資源在某--時刻只能被-一個線程使用,否則,程序的運行結果將會是不可預料的,在這種情況下就必須對數據進行同步,例如多個線程同時對同- - 數據進行寫操作,即當線程A需要使用某個資源時,如果這個資源正在被線程B使用,同步機制就會讓線程A-.直等待下去,直到線程B結束對該資源的使用后,線程A才能使用這個資源,由此可見,同步機制能夠保證資源的安全。
要想實現同步操作,必須要獲得每一個線程對象的鎖。獲得它可以保證在同- -時刻只有一-個線程能夠進入臨界區(訪問互斥資源的代碼塊),並且在這個鎖被釋放之前,其他線程就不能再進人這個臨界區。如果還有其他線程想要獲得該對象的鎖,只能進人等待隊列等待。只有當擁有該對象鎖的線程退出臨界區時,鎖才會被釋放,等待隊列中優先級最高的線程才能獲得該鎖,從而進人共享代碼區。
Java語言在同步機制中提供了語言級的支持,可以通過使用synchronized關鍵字來實現同步,但該方法並非“萬金油”,它是以很大的系統開銷作為代價的,I有時候甚至可能造成死鎖,所以,同步控制並非越多越好,要盡量避免無謂的同步控制。實現同步的方式有兩種: i一種是利用同步代碼塊來實現同步;另--種是利用同步方法來實現同步。
異步與非阻塞類似,由於每個線程都包含了運行時自身所需要的數據或方法,因此,在進行輸人輸出處理時,不必關心其他線程的狀態或行為,也不必等到輸人輸出處理完畢才返回。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,異步能夠提高程序的效率。
舉個生活中的簡單例子就可以區分同步與異步了。同步就是你喊我去吃飯,如果聽到了,我就和你去吃飯;如果我沒有聽到,你就不停地喊,直到我告訴你聽到了,我們才一-起去吃飯。異步就是你喊我,然后自己去吃飯,我得到消息后可能立即走,也可能等到下班才去吃飯。