首页 技术 正文
技术 2022年11月19日
0 收藏 571 点赞 2,557 浏览 2254 个字

  下面代码是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开始增加,那这个问题便作罢。)

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

上一篇: json转csv
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,581
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918