Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在主线程上声明的独立线程内实例化变量,好还是坏?_Java_Android_Multithreading - Fatal编程技术网

Java 在主线程上声明的独立线程内实例化变量,好还是坏?

Java 在主线程上声明的独立线程内实例化变量,好还是坏?,java,android,multithreading,Java,Android,Multithreading,注意这里显示的代码,我在MsgAndPack类中声明了BufferedOutputStream之类的变量,随后在一个单独的线程中,在public void run()之后,我实例化了这些相同的变量 这是不好的做法还是有任何隐患 我应该把这两个东西放在新创建的线程的内部或外部的相同位置吗 public class MsgAndPack implements Runnable { BufferedInputStream bistr; BufferedOutpu

注意这里显示的代码,我在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;

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

若您正在运行中实例化这些变量,并且只在运行中使用它们,那个么为什么不在运行中声明它们呢?这将是最简单、最安全的解决方案

在类级别声明它们意味着您将从多个方法访问它们。如果您不需要它,那么无论是谁读代码都会感到困惑

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

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


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

首先,没有“变量声明的线程”这样的事。实例化和访问问题,而不是声明位置-声明没有代码

若您正在运行中实例化这些变量,并且只在运行中使用它们,那个么为什么不在运行中声明它们呢?这将是最简单、最安全的解决方案

在类级别声明它们意味着您将从多个方法访问它们。如果您不需要它,那么无论是谁读代码都会感到困惑

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

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

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