這里直接給出幾種懶漢模式的單例多線程安全的寫(xiě)法丙猬。
這種寫(xiě)法就是普通的單例模式,但是是非線程安全的项滑,至于原因依沮,根據(jù)前面的多線程基礎(chǔ)應(yīng)該可以自己總結(jié)出來(lái)。
public class MyObject1 {
private static MyObject1 myobject;//“懶漢模式的”
private MyObject1(){}
public static MyObject1 getInstance(){
//延遲加載
if(myobject != null){
}else{
myobject = new MyObject1();
}
return myobject;
}
}
以下的寫(xiě)法是可以實(shí)現(xiàn)多線程安全的懶漢模式的單例枪狂。
/**
*線程安全的單利模式
*此種方式實(shí)現(xiàn)的單利模式效率不高危喉,但是線程安全
*/
public class MyObject2 {
private MyObject2 myobject;
private MyObject2(){}
synchronized public MyObject2 getInstance(){
if(myobject != null){}else{
myobject = new MyObject2();
}
return myobject;
}
}
方法二:
/**
*使用DCL雙檢查鎖的機(jī)制,在保證線程安全的前提下摘完,有效提高了效率
*/
public class MyObject3 {
private MyObject3 myobject;
private MyObject3(){}
public MyObject3 getInstance(){
if(myobject == null){
synchronized(MyObject3.class){
if(myobject==null){
myobject = new MyObject3();
}
}
}
return myobject;
}
}
方法三:
/**
*使用靜態(tài)內(nèi)置類(lèi)實(shí)現(xiàn)單例模式
*/
public class MyObject4 {
private static class MyObjectHandler{
private static MyObject4 myObject = new MyObject4();
}
private MyObject4(){}
public static MyObject4 getInstance(){
return MyObjectHandler.myObject;
}
}
方法四:
/**
*本例通過(guò)static代碼塊實(shí)現(xiàn)單利模式姥饰,同樣的實(shí)現(xiàn)了線程安全
*/
public class MyObject5 {
private static MyObject5 myobject= null;
private MyObject5(){}
static{
myobject=new MyObject5();
}
public static MyObject5 getInstance(){
return myobject;
}
}
方法五:
import java.sql.Connection;
/**
* 本例通過(guò)enum枚舉數(shù)據(jù)類(lèi)型實(shí)現(xiàn)單利模式
* @author 24540
*
*/
public class MyObject6 {
public enum MyEnumSingleton{
connectionFactory;
private Connection connection;
private MyEnumSingleton(){
System.out.println("創(chuàng)建myObject、對(duì)象");
String url = "jdbc:sqlserver...";
//在這里進(jìn)行一系列的操作
}
public Connection getConnection(){
return connection;
}
}
public static Connection getConnection(){
return MyEnumSingleton.connectionFactory.connection;
}
}