下面代码是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开始增加,那这个问题便作罢。)
嗯,现在就三点不太明白。希望来到我博客的朋友能帮我解答,或者明白的朋友可以留下联系方式,我将感激不尽。