2013-06-26 1 views
4

У меня есть этот простой кусок кода.Назначение значения переменной массива самому себе?

class A { 
    static volatile String[] a = new String[9]; 

    public static void main(String[] args) { 
     new Thread() { 
      public void run() { 
       for (int i = 0; i < a.length; i++) { 
        while (a[i] == null); 
        System.out.println(a[i]); 
       } 
      } 
     }.start(); 

     a[0] = "The"; 
     zzz(); 
     a[1] = "quick"; 
     zzz(); 
     a[2] = "brown​"; 
     zzz(); 
     a[3] = "fox"; 
     zzz(); 
     a[4] = "jumped"; 
     zzz(); 
     a[5] = "over"; 
     zzz(); 
     a[6] = "the"; 
     zzz(); 
     a[7] = "lazy"; 
     zzz(); 
     a[8] = "cat"; 
     zzz(); 
    } 

    public static void zzz() { 
     try { 
      Thread.sleep(300); 
     } catch (Exception e) {} 
     a=a; 
    } 
} 

Он выводит то, что я бы ожидать:

$ javac A.java && java A 
The 
quick 
brown​ 
fox 
jumped 
over 
the 
lazy 
cat 

Странная вещь в zzz()a=a. Кажется, он ничего не меняет, когда я его вынимаю. Почему он там?

+0

Это не делает ничего. Вероятно, он остался там, чтобы добавить точку останова. –

+1

Назначает ли лицензия на публикацию ее для других потоков? –

ответ

4

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

Это ничего не меняет, когда я его вынимаю.

Тот факт, что он все еще работает на вашей машине с вашим JVM, не означает, что он будет работать на другой машине с другой JVM. Теоретически удаление оператора a = a; может привести к бесконечному циклу while.


Примечание стороны

я бы подумал, что модель памяти Java (JMM) может позволить JVM игнорировать это заявление, то же самое, что synchronized(new Object()) может быть проигнорировано.

Кажется, однако, что it is not the case*:

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

* Джереми Мэнсон является одним из авторов JMM.

+0

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

+0

@JohnVint Кажется, что это не так - обновление. – assylias

+0

+1 для ссылки в блоге. – dcernahoschi