Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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 如何将volatile变量传递给另一个类?_Java_Multithreading_Volatile - Fatal编程技术网

Java 如何将volatile变量传递给另一个类?

Java 如何将volatile变量传递给另一个类?,java,multithreading,volatile,Java,Multithreading,Volatile,在将一个volatile变量传递给另一个类(都是扩展线程类)时,我是否必须将这个volatile变量作为volatile导入,或者只导入公共定义就足够了 例: 现在,接收volatile变量的类应该使用将receiver变量定义为volatile还是public?像这样 public class B extends Thread{ public volatile int a; public B(int a){ this.a =a ; } } 还是应该这样定

在将一个volatile变量传递给另一个类(都是扩展线程类)时,我是否必须将这个volatile变量作为volatile导入,或者只导入公共定义就足够了

例:

现在,接收volatile变量的类应该使用将receiver变量定义为volatile还是public?像这样

public class B extends Thread{

  public volatile int a;

    public B(int a){
     this.a =a ;
    }
  }
还是应该这样定义

public class B extends Thread{

  public int a;

    public B(int a){
     this.a =a ;
    }
  }
两个类在一段时间内交换变量


非常感谢您的帮助。谢谢

Java是按值传递的。在
B
构造函数中,您没有在
bObj
中存储对
a
对象的
a
字段的引用;您只是在存储值。(换句话说,
B
不是“接收易变变量”;它是接收恰好存储在
volatile
字段中的值。)
a
对象和
B
对象中的
a
字段的值可以独立地更改值


使用您发布的代码,无需将
A.A
声明为
volatile

Java是按值传递的。在
B
构造函数中,您没有在
bObj
中存储对
a
对象的
a
字段的引用;您只是在存储值。(换句话说,
B
不是“接收易变变量”;它是接收恰好存储在
volatile
字段中的值。)
a
对象和
B
对象中的
a
字段的值可以独立地更改值



使用您发布的代码,无需将
A.A
声明为
volatile

没有易变对象这样的东西。是变量的波动性,而不是它的值。我指的是波动性变量。很抱歉现在将对其进行编辑。不过,方法参数是值,而不是变量。对变量(或参数表达式)求值以生成值。volatile不适用于该值。如果您知道volatile的含义,您应该能够回答自己的问题。如果没有,您可能需要后退几步并了解它。那么,我是否应该将继承类的“a”变量定义为public int a?没有易变对象这样的东西。是变量的波动性,而不是它的值。我指的是波动性变量。很抱歉现在将对其进行编辑。不过,方法参数是值,而不是变量。对变量(或参数表达式)求值以生成值。volatile不适用于该值。如果您知道volatile的含义,您应该能够回答自己的问题。如果没有,您可能需要后退几步并了解它。那么,我是否应该将继承类的“a”变量定义为public int a?此外,声明变量“volatile”,然后对其使用自动增量将导致并发错误。您需要同步整个自动增量操作以保持一致性。而且,扩展“线程”是一个非常糟糕的想法。正如另一位评论者所提到的,了解“volatile”的含义是一个好主意——它意味着协调线程之间的读写操作,以维护/before/关系。非常感谢您的回复。@LewBloch——关于后缀增量运算符的好观点。然而,由于实际上并不需要
volatile
(至少在发布的代码中没有并发),因此没有造成任何伤害。顺便问一下,为什么扩展
线程
“简直是个糟糕的主意”?只要使用
Thread
(而不是另一个多线程实用程序),它与使用
newthread(Runnable)
@TedHopp没有太大区别,我猜当他说扩展Thread类很糟糕时,他的意思是,既然一个类只能
扩展一个类,实现
Runnable类非常有用。@AdityaKulkarni-我不知道他的意思;这就是我问的原因。当然,如果需要扩展其他类,可以实现
Runnable
,然后将其传递给
线程
构造函数;这提供了更大的灵活性。然而,这并不意味着扩展
线程
是一个坏主意。此外,声明变量“volatile”,然后在其上使用自动增量将导致并发错误。您需要同步整个自动增量操作以保持一致性。而且,扩展“线程”是一个非常糟糕的想法。正如另一位评论者所提到的,了解“volatile”的含义是一个好主意——它意味着协调线程之间的读写操作,以维护/before/关系。非常感谢您的回复。@LewBloch——关于后缀增量运算符的好观点。然而,由于实际上并不需要
volatile
(至少在发布的代码中没有并发),因此没有造成任何伤害。顺便问一下,为什么扩展
线程
“简直是个糟糕的主意”?只要使用
Thread
(而不是另一个多线程实用程序),它与使用
newthread(Runnable)
@TedHopp没有太大区别,我猜当他说扩展Thread类很糟糕时,他的意思是,既然一个类只能
扩展一个类,实现
Runnable类非常有用。@AdityaKulkarni-我不知道他的意思;这就是我问的原因。当然,如果需要扩展其他类,可以实现
Runnable
,然后将其传递给
线程
构造函数;这提供了更大的灵活性。然而,扩展
线程
并不是一个坏主意。
public class B extends Thread{

  public int a;

    public B(int a){
     this.a =a ;
    }
  }