安卓廣播防Java單例模式,synchronized關鍵字的使用。
public final class NotificationReceiver extends BroadcastReceiver { private static final String LOGTAG = LogUtil .makeLogTag(NotificationReceiver.class); private final static Object syncLock = new Object(); private static NotificationReceiver notificationReceiver; private NotificationReceiver() { } public static NotificationReceiver getInstance(){ // synchronized同步塊處括號中的鎖定對象采用的是一個無關的Object類實例。 // 將它作為鎖而不是通常synchronized所用的this,其原因是getInstance方法是一個靜態方法, // 在它的內部不能使用未靜態的或者未實例化的類對象(避免空指針異常)。 // 同時也沒有直接使用instance作為鎖定的對象,是因為加鎖之時,instance可能還沒實例化(同樣是為了避免空指針異常)。 if (notificationReceiver == null) { synchronized (syncLock) { if(notificationReceiver == null) notificationReceiver = new NotificationReceiver(); } } return notificationReceiver; } }
單例類中不建議將getInstance方法修飾為synchronized方法,其原因是一旦這樣做了,這種做法會在每次調用getInstance方法時,都需要加鎖,相比效率更低。
最後更新:2017-04-03 05:40:07