Java 如何将volatile变量传递给另一个类?
在将一个volatile变量传递给另一个类(都是扩展线程类)时,我是否必须将这个volatile变量作为volatile导入,或者只导入公共定义就足够了 例: 现在,接收volatile变量的类应该使用将receiver变量定义为volatile还是public?像这样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 ; } } 还是应该这样定
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 ;
}
}