當它鎖定一個方法或一個程式碼區塊的時候,同一時刻最多只有一個執行緒執行這段程式碼。當兩個並發執行緒存取同一個物件object中的這個加鎖同步程式碼區塊時,一個時間內只能有一個執行緒執行。另一個執行緒必須等待目前執行緒執行完這個程式碼區塊以後才能執行該程式碼區塊。
那問題來了,如果兩個執行緒存取的是這個物件的不同實例,還會阻塞嗎?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
synchronized的用法有以下三種
指定物件加鎖。類似於synchronized (instance) {}。
直接作用於實例方法。相當於對目前實例加鎖,進入同步方法前要取得目前實例的鎖。
直接作用於靜態方法。相當於對目前類別加鎖,進入同步方法前取得目前類別的鎖。
對於上面的1、2.必須是同一物件或同一實例時才會使執行緒阻塞。
鎖是加在物件實例上的。加在不同物件上的鎖是不會互相影響的。兩個線程訪問兩個不同對象,是不會互相阻塞的。
synchronized的用法有以下三種
指定物件加鎖。類似於synchronized (instance) {}。
直接作用於實例方法。相當於對目前實例加鎖,進入同步方法前要取得目前實例的鎖。
直接作用於靜態方法。相當於對目前類別加鎖,進入同步方法前取得目前類別的鎖。
對於上面的1、2.必須是同一物件或同一實例時才會使執行緒阻塞。
鎖是加在物件實例上的。加在不同物件上的鎖是不會互相影響的。兩個線程訪問兩個不同對象,是不會互相阻塞的。