关于synchronized,单例模式

lai178 2010-04-21 09:49:54
public class AppContext {

private static AppContext instance;

private AbstractApplicationContext appContext;

public synchronized static AppContext getInstance() {

if (instance == null) {

instance = new AppContext();

}

return instance;

}

private AppContext() {

this.appContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//applicationContext.xml

}

public AbstractApplicationContext getAppContext() {

return appContext;

}

}


我觉得此处public synchronized static AppContext getInstance() 这样不太好,理由是每次这方法,都要锁住,容易死锁,如网络有有堵塞时,
我认为改成这样较好:
请高手为我解惑.

public class AppContext {

private static AppContext instance=new AppContext();;

private AbstractApplicationContext appContext;

public synchronized static AppContext getInstance() {



return instance;

}

private AppContext() {

this.appContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//applicationContext.xml

}

public AbstractApplicationContext getAppContext() {

return appContext;

}

}
...全文
251 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lai178 2010-04-21
  • 打赏
  • 举报
回复
你们觉得那种好呢?
keeya0416 2010-04-21
  • 打赏
  • 举报
回复
楼主写的是2种不同的实现方式
如果是懒汉式就必须加锁的
楼主觉得加锁不方便的话就用饿汉式 即 你写的第2种方式
aa870816 2010-04-21
  • 打赏
  • 举报
回复
学习了~~~
Mars_Ma_OK 2010-04-21
  • 打赏
  • 举报
回复
比较:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
推荐使用第一种
Mars_Ma_OK 2010-04-21
  • 打赏
  • 举报
回复
更正:分为懒汉式和饿汉式

/*
* 在这个地方使用了懒汉式模式
*/
private static MysqlConnector mysql = null;

private MysqlConnector() {
}

public static MysqlConnector getInstance() {
if (mysql == null) {
mysql = new MysqlConnector();
}
return mysql;
}



饿汉式:
public class Singleton{
private static Singleton singleton = new Singleton ();
private Singleton (){}
public Singleton getInstance(){return singletion;}
}
}
Mars_Ma_OK 2010-04-21
  • 打赏
  • 举报
回复
曾经老师教我们单例模式分饿汉式和饱汗式.

饿汉式就是在最前面new一个实例.在构造函数中retrun出去..就是楼上那种.

饱汉式就是在构造函数中去new..

希望对你有帮助!!!
li445970924 2010-04-21
  • 打赏
  • 举报
回复
private static XX X=new XX();
public XX (){return X}
li445970924 2010-04-21
  • 打赏
  • 举报
回复
单例模式的写法有很多种 我比较喜欢在申明一个静态的对象时就new 对象 在构造方法里直接return 就OK了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧