论坛首页 Java企业应用论坛

这样的话都能创造:“单例的方法的话会阻塞的”

浏览 27448 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-06-06   最后修改:2011-06-09
OO
    今天听小组的几个负责人讨论的时候,听到了这样一句话,“你的类是单例的,我调用其中的方法的话会阻塞的。”。几个人讨论的十分热烈,非常的正式。小鸟本人也不好在其中插嘴,一个各方面能力不受认可的人随便插嘴可能更会引来围攻和记很。名牌大学研究生和工作好多年的高手就这这样热烈的讨论着。

    经常逛iteye还没见过有人说过这样的说法,阻塞不阻塞是是不是同步的问题,没听说过跟单例有什么关系。就算多线程,一般单例类肯定要保证线程安全的,而且方法本身是线程安全的(非可变类)。
   
    来的时候问会不会多线程和socket,说没做过这样的项目,他们很看不起!当时认为一个个应该都是牛人,觉得有东西可以研究了,现在看到多线程的代码中这样的实现。

1.实现单例懒汉模式时根本不加锁,在多线程环境下就算加锁都会出问题的模式他们居然就这么简单实现了。

2.多线程中很多判断list的size是否为0的判断,再操作,这样同样不判断取出来对象是否为null的话一样会出错。

3.多线程中使用计数器,还用普通的i++这样,不知道有原子库吗?

    失望!这么好的学校,这么高的工资,貌似很好的口才,而且很重要的项目。

    慢慢走,慢慢看,何时能言,何时能坦言。


补充:

看来当时冲动写的不是太清楚,好像有些人能理解,有些人就是理解不了。

重申阻塞跟单例没有关系,不管是不是单例只跟对象所处的环境是不是多线程,其需要调用的方法是不是线程安全,是否做了相关的线程同步。用“单例-->阻塞”这个逻辑是绝对错误的!有些高手理解的说可能是我没理解,而可能是在×××情况语境下,我没理解他们的真意,很遗憾的说他们就是这个意思,没有其他扩展的本意。


从新定义一些我上面写的三个问题。

1. 多线程下下面的代码绝对是错误的,你愿意不愿意他都是错误的:


public class Singleton {
    private static Singleton INSTANCE;

    private Singleton() {
    }

    public static Singleton getInstance() {
         if (INSTANCE == null) {
              INSTANCE = new Singleton();
         }
        return INSTANCE;
    }
}

关于其他的好的方式或比较就不多说了,下面讨论的有。
2. 多线程下,并发包的数据结构中。
copyonwritearraylist 的 list.size() 和  ConcurrentHashMap 的containsKey方法在多线程下为了取值而先做到判断是危险的(不能说没有作用,应为if一下也没用多长时间,但是高并发下,很可能出问题)。比如:
if (concurrentHashMap.containsKey("key")) {   //concurrentHashMap是多线程共用的成员变量。
     Objecgt obj = concurrentHashMap.get("key");
     .....
}    


因为这样肯定还是不行的,还要最好这样:

if (concurrentHashMap.containsKey("key")) {   //concurrentHashMap是多线程共用的成员变量。
     Objecgt obj = concurrentHashMap.get("key");
     if(obj != null) {
          .....
     }
}    


其实反而这样就可以了无需containsKey:

   //concurrentHashMap是多线程共用的成员变量。
     Objecgt obj = concurrentHashMap.get("key");
     if(obj != null) {
          .....
     }


3. 关于计数器:这样当然也没有错:

public synchronized int getNext() {
    return i++;
}

但是如果写成这样你说错不错呢?
public int getNext() {
    return i++;
}



另外 对于多线程很多理解根本就有问题,比如一个方法没有传入值,完全是局部变量,就因为是static方法就加synchronized 这有什么必要啊。

看来我有点明白了,他们认为一旦是被公用的方法在多线程下就应该加synchronized。
一旦是单例的就是一个对象“能力”不够要阻塞。(我也创造名词了)

而且一边说用单线程慢,一边说 很多地方要一个个加锁,那我想估计比单线程还要慢的多!

根本都不理解机制,还有更搞笑跟多线程没关系的问题,都不好意思说了 ,不说了。
   发表时间:2011-06-06  
看来你基础不错
现在很多人都是这样,虽然工作了好多年,但有些基础还真只知道皮毛
别鄙视了,走好自己的路,让他们争论去吧!
0 请登录后投票
   发表时间:2011-06-07  
打好基础,把自己认为对的东西引入到项目中,让实践去检验一切吧~~
0 请登录后投票
   发表时间:2011-06-07  
  单例的多线程同步,建议你看看这篇文章吧 http://freish.iteye.com/blog/1008304
0 请登录后投票
   发表时间:2011-06-07  
正是因为单例,才会阻塞吧。
0 请登录后投票
   发表时间:2011-06-07  
不出bug,不解决bug,不拉长项目时间,怎么显示水平,怎么来钱
0 请登录后投票
   发表时间:2011-06-07  
你知道问题所在,可对方可能限于当前理解,所以需要的引发他们自己发现问题。
这个技巧是一个挑战阿
0 请登录后投票
   发表时间:2011-06-07  
也许他有synchronized
0 请登录后投票
   发表时间:2011-06-07  
很浮躁...
0 请登录后投票
   发表时间:2011-06-07  
supben 写道
正是因为单例,才会阻塞吧。

单例跟阻塞没有一点关系,看看java内存模型就知道了。
0 请登录后投票
论坛首页 Java企业应用版

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