锁定老帖子 主题:java线程死锁与内存溢出
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间: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的是不是 双重检查锁定? 这种方法已经不推荐了! |
|
返回顶楼 | |
发表时间:2009-02-17
LZ基础不牢,建议回炉再造
我想lZ经过这次经验和技术一定提升了不少 |
|
返回顶楼 | |
发表时间: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的是不是 双重检查锁定? 这种方法已经不推荐了! 我有点好奇为什么说“双重检查锁定这种方法已经不推荐了!”,能否说明一下?或者给点相关的文章或讨论的链接? |
|
返回顶楼 | |
发表时间:2009-02-18
我也不理解为什么不推荐了,虽说从来没用过单例(自己写)。。。
|
|
返回顶楼 | |
发表时间:2009-02-21
最后修改:2009-02-21
7页的回帖,都是废话多,你们不要老是说LZ的java水平如何如何?你们自己写一套代码出来让你们所谓的“菜鸟”见识一下,别光白话还行?
还什么开源?什么hibernate、ibatis的?这些有什么高级的吗? 难道用了开源,用了JPA就比连接池高级啊?这是一回事吗? LZ是因为遇到了内存溢出问题,但是恰巧搞了连接池结果就正常了?你们怎么就把本贴的主要目的忘记了?光攻击LZ的java水平了,受不了! 楼主,查看一下是不是有大对象嵌套引用,对象树引用过长,内部缓存数据过多,然后来不及回收,如果GC90度下垂似的回收,基本上说明你瞬间缓存了很大的对象,然后GC一回收就这样了。看看session里边有没有缓存一些没用的,或者线程之间缓存了太多的大对象! 或者频繁的创建了临时变量,类似于在常用的功能中使用for循环瞬间创造较大的内存对象。 另外jprofile是可以跟踪对象的数量创建和回收刻度的,你只要截几次图,然后每张之间对比一下就能发现问题了,看看创建的那些对象瞬间增多,然后又被瞬间大批回收掉。 内存溢出基本上平时写代码的时候一点一点的积累,然后到最后一起爆发,然后就轮到我们这些调优的人出场了,靠,慢慢肯吧,想优化好一个系统,比写代码难的多! |
|
返回顶楼 | |
发表时间:2009-02-23
我只看到了连接..没看到池...
真愁人...人家做连接池本来就是为了避免你这个问题... 你呢..写了一个标准的 连接池反向案例..教育大家.. 哈哈.. |
|
返回顶楼 | |
发表时间:2009-02-26
google了一下
发现这个文章里面的连接池使用,比你要好一些,你可以参考一下 http://blog.csdn.net/a_heng/archive/2008/05/17/2453990.aspx 个人觉得,你的问题,是没有把连接池和连接的概念进行比较清晰的区分. |
|
返回顶楼 | |
发表时间:2009-05-14
怎么没人提采用threadlocal自己管理connection呢?不用连接池,比如就用spring的那个基本数据源,每次获取conn就是一个新的conn然后放入threadlocal,每用户一个。即使用连接池,也可以这么用,我就这么写的持久层,没问题。connection必须每用户一个,因为其中可能有事务。
|
|
返回顶楼 | |
发表时间:2009-05-19
很好的经验。
|
|
返回顶楼 | |
发表时间:2009-05-21
......如此代码也能上线
|
|
返回顶楼 | |