- 论坛徽章:
- 0
|
- /**
- * 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开始增加,那这个问题便作罢。) |
|