2016-06-23 11 views
-1

При передаче изменчивой переменной в другой класс (оба расширяют класс Thread), мне нужно импортировать эту изменчивую переменную в качестве летучего или просто публичного определения?Как передать изменчивую переменную в другой класс?

например:

public class A extends Thread{ 

    public volatile int a = 0; 

public void run(){ 
    B bObj = new B(a); 
    a++; 
} 
} 

Теперь класс получения летучего переменный, следует использовать определение переменного приемника как летучие или просто публику? например

public class B extends Thread{ 

    public volatile int a; 

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

OR должно быть определено следующим образом:

public class B extends Thread{ 

    public int a; 

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

С обоих классов обменивающихся переменной в течение некоторого периода времени, или другой.

Любая помощь очень ценится. Спасибо

+1

Существует не такая вещь, как _volatile object_. Это переменная, которая является 'volatile', а не ее значением. –

+0

Я имел в виду переменную volatile. Сожалею. Сейчас отредактирует. –

+1

Тем не менее аргументы метода являются значениями, а не переменными. Переменная (или выражение аргумента) оценивается для получения значения. _volatile_ не относится к значению. –

ответ

0

Java является передачей по значению. В конструкторе B вы не сохраняете ссылку на поле A объекта a в bObj; вы просто сохраняете значение. (Другими словами, B не «получать летучую переменную», он получает в значение, что случается храниться в volatile поле.) Значение по a поля в A объекта и B объект может изменять значения независимо.

С кодом, который вы отправили, нет необходимости объявлять A.a как volatile.

+0

Кроме того, объявление переменной volatile, а затем использование автоинкремента на ней приведет к ошибкам параллелизма. Для обеспечения согласованности вам необходимо синхронизировать всю операцию автоматического увеличения. Кроме того, это просто страшная идея расширить «Thread». Как отметил еще один комментатор, неплохо узнать, что означает «летучий» - это значит координировать чтение и запись между потоками для поддержания отношений/происшествия перед /. –

+0

Большое спасибо за ответы. –

+0

@ LewBloch - Хороший вопрос о операторе приращения postfix. Однако, поскольку «volatile» на самом деле не нужен (по крайней мере, в коде, который опубликован, нет параллелизма), никакого вреда не наносится. Кстати, почему это «просто ужасная идея» продлить «Thread»? Пока используется 'Thread' (вместо другой многопоточной утилиты), он не сильно отличается от использования' new Thread (Runnable) '. –