各位好为什么我加了synchronized好像没起到作用我在服务器端定了一个静态的hashmap用于存放客户端的ip跟socket
synchronized(HashMap.class)
{
   //这段的代码是从HashMap中依次取出socket并向客户端发送命令,关闭客户端的socket连接
}synchronized(HashMap.class)
{//这代码应该是在前面的代码执行完后,再去访问HashMap关闭服务器的每个socket,最后再关闭serversocket
}但是每次执行的时候都有交替,而且后面的好像还先执行,synchronized没有起到作用请各位帮忙看一下

解决方案 »

  1.   

    synchronized(HashMap.class)
    里边应该放你要同步的资源。而你的class是不在你的访问范围的。你试试放置你的HashMap实例。
      

  2.   

    还是一样的,老是后面那个在前面的还没执行完就执行了
    而且 我有一个类把这两个处理部分封装起来classtest,在每个方法里面加上synchronized(this),然后再用classtest.method1();clastest.method2();调用的时候结果还是一样这究竟是怎么回事
      

  3.   

    public class Server{public static HashMap sockets = new HashMap();public static void main(String[] args)throws IOException{try{
       Server server = new Server();
       //向sockets中写数据这段我就省掉了
       //与客户端连接 ,并将客户端的IP跟socket存入sockets中;
       //客户端向服务器的数据发送完了之后,服务器向每个客户端发个指令,关闭socket连接   synchronized(Server.sockets)
    {
       //遍历sockets,并通过socket向每个客户端发一个关闭指令
    }  //发完指令后再关闭服务器端的socket
      synchronized(Server.sockets)
    {
      //sockets,关闭socket,并将关闭的socket从sockets中移出
    }
    }
    }
    程序就是这样
    中间的处理代码省掉了,因为在另外一台电脑 上
       
      

  4.   

    中间的处理程序 是两个线程,都 需要访问sockets这个资源
      

  5.   

    你看看我下面的代码和结果就知道什么原因了import java.util.ArrayList;public class Test { public static void main(String arg[]){

    ArrayList<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");
    list.add("6");
    list.add("7");
    list.add("8");
    list.add("9");
    list.add("10");
      synchronized(list)
    {
     for(String s : list){
     if(Integer.parseInt(s)/2 == 0){
     System.out.println(s);
     }
     
     }
    }
      synchronized(list)
    {
      for(String s : list){
     if(Integer.parseInt(s)/2 != 0){
     System.out.println(s);
     }
     
       }
    }
    }
    }
    结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10两个
      

  6.   

    我还是不太明白 为什么加了synchronized没效果呢,应该是先输出偶数,再输了奇数 ,我的程序搞定 了,加了个标志位来控制,
    但是synchronized为什么在这儿不起作用,我还是不太明白
      

  7.   

    你这种模式存在点问题,你那个模式是类级别的,只是针对一个字节码,你可以考虑用如下的模式 
    Object obj = new Object();
    synchronized(obj)
    {//这代码应该是在前面的代码执行完后,再去访问HashMap关闭服务器的每个socket,最后再关闭serversocket
    }