單例和靜態方法的區別?
1.首先明確一下,靜態成員并不是什么程序加載時創建并初始化的,而是類加載時進行。類的加載是第一次真正用到它的時候(拿類new實例或調用它的靜態方法)進行的,而這個加載過程需要將 class 文件中構成類的靜態和實例方法等類的成員的字節碼指令一同加載到內存中,而后要為靜態域分配存儲空間并使用靜態塊對其進行初始化(如果有的話)。在上面例子中,類加載后,所有成員(包括fun和staticfun)的字節碼指令均在內存中了,隨時等待著調用,并且靜態域 s 所占用的存儲空間也用空引用初始化好了。
2.
從內存上來看,當第一次調用 getInstance() 方法時會創建此類的唯一實例(所謂的單例出現),其實也可以在聲明 s 時 new 它的唯一實例,將實例化延后是為了避免類加載后實例使用前內存的浪費。
3.
靜態方法線程是安全的,所謂線程安不安全