Java 在主线程上声明的独立线程内实例化变量,好还是坏?
注意这里显示的代码,我在MsgAndPack类中声明了BufferedOutputStream之类的变量,随后在一个单独的线程中,在public void run()之后,我实例化了这些相同的变量 这是不好的做法还是有任何隐患 我应该把这两个东西放在新创建的线程的内部或外部的相同位置吗Java 在主线程上声明的独立线程内实例化变量,好还是坏?,java,android,multithreading,Java,Android,Multithreading,注意这里显示的代码,我在MsgAndPack类中声明了BufferedOutputStream之类的变量,随后在一个单独的线程中,在public void run()之后,我实例化了这些相同的变量 这是不好的做法还是有任何隐患 我应该把这两个东西放在新创建的线程的内部或外部的相同位置吗 public class MsgAndPack implements Runnable { BufferedInputStream bistr; BufferedOutpu
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;
首先,没有像“变量声明的线程”这样的东西。实例化和访问问题,而不是声明位置-声明没有代码 若您正在运行中实例化这些变量,并且只在运行中使用它们,那个么为什么不在运行中声明它们呢?这将是最简单、最安全的解决方案 在类级别声明它们意味着您将从多个方法访问它们。如果您不需要它,那么无论是谁读代码都会感到困惑 此外,您还将它们声明为包本地,这表明此类之外的东西可以访问它们。这是不安全的——这意味着它们可以由多个线程共享,这会造成很多麻烦,因为流是有状态的,而不是线程安全的 总之,只要在一个线程中初始化和引用这些流,在类级别声明这些流本身并没有错,但它非常脆弱。在一个线程中初始化并在另一个线程中访问,至少需要使它们具有易变性(另一个线程可能无法获得值更新)。因此,始终使用尽可能小的范围
如果您的目的是在线程之间共享某些字段,请确保对这些字段的访问是正确同步的(同步的、易失性的),或者它们本身是线程安全的。首先,没有“变量声明的线程”这样的事。实例化和访问问题,而不是声明位置-声明没有代码 若您正在运行中实例化这些变量,并且只在运行中使用它们,那个么为什么不在运行中声明它们呢?这将是最简单、最安全的解决方案 在类级别声明它们意味着您将从多个方法访问它们。如果您不需要它,那么无论是谁读代码都会感到困惑 此外,您还将它们声明为包本地,这表明此类之外的东西可以访问它们。这是不安全的——这意味着它们可以由多个线程共享,这会造成很多麻烦,因为流是有状态的,而不是线程安全的 总之,只要在一个线程中初始化和引用这些流,在类级别声明这些流本身并没有错,但它非常脆弱。在一个线程中初始化并在另一个线程中访问,至少需要使它们具有易变性(另一个线程可能无法获得值更新)。因此,始终使用尽可能小的范围 如果您的目的是在线程之间共享某些字段,请确保对这些字段的访问是正确同步的(同步的、易失的),或者它们本身是线程安全的