论坛首页 入门技术论坛

java线程死锁与内存溢出

浏览 36018 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-02-11  
wangneng_001 写道
你那个broker不一定是单例,虽说你那样写看起来像。。。

单例要么在单例类中写一个自身引用并在构造方法中new一个实例赋予引用,给予一个方法getInstance()或其他什么return这个引用以获取单例,不用同步什么什么的,因为此实例在类加载的时候就初始化了,这就是所谓的饿汉式单例模式,但这种模式有个不好的地方就是当出现误操作(比如将此引用设置为null),这个实例你就不可能再实例化了。

还有就是所谓的懒汉式,在getInstance()方法中判断:
private static Factory instance = null;

//此类为单例模式,只能通过此方法获取实例
public static Factory getInstance(){
//双锁检测单例模式
if(instance==null){
synchronized(Factory.class){
if(instance==null){
instance = new Factory();
}
}
}
return instance;
}

ls的是不是
双重检查锁定?
这种方法已经不推荐了!
0 请登录后投票
   发表时间:2009-02-17  
LZ基础不牢,建议回炉再造
我想lZ经过这次经验和技术一定提升了不少
0 请登录后投票
   发表时间:2009-02-18  
jjx333 写道
wangneng_001 写道
你那个broker不一定是单例,虽说你那样写看起来像。。。

单例要么在单例类中写一个自身引用并在构造方法中new一个实例赋予引用,给予一个方法getInstance()或其他什么return这个引用以获取单例,不用同步什么什么的,因为此实例在类加载的时候就初始化了,这就是所谓的饿汉式单例模式,但这种模式有个不好的地方就是当出现误操作(比如将此引用设置为null),这个实例你就不可能再实例化了。

还有就是所谓的懒汉式,在getInstance()方法中判断:
private static Factory instance = null;

//此类为单例模式,只能通过此方法获取实例
public static Factory getInstance(){
//双锁检测单例模式
if(instance==null){
synchronized(Factory.class){
if(instance==null){
instance = new Factory();
}
}
}
return instance;
}

ls的是不是
双重检查锁定?
这种方法已经不推荐了!

我有点好奇为什么说“双重检查锁定这种方法已经不推荐了!”,能否说明一下?或者给点相关的文章或讨论的链接?
0 请登录后投票
   发表时间:2009-02-18  
我也不理解为什么不推荐了,虽说从来没用过单例(自己写)。。。
0 请登录后投票
   发表时间:2009-02-21   最后修改:2009-02-21
7页的回帖,都是废话多,你们不要老是说LZ的java水平如何如何?你们自己写一套代码出来让你们所谓的“菜鸟”见识一下,别光白话还行?
还什么开源?什么hibernate、ibatis的?这些有什么高级的吗?
难道用了开源,用了JPA就比连接池高级啊?这是一回事吗?
LZ是因为遇到了内存溢出问题,但是恰巧搞了连接池结果就正常了?你们怎么就把本贴的主要目的忘记了?光攻击LZ的java水平了,受不了!

楼主,查看一下是不是有大对象嵌套引用,对象树引用过长,内部缓存数据过多,然后来不及回收,如果GC90度下垂似的回收,基本上说明你瞬间缓存了很大的对象,然后GC一回收就这样了。看看session里边有没有缓存一些没用的,或者线程之间缓存了太多的大对象!
或者频繁的创建了临时变量,类似于在常用的功能中使用for循环瞬间创造较大的内存对象。

另外jprofile是可以跟踪对象的数量创建和回收刻度的,你只要截几次图,然后每张之间对比一下就能发现问题了,看看创建的那些对象瞬间增多,然后又被瞬间大批回收掉。

内存溢出基本上平时写代码的时候一点一点的积累,然后到最后一起爆发,然后就轮到我们这些调优的人出场了,靠,慢慢肯吧,想优化好一个系统,比写代码难的多!
0 请登录后投票
   发表时间:2009-02-23  
我只看到了连接..没看到池...

真愁人...人家做连接池本来就是为了避免你这个问题...

你呢..写了一个标准的 连接池反向案例..教育大家..

哈哈..
0 请登录后投票
   发表时间:2009-02-26  
google了一下

发现这个文章里面的连接池使用,比你要好一些,你可以参考一下
http://blog.csdn.net/a_heng/archive/2008/05/17/2453990.aspx

个人觉得,你的问题,是没有把连接池和连接的概念进行比较清晰的区分.

0 请登录后投票
   发表时间:2009-05-14  
怎么没人提采用threadlocal自己管理connection呢?不用连接池,比如就用spring的那个基本数据源,每次获取conn就是一个新的conn然后放入threadlocal,每用户一个。即使用连接池,也可以这么用,我就这么写的持久层,没问题。connection必须每用户一个,因为其中可能有事务。
0 请登录后投票
   发表时间:2009-05-19  
很好的经验。

0 请登录后投票
   发表时间:2009-05-21  
......如此代码也能上线
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics