在不同執行緒中傳遞物件,尤其是匿名內部類物件,比如在a執行緒中初始化匿名內部類,傳遞到b執行緒中,在b執行緒中呼叫,相當於b執行緒中呼叫這個匿名內部類對應的外部物件。
不同執行緒呼叫,是主動呼叫這個匿名內部類對應的物件,可能造成併發問題,可以加鎖。
佇列是乙個容器,也在不同執行緒中呼叫,但是因為主要作用是事件通知型別的,也就是說是非同步模式,乙個執行緒中發出這個訊息放到佇列中,另乙個執行緒中去取出訊息並觸發事件,和上面的不同主要是佇列是非同步模式,多用在事件通知,上面是主動呼叫模式。
多執行緒加同步鎖,或者使用單執行緒佇列,都可以解決併發的問題,但是用法不一樣。
android中在不同執行緒中傳遞了handle匿名內部類,但是使用的是佇列呼叫,主要原因是乙個ui程式,在重新整理介面元素的機制上,最好像事件通知一樣,乙個執行緒迴圈取出事件並執行,理論上,不同執行緒中加鎖呼叫handle改變ui也可以做到,但是決定ui顯示的物件,在不同執行緒中實時改變,造成的一些問題可能不好解決,比較複雜。
總結,在解決併發問題時,優先是同步鎖,單執行緒佇列並不是解決多執行緒併發問題的,而是非同步通知的。
內在鎖和同步
每個物件都有乙個與之關聯的內在鎖。按照慣例,乙個執行緒,需要獨佔和一致的乙個物件的字段,在進入這個物件前得需要這個物件的內在鎖,當處理完這些欄位後,需要釋放這些內在鎖。只有有乙個執行緒擁有乙個內在鎖,其他的執行緒就不能獲取這同樣的鎖。當其他試圖獲取這把鎖時將被阻塞。在同步方法中的鎖 當執行緒呼叫同步...
鎖和同步的區別
用法上的不同 synchronized既可以加在方法上,也可以載入特定 塊上,而lock需要顯示地指定起始位置和終止位置。synchronized是託管給jvm執行的,lock的鎖定是通過 實現的,它有比synchronized更精確的執行緒語義。效能上的不同 lock介面的實現類reentrant...
執行緒的同步和鎖
為避免多執行緒對同乙個物件進行操作,對資料造成的破壞。public class tt extends thread override public void run public int takeit int x public static void main string args 非靜態方法同步...