关于FastDFS Java客户端源码中的一个不太明白的地方

  下面代码是package org.csource.fastdfs下TrackerGroup.java文件中靠近结束的一段代码,我下载的这个源码的版本是1.24。

/**
* return connected tracker server
* @return connected tracker server, null for fail
*/
    public TrackerServer getConnection(int serverIndex) throws IOException
    {
        Socket sock = new Socket();
        sock.setReuseAddress(true);
        sock.setSoTimeout(ClientGlobal.g_network_timeout);
        //将此套接字连接到服务器,并指定一个超时值。
        sock.connect(this.tracker_servers[serverIndex], ClientGlobal.g_connect_timeout);
        return new TrackerServer(sock, this.tracker_servers[serverIndex]);
    }

/**
* return connected tracker server
* @return connected tracker server, null for fail
*/
    public TrackerServer getConnection() throws IOException
    {
        int current_index;

        synchronized(this.lock)
        {
            this.tracker_server_index++;
            if (this.tracker_server_index >= this.tracker_servers.length)
            {
                this.tracker_server_index = 0;
            }

            current_index = this.tracker_server_index;
        }

        try
        {
            return this.getConnection(current_index);
        }
        catch(IOException ex)
        {
            System.err.println("connect to server " + this.tracker_servers[current_index].getAddress().getHostAddress() + ":" + this.tracker_servers[current_index].getPort() + " fail");
            ex.printStackTrace(System.err);
        }

      for (int i=0; i<this.tracker_servers.length; i++)
      {
          if (i == current_index)
          {
              continue;
          }

            try
            {
                TrackerServer trackerServer = this.getConnection(i);

                synchronized(this.lock)
                {
                    if (this.tracker_server_index == current_index)
                    {
                        this.tracker_server_index = i;
                    }
                }

                return trackerServer;
          }
          catch(IOException ex)
          {
              System.err.println("connect to server " + this.tracker_servers[i].getAddress().getHostAddress() + ":" + this.tracker_servers[i].getPort() + " fail");
              ex.printStackTrace(System.err);
          }
      }

      return null;
    }

  这个地方有两个getConnection函数,无参的来调用有参的。无参的getConnection函数被package org.csource.fastdfs.test下的Test.java文件所调用,用来进行连接。  

  我不懂的地方是,在那个无参的getCOnnection函数中,第一个synchronized块结束之后,current_index = this.tracker_server_index这样一赋值,然后这两个变量是肯定相等了,接着try里面这个无参的函数去调用有参的函数。接着是下面的for循环,try的部分,那个synchronized部分是不是不会执行?我认为是不会执行的,因为上面部分已经有了一个synchronized,也就是这个进程已经被锁,所以直接返回给调用该函数的test文件一个trackerServer对象。可以猜想后面如果再来一个请求,这个过程也还是这样的。

  我想问几点:

  1.我之前说第二个synchronized部分不会执行这个说法对么?

  2.这个进程锁什么时候结束,是不是返回给test文件一个trackerServer对象之后就结束了?或者是。。

  3.下面的那个for循环部分每次都是从0开始,这个不会有问题吗?如果后面再来个请求,因为之前的请求已经建立,那现在又从0开始之前请求不是还要再来一遍?(public int tracker_server_index  这个域值我认为它是一直在增加的,所以我才会对总是从0开始抱有困惑,如果这个域值在每次调用的时候都从0开始增加,那这个问题便作罢。)

  嗯,现在就三点不太明白。希望来到我博客的朋友能帮我解答,或者明白的朋友可以留下联系方式,我将感激不尽。

上一篇:spark1.6配置sparksql 的元数据存储到postgresql中


下一篇:【转】到底EJB是什么