2012-05-25 4 views
-1

У меня есть этот код:переменных и нити

public class Tarea implements Runnable 
{ 

    private int valor; 


    public Tarea() 
    { 
     valor = 0; 
    } 


    public void run() 
    { 
     for (int i = 1; i <= 10; i++) 
     { 
      valor++; 
     } 
     System.out.println(Thread.currentThread().getName() + " Valor " + valor); 
    } 
} 

public class AppTarea 
{ 

    public static void main(String[] args) 
    { 
     Thread[] hilos = new Thread[5]; 
     for (int i = 0; i < hilos.length; i++) 
     { 
      hilos[i] = new Thread(new Tarea()); 
      hilos[i].start(); 
     } 
     System.out.println("Main terminado"); 
    } 
} 

Является ли это потокобезопасный. Должен ли я определять переменную доблесть как изменчивую. доблесть делится в разных потоках или нет? Спасибо.

ответ

-1

Нет, он не является общим, это частный экземпляр переменная. Каждый экземпляр класса будет иметь личную копию, и нет доступа к нему за пределами класса, чтобы он был безопасным.

- В соответствии с обсуждением ниже мой первоначальный ответ был неправильным - пропустил важный экземпляр против статического переменного угла. Ниже приведен оригинальный ответ:

Нет, он не является общим, это частная переменная. Нет доступа к нему за пределами класса, чтобы он был безопасным.

+1

'private static v = 1;' каждый поток do 'v ++'. Нет доступа вне класса, но не безопасен. – UmNyobe

+0

@UmNyobe: Это невостребовано. Я ответил на вопрос, который не задал еще один гипотетический вопрос. Есть много других ситуаций, которые могли бы нарушить безопасность потоков классов, но в этом конкретном примере нет никакой опасности. В переменной valor нет модификатора статичности. – Selim

+0

«Нет доступа к нему за пределами класса, чтобы он был безопасным». Это утверждение абсолютно неверно. – UmNyobe

1

Это поточно, потому что нет ничего общего .... переменная valor является уникальной для каждого потока ...

0

Это поточно, так как только доступ на конструкторе и методе run(), из того же класса. Единственной нитью, которая может использовать переменную, является работающий поток, который синхронизируется с самим собой под java memory model (и на самом деле любая модель памяти, о которой я знаю), поэтому здесь нет data-race. Нет необходимости в volatile или synchronized ключевых слов здесь.

Ключевое слово volatile используется, когда вы хотите изменить переменную из нескольких потоков, и вы не хотите, чтобы она хранилась в кеше из-за этого. Это не так - переменная здесь изменяется одним потоком.

+1

Летучие не должны использоваться для случаев, когда вы изменяете переменную. Он обеспечивает гарантии на видимость, но не гарантирует атомарность. Если вы используете летучие в сложном действии, вы будете сгореться им. Пожалуйста, см. Http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html – Selim

+0

@Selim: ответ не направлен на предоставление полного объяснения, когда вы * должны * использовать изменчивый, это только цели чтобы объяснить, почему вы не должны * использовать volatile в этом случае. Я сознательно ничего не говорил о том, что он атомный или нет. – amit

+0

@ Приходите: я вижу вашу точку, поэтому я не спустил его на второй план. Но я верю, что вторая часть «ключевое слово volatile используется, когда вы хотите изменить переменную из нескольких потоков», не совсем корректно. – Selim

0

Ваша переменная является переменной экземпляра, и между потоками и экземплярами существует одно к одному. Поэтому каждый поток имеет отдельную копию состояния. Поэтому синхронизация не требуется.

Если переменная была разделена между потоками, вам необходимо синхронизировать.

0

Короткий ответ: Да, это поточно-безопасный.

Длинный ответ: ваш код является потокобезопасным, так как ни одна из переменных-членов ваших потоков не является общим ресурсом. Это означает, что каждый созданный вами поток имеет переменную-член valor. volatile следует использовать для общих ресурсов, чтобы обеспечить синхронизацию и кеширование между потоками.

0

Ans Да. Каждый поток работает в своем контексте и использует переменную «доблесть».

Смежные вопросы