【问题标题】:Java local variable Thread SafetyJava 局部变量线程安全
【发布时间】:2017-03-07 02:02:32
【问题描述】:

我是多线程的新手,我很困惑这个方法是否是线程安全的,因为我没有在 HttpURLConnection conn 上做一个新的...... .....................

      protected byte[] someMethod(Authenticator authenticator, String url, boolean doPost) throws Exception {
    try {
      URL aUrl = new URL(url);
      strBldr = new StringBuilder();
      AuthenticatedURL.Token token = new AuthenticatedURL.Token();
      TestConnectionConfigurator connConf = new TestConnectionConfigurator();
      AuthenticatedURL authUrl = new AuthenticatedURL(authenticator, connConf);
      HttpURLConnection conn = authUrl.openConnection(aUrl, token);
      if (!connConf.invoked)
          throw new IOException("failed to invoked");
      String tokenStr = token.toString();
      if (doPost) {
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
      }
      conn.setRequestProperty("Accept", "application/octet-stream");
      conn.setDoOutput(true);
      conn.connect();

      if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {

          BufferedInputStream in = new BufferedInputStream(
                            conn.getInputStream());

            ByteArrayOutputStream byteArraySt = new ByteArrayOutputStream();
               int counter;
               while ((counter = in.read()) != -1) {
                   byteArraySt.write(counter);
               }
               byte [] bArray = new byte[byteArraySt.toByteArray().length];
               bArray = byteArraySt.toByteArray();


            in.close();
            return bArray;
        }

【问题讨论】:

  • 关于线程安全的更多信息:javaworld.com/article/2076747/core-java/…
  • 如果所有变量都是本地的并且保持这种状态,线程安全问题就不可能出现。为什么将doOutput 设置为true,然后没有输出?

标签: java multithreading thread-safety


【解决方案1】:

作为编写线程安全代码的一般规则,您必须关注可变共享状态。局部变量不共享,因此不必担心。

您的代码应该是线程安全的,但您应该检查传递给方法(因此可以由不同线程共享)的 authenticator 对象是否实际上是线程安全的。

【讨论】:

  • 感谢您的回复。我正在从另一种方法传递“新身份验证器”。并且它没有被声明为实例变量
  • 我的另一个问题是,“conn”不是共享对象吗?
  • @private5181 这是一个方法局部变量。
  • conn 不是共享对象,因为它是在方法中创建的,并且不会从方法中逃脱。
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多