【问题标题】:Instantiating variables inside of separate thread that were declared on main thread, good or bad?在主线程上声明的单独线程内实例化变量,好还是坏?
【发布时间】:2013-09-20 07:26:52
【问题描述】:

注意这里显示的代码,我在 MsgAndPack 类中声明变量,如 BufferedOutputStream,稍后在一个单独的线程中,在 public void run() 之后,我实例化了这些相同的变量。

这是不好的做法还是这样做有什么隐患?

我应该把这两个东西放在新创建的线程内部还是外部的同一个地方?

 public class MsgAndPack implements Runnable {

         BufferedInputStream bistr;
         BufferedOutputStream bostr;
         FileInputStream fistr;
         FileOutputStream fostr;
         DataOutputStream dostr;
         long length;

    @Override
    public void run() {

        if (socket.isConnected()) {

            try {
                file = new File("/mnt/sdcard/JIend.db");
                length = file.length();
                byte[] bytes = new byte[(int) length];

                fistr = new FileInputStream(file);
                bistr = new BufferedInputStream(fistr);
                bostr = new BufferedOutputStream(socket.getOutputStream());
                dostr = new DataOutputStream(bostr); 
                int count;

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    首先,没有像“声明变量的线程”这样的东西。实例化和访问很重要,而不是声明位置 - 没有仅用于声明的代码。

    如果你在 run 中实例化这些变量并且只在 run 中使用它们,为什么不在 run 中声明它们呢?那将是最简单、最安全的解决方案。

    在类级别声明它们表明您将通过一种以上的方法访问它们。如果您不需要它,那么阅读代码的人都会感到困惑。

    此外,您将它们声明为包本地,这表明该类之外的某些东西可以访问它们。这是不安全的——这意味着它们可以被多个线程共享,这会带来很多麻烦,因为流是有状态的,而不是线程安全的。

    总结一下——在类级别声明这些流本身并没有错,只要你在一个线程中初始化和引用它们,但它非常脆弱。在一个线程中初始化并在另一个线程中访问至少需要使它们变得易变(另一个线程可能无法获得值更新)。因此,请始终使用尽可能小的范围。

    如果您的意图在线程之间共享某些字段,请确保对它们的访问正确同步(同步、易失)或者它们本身是线程安全的。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 2018-06-22
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多