關於單例模式,主要是為了乙個類每次在使用它的例項時,都是同乙個例項物件。
單例模式一
public class mysingleton
public static mysingleton getinstance()
}
上述的單例模式**一定是執行緒安全的,並且每次呼叫都會返回同乙個物件,執行緒安全的原因是,靜態變數是在類的初始化過程當中賦值,這個類在呼叫的時候,如果沒有對類進行初始化,就會進行初始化。唯一的缺點就是,如果我們程式當中一直沒有呼叫getinstance方法,但是我們對這個類進行了初始化,會占用一定的記憶體空間,因此這種實現方式顯然不是最優的,
單例模式二
public class mysingleton
static
public static mysingleton getinstance()
}
這個方式的實現和上面第乙個的方式實現方式基本上一樣,都是屬於在類初始化時候進行了物件的例項化,但是有可能初始化的時候,我們並沒有使用getinstance方法,因此就造成了空間上的浪費。注:靜態變數和靜態**塊都會在類初始化的時候盡心載入。
單例三由於上面兩個方式都存在記憶體浪費的一種情況,那我們就設計一種,在使用到這個物件的時候,在進行例項化的方式
public class mysingleton
public static mysingleton getinstance()
return instance;
} }
很明顯這種方式最大的問題就是執行緒不安全,考慮到執行緒安全,就有了例項四的實現方式,直接在方法上加synchronious
單例四
public class mysingleton
public synchronized static mysingleton getinstance()
} catch (interruptedexception e)
return instance;
} }
這種方式呢,即實現了執行緒安全,又省了空間,但是呢,也有它的問題synchronous這個鎖加的範圍太大了,那麼接下來就有了下面的,同步**塊,只對需要加鎖的地方進行加鎖,用不到的都不加鎖。
單例五
public class mysingleton
public static mysingleton getinstance()
}
} catch (interruptedexception e)
return instance;
} }
這個看起來已經很完美了,寫個**測試下
class mythread extends thread
}---------------------------------------------
public static void main(string args)
for(int i = 0; i < thread.length; i++ )
}
上述列印出來的hash值並不相同,原因在於雖然我們對建立部分進行了加鎖,但是需要二次檢查
單例六
public class mysingleton
public static mysingleton getinstance()
} }
} catch (interruptedexception e)
return instance;
} }
這種情況下才能保證每次列印出來的物件都是同乙個物件。但是以上我們介紹的所有的實現方式,在序列化和反序列化的時候,是否還能保證物件相同,我們看下測試**
public static void main(string args) catch (filenotfoundexception e) catch (ioexception e)
try catch (filenotfoundexception e) catch (ioexception e) catch (classnotfoundexception e)
}
這時候列印出來結果hash值並不相同,所以之前的單例實現還需繼續修改,在mysingleton方法當中實現readresolve方法即可
//該方法在反序列化時會被呼叫,該方法不是介面定義的方法,有點兒約定俗成的感覺
protected object readresolve() throws objectstreamexception
單例七
使用靜態內部類
public class mysingleton implements serializable
private mysingleton(){}
public static mysingleton getinstance()
}
靜態內部類不需要加鎖,同時也能保證執行緒安全而且也不會浪費記憶體空間,原因在於,外部類在初始化的時候,如果沒有使用到內部類,是不會對內部類進行初始化,只有當我們顯示呼叫靜態內部的靜態變數或者靜態方法時,才會對靜態內部類進行初始化。
這裡沒有給出列舉的實現方式。
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...