精华帖 (0) :: 良好帖 (3) :: 新手帖 (2) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-08
最后修改:2011-06-08
这么多人的回复都在单例上纠结,这个iteye上的讨论已经很多了,也有很好的总结。
比如这个: 单例的七种实现方式: http://cantellow.iteye.com/blog/838473 倒是java的内存可以多研究研究,推荐一个: http://www.iteye.com/topic/802573 其实我发帖的原因,对他们这块的理解不清楚确实有不满。 但是我觉得这么优秀的人,做的更多的应该是多打基础,帮助大家提升。 不是随随便便按照自己的逻辑去臆造一些词语,而且是会贻笑大方的词语。 |
|
返回顶楼 | |
发表时间:2011-06-08
我的看法是,可能那几位负责人的技术更新没有跟上...
|
|
返回顶楼 | |
发表时间:2011-06-08
xfei6868 写道 听到了这样一句话,“你的类是单例的,我调用其中的方法的话会阻塞的。”。
如果单例的实现是用同步实现的,那么在多线程环境下取得实例,必须会阻塞,调用方法自然也就阻塞 引用 经常逛iteye还没见过有人说过这样的说法,阻塞不阻塞是是不是同步的问题,没听说过跟单例有什么关系。就算多线程,一般单例类肯定要保证线程安全的,而且方法本身是线程安全的(非可变类)。 “而且方法本身是线程安全的(非可变类)。”没看懂 保证方法线程安全,这个字面意思太广了 |
|
返回顶楼 | |
发表时间:2011-06-08
leibos 写道 xfei6868 写道 今天听小组的几个负责人讨论的时候,听到了这样一句话,“你的类是单例的,我调用其中的方法的话会阻塞的。”。几个人讨论的十分热烈,非常的正式。小鸟本人也不好在其中插嘴,一个各方面能力不受认可的人随便插嘴可能更会引来围攻和记很。名牌大学研究生和工作好多年的高手就这这样热烈的讨论着。
经常逛iteye还没见过有人说过这样的说法,阻塞不阻塞是是不是同步的问题,没听说过跟单例有什么关系。就算多线程,一般单例类肯定要保证线程安全的,而且方法本身是线程安全的(非可变类)。 来的时候问会不会多线程和socket,说没做过这样的项目,他们很看不起!当时认为一个个应该都是牛人,觉得有东西可以研究了,现在看到多线程的代码中这样的实现。 1.实现单例懒汉模式时根本不加锁,在多线程环境下就算加锁都会出问题的模式他们居然就这么简单实现了。 2.多线程中很多判断list的size是否为0的判断,再操作,这样同样不判断取出来对象是否为null的话一样会出错。 3.多线程中使用计数器,还用普通的i++这样,不知道有原子库吗? 失望!这么好的学校,这么高的工资,貌似很好的口才,而且很重要的项目。 慢慢走,慢慢看,何时能言,何时能坦言。 引用 “你的类是单例的,我调用其中的方法的话会阻塞的。”。几个人讨论的十分热烈,非常的正式。
1.方法加了同步sychronized,当然会阻塞其它的线程,这个有什么疑问吗?我觉得人家讨论的没有错。是不是你理解阻塞这个词有偏差? 一般的singleton lazy load,简单在方法上加同步标识,自然会阻塞,性能不高。他们谈论的可能是优化单例方法,比如可以采用volatile+double checked的机制,这个很正常呀,有什么好大惊小怪的。 2.null的话,自然会抛出runtime exception.而list size是否为0,更应该是一种业务异常。如果说采用aop拦截,这些都是可行的。要看你们拍板的人怎么定义异常架构和处理机制了。 3.那没有原子库之前,大家都是怎么写的?用i++怎么不行了?只要人家能保证线程安全。不能说你用了最新的东西,就是最好的吧,毕竟原来有很多遗留系统,要通盘考虑的。 本来不想说的,又废话了几句。你现在应该是多和大家沟通,了解别人的想法,如果真有不足,就提出来,不要怕被bs.如果你很断定他们是错的,就说出来。人总是在bs中成长起来的。 同意你的观点,这样才像跟过项目的,能入team的,果然符合你的薪资。 一篇外刊上的《程序员的七大毛病》中,第一大就是: 1.所有人的代码都写得很烂,除了我的,当然包括读者你的,前任留下的... ... |
|
返回顶楼 | |
发表时间:2011-06-08
Technoboy 写道 xfei6868 写道 听到了这样一句话,“你的类是单例的,我调用其中的方法的话会阻塞的。”。
如果单例的实现是用同步实现的,那么在多线程环境下取得实例,必须会阻塞,调用方法自然也就阻塞 引用 经常逛iteye还没见过有人说过这样的说法,阻塞不阻塞是是不是同步的问题,没听说过跟单例有什么关系。就算多线程,一般单例类肯定要保证线程安全的,而且方法本身是线程安全的(非可变类)。 “而且方法本身是线程安全的(非可变类)。”没看懂 保证方法线程安全,这个字面意思太广了 是指 使用单例的其他方法,不是取得单例的那个静态方法。 对于非可变类来说,方法本身是线程安全的,这应该是没错的。 比如,一个全是局部变量的方法,没有引入任何实例变量肯定是线程安全的。 |
|
返回顶楼 | |
发表时间:2011-06-08
wuzaizhong283 写道 leibos 写道 xfei6868 写道 今天听小组的几个负责人讨论的时候,听到了这样一句话,“你的类是单例的,我调用其中的方法的话会阻塞的。”。几个人讨论的十分热烈,非常的正式。小鸟本人也不好在其中插嘴,一个各方面能力不受认可的人随便插嘴可能更会引来围攻和记很。名牌大学研究生和工作好多年的高手就这这样热烈的讨论着。
经常逛iteye还没见过有人说过这样的说法,阻塞不阻塞是是不是同步的问题,没听说过跟单例有什么关系。就算多线程,一般单例类肯定要保证线程安全的,而且方法本身是线程安全的(非可变类)。 来的时候问会不会多线程和socket,说没做过这样的项目,他们很看不起!当时认为一个个应该都是牛人,觉得有东西可以研究了,现在看到多线程的代码中这样的实现。 1.实现单例懒汉模式时根本不加锁,在多线程环境下就算加锁都会出问题的模式他们居然就这么简单实现了。 2.多线程中很多判断list的size是否为0的判断,再操作,这样同样不判断取出来对象是否为null的话一样会出错。 3.多线程中使用计数器,还用普通的i++这样,不知道有原子库吗? 失望!这么好的学校,这么高的工资,貌似很好的口才,而且很重要的项目。 慢慢走,慢慢看,何时能言,何时能坦言。 引用 “你的类是单例的,我调用其中的方法的话会阻塞的。”。几个人讨论的十分热烈,非常的正式。
1.方法加了同步sychronized,当然会阻塞其它的线程,这个有什么疑问吗?我觉得人家讨论的没有错。是不是你理解阻塞这个词有偏差? 一般的singleton lazy load,简单在方法上加同步标识,自然会阻塞,性能不高。他们谈论的可能是优化单例方法,比如可以采用volatile+double checked的机制,这个很正常呀,有什么好大惊小怪的。 2.null的话,自然会抛出runtime exception.而list size是否为0,更应该是一种业务异常。如果说采用aop拦截,这些都是可行的。要看你们拍板的人怎么定义异常架构和处理机制了。 3.那没有原子库之前,大家都是怎么写的?用i++怎么不行了?只要人家能保证线程安全。不能说你用了最新的东西,就是最好的吧,毕竟原来有很多遗留系统,要通盘考虑的。 本来不想说的,又废话了几句。你现在应该是多和大家沟通,了解别人的想法,如果真有不足,就提出来,不要怕被bs.如果你很断定他们是错的,就说出来。人总是在bs中成长起来的。 同意你的观点,这样才像跟过项目的,能入team的,果然符合你的薪资。 一篇外刊上的《程序员的七大毛病》中,第一大就是: 1.所有人的代码都写得很烂,除了我的,当然包括读者你的,前任留下的... ... 我倒是觉得他说的不对! 首先: 1.还是单例跟阻塞没关系! singleton lazy load 这个我已经说过任何线程安全的标识都没加,其中有的帖子也投谈论过。 关于方法阻塞指的是使用单例中的其他方法。还有至于sychronized阻塞的问题跟单例 没有关系。任何一个考虑多线程环境中使用的对象并且是非安全的 ,都要保证线程下安全策略。 2. 一个抛异常的处理能代替代码的安全的实现吗? 可以说在多线程map取值的情况下,判断size是否为0并不重要,判断取值对象是否为null最重要。不要选一个没有意义的非要写在代码中,而一个很重要的导致运行时异常的却一直不去管理。 3.之前用i++当然可以,可能是我没说的原因,i++的方法根本没有sychronized标识。 我都是尽量理解别人代码的人,比如他们都是写一些空方法让我去实现,我都是努力去实现的,在走不通的地方才去沟通才去让他们修改的。不知道 他们考虑过他们空方法走的流程理通过没,经常修改,我然后从新实现。写一些工具类也是不会写了,也是随便写几个空方法留着我实现。 相反,如果我自己写的一个类或者几个类 ,还没听我讲解就觉得我这不对那不对,我说了原理之后总是才明白。当然我也有很多妥协的时候,要做一些修改。 |
|
返回顶楼 | |
发表时间:2011-06-08
呵呵,单列跟阻塞的确没有一点关系。
|
|
返回顶楼 | |
发表时间:2011-06-08
最后修改:2011-06-08
joygarden 写道 star022 写道 public class Singleton {
private static final Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singleton getInstance() { return INSTANCE; } } 如果不涉及到共享资源的访问,单例为何还需要枷锁? public class Singleton { private static Singleton instance = null; public synchronized static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 如果采用按需创建单例模型就需要同步 防止多线程创建多个对象 你说的按需创建单例模型,只是将单例复杂化了,性能也受到影响,而且很难明确什么场景需要这样做单例; 如果没有必要,那就在classloader加载类的时候,单例就成形好了。 |
|
返回顶楼 | |
发表时间:2011-06-08
单例+线程安全==>阻塞?
不知理解的对不对 不过如果不是可变类的话,就不会导致线程间的不同步啊。就不用考虑线程安全了? 就不会阻塞了呗,是不是呢? 呵呵 大家多拍拍啊 |
|
返回顶楼 | |
发表时间:2011-06-08
恩是滴,呵呵
leibos 写道 xfei6868 写道 今天听小组的几个负责人讨论的时候,听到了这样一句话,“你的类是单例的,我调用其中的方法的话会阻塞的。”。几个人讨论的十分热烈,非常的正式。小鸟本人也不好在其中插嘴,一个各方面能力不受认可的人随便插嘴可能更会引来围攻和记很。名牌大学研究生和工作好多年的高手就这这样热烈的讨论着。
经常逛iteye还没见过有人说过这样的说法,阻塞不阻塞是是不是同步的问题,没听说过跟单例有什么关系。就算多线程,一般单例类肯定要保证线程安全的,而且方法本身是线程安全的(非可变类)。 来的时候问会不会多线程和socket,说没做过这样的项目,他们很看不起!当时认为一个个应该都是牛人,觉得有东西可以研究了,现在看到多线程的代码中这样的实现。 1.实现单例懒汉模式时根本不加锁,在多线程环境下就算加锁都会出问题的模式他们居然就这么简单实现了。 2.多线程中很多判断list的size是否为0的判断,再操作,这样同样不判断取出来对象是否为null的话一样会出错。 3.多线程中使用计数器,还用普通的i++这样,不知道有原子库吗? 失望!这么好的学校,这么高的工资,貌似很好的口才,而且很重要的项目。 慢慢走,慢慢看,何时能言,何时能坦言。 引用 “你的类是单例的,我调用其中的方法的话会阻塞的。”。几个人讨论的十分热烈,非常的正式。
1.方法加了同步sychronized,当然会阻塞其它的线程,这个有什么疑问吗?我觉得人家讨论的没有错。是不是你理解阻塞这个词有偏差? 一般的singleton lazy load,简单在方法上加同步标识,自然会阻塞,性能不高。他们谈论的可能是优化单例方法,比如可以采用volatile+double checked的机制,这个很正常呀,有什么好大惊小怪的。 2.null的话,自然会抛出runtime exception.而list size是否为0,更应该是一种业务异常。如果说采用aop拦截,这些都是可行的。要看你们拍板的人怎么定义异常架构和处理机制了。 3.那没有原子库之前,大家都是怎么写的?用i++怎么不行了?只要人家能保证线程安全。不能说你用了最新的东西,就是最好的吧,毕竟原来有很多遗留系统,要通盘考虑的。 本来不想说的,又废话了几句。你现在应该是多和大家沟通,了解别人的想法,如果真有不足,就提出来,不要怕被bs.如果你很断定他们是错的,就说出来。人总是在bs中成长起来的。 |
|
返回顶楼 | |