多虛擬機潛在的問題
由于每個進程創建以后,都會擁有獨立的空間,獨立的VM,所以,很多Java特性都會在多進程開發中失效。
1.靜態變量和單例模式完全失效
因為進程間,內存空間是相互獨立的,所以VM方法區內的靜態變量也都是相互獨立的。因為單利模式是基于靜態變量的,所以單例也會失效。在兩個不同進程訪問一個相同類的靜態變量,所得的值未必相同,所以在開發中請避免此類代碼。
2.線程同步機制完全失效
由于Java的同步機制是VM來進行調度的,兩個進程擁有兩個不同的VM,所以,同步也會在多進程開發中失效。synchronized關鍵字、voliate關鍵字等都是基于VM級別的同步,所以請不要跨進程去使用線程同步。比如主進程有個生產者,子進程的消費者是無法正常使用消費功能的,只能通過跨進程通信,讓主進程的消費者去消費,然后再回調。
3.Application會多次創建
每個新進程在創建的時候,都會新建一個Application,所以多進程還會面臨著Application多次創建的問題,onCreate
方法會多次被調用。解決的辦法其實也不是很麻煩,因為Application會多次創建,所以我們可以根據進程名來區分不同的進程,進行不同的初始化,同時,不要在Application中設置過多的靜態變量,導致內存增加。
4.文件讀寫潛在的問題
這里的文件指的泛指所有需要并發訪問的文件,例如:本地文件,數據庫文件,sharepreference等。由于Java中,文件鎖、隊列機制都是VM級別的,所以不同進程訪問同一個文件鎖是不管用的。(通過C++可以實現多進程文件鎖機制,不過不在文本討論范圍內。)所以在實際開發過程中,還是避免多進程同時訪問統一文件,多利用Android中IPC的C/S思想,提供服務,接口調用,避免直接去訪問對方進程的文件或者數據庫,提升設計美感,同時也能提升代碼的穩定性。