免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2500 | 回复: 2
打印 上一主题 下一主题

[FastDFS] 关于FastDFS Java客户端源码中的一个不太明白的地方 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-16 13:20 |只看该作者 |倒序浏览
  1. /**
  2. * return connected tracker server
  3. * @return connected tracker server, null for fail
  4. */
  5.     public TrackerServer getConnection(int serverIndex) throws IOException
  6.     {
  7.         Socket sock = new Socket();
  8.         sock.setReuseAddress(true);
  9.         sock.setSoTimeout(ClientGlobal.g_network_timeout);
  10.         //将此套接字连接到服务器,并指定一个超时值。
  11.         sock.connect(this.tracker_servers[serverIndex], ClientGlobal.g_connect_timeout);
  12.         return new TrackerServer(sock, this.tracker_servers[serverIndex]);
  13.     }
  14.    
  15. /**
  16. * return connected tracker server
  17. * @return connected tracker server, null for fail
  18. */
  19.     public TrackerServer getConnection() throws IOException
  20.     {
  21.         int current_index;
  22.         
  23.         synchronized(this.lock)
  24.         {
  25.             this.tracker_server_index++;
  26.             if (this.tracker_server_index >= this.tracker_servers.length)
  27.             {
  28.                 this.tracker_server_index = 0;
  29.             }
  30.             
  31.             current_index = this.tracker_server_index;
  32.         }
  33.         
  34.         try
  35.         {
  36.             return this.getConnection(current_index);
  37.         }
  38.         catch(IOException ex)
  39.         {
  40.             System.err.println("connect to server " + this.tracker_servers[current_index].getAddress().getHostAddress() + ":" + this.tracker_servers[current_index].getPort() + " fail");
  41.             ex.printStackTrace(System.err);
  42.         }
  43.       
  44.       for (int i=0; i<this.tracker_servers.length; i++)
  45.       {
  46.           if (i == current_index)
  47.           {
  48.               continue;
  49.           }
  50.          
  51.             try
  52.             {
  53.                 TrackerServer trackerServer = this.getConnection(i);
  54.                
  55.                 synchronized(this.lock)
  56.                 {
  57.                     if (this.tracker_server_index == current_index)
  58.                     {
  59.                         this.tracker_server_index = i;
  60.                     }
  61.                 }
  62.                
  63.                 return trackerServer;
  64.           }
  65.           catch(IOException ex)
  66.           {
  67.               System.err.println("connect to server " + this.tracker_servers[i].getAddress().getHostAddress() + ":" + this.tracker_servers[i].getPort() + " fail");
  68.               ex.printStackTrace(System.err);
  69.           }
  70.       }
  71.       
  72.       return null;
  73.     }
复制代码
这个地方有两个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开始增加,那这个问题便作罢。)

论坛徽章:
0
2 [报告]
发表于 2013-09-16 13:24 |只看该作者
上述代码是package org.csource.fastdfs下TrackerGroup.java文件中靠近结束的一段代码,我下载的这个源码的版本是1.24。

论坛徽章:
0
3 [报告]
发表于 2013-09-16 16:18 |只看该作者
怎么都没人回复我帖子一下咧,我知道自己的见解有点挫,但好赖不要让我 帖子沉了么。快来人啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP