日期:2014-05-18  浏览次数:20639 次

多线程例子,求解,是否是线程安全的?
因为要做一个队列,所以写了下面的代码。求大师给讲解一下。
1.set,get方法还需要不需要synchronized了?
2.AllTimeQueue 作为多线程中的单例模式应用,getInstance()方法是不是有必要加synchronized?不是已经进行了final定义gatqInstance了么?
3.BlockingQueue<Long> timeNow是否可以定义为public,这个不是线程安全的队列吗?把域暴露出来应该也没有什么问题吧?

    public class AllTimeQueue  {
private  final  static GameAllTimeQueue gatqInstance = new GameAllTimeQueue();
private  BlockingQueue<Long> timeNow = new  LinkedBlockingQueue<Long>();

private GameAllTimeQueue(){}

public synchronized  GameAllTimeQueue getInstance(){
return gatqInstance;
}

public synchronized void set(BlockingQueue<Long> bq){
timeNow = bq;
}
public synchronized  BlockingQueue<Long> get(){
return timeNow;
}
}

------解决方案--------------------
set要加synchronized
------解决方案--------------------
引用:
Quote: 引用:

set要加synchronized

我的队列是不需要前后顺序的,这也要同步么?自己感觉去掉是不是也可以实现线程安全的?
确定get要还是不要?
BlockingQueue线程安全,所以不需要顺序,就都不用加
------解决方案--------------------
1.set,get方法还需要不需要synchronized了?  
  这种set get 没有意义,怎么搞都不是线程安全的。
  public void set(Long id){  这样是安全的,不需要加sync
        timeNow.add(id);  
    }

2.AllTimeQueue 作为多线程中的单例模式应用,getInstance()方法是不是有必要加  synchronized?不是已经进行了final定义gatqInstance了么?
   应该不会有安全问题,(不过最新研究,说是有问题)


3.BlockingQueue<Long> timeNow是否可以定义为public,这个不是线程安全的队列吗?把域暴露出来应该也没有什么问题吧?
  如放开的话,我就可以这么用:
AllTimeQueue.getInstance().timeNow = null;
大家都爽了。


------解决方案--------------------
哦,那就给分吧。。。
------解决方案--------------------
哦。基本上可以吧。 没太大问题。
------解决方案--------------------
1 无所谓好坏,能满足需求就行。
2 面对问题解决问题,才是最好的进步