2014-09-13 1 views
1

Описан ли код ниже внутрипоточного семантического?Intra thread semantic для java-программы

static Integer sync; 

public static void main(String[] args) throws Exception { 
    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      sync = 6; 
      System.out.println("written thread 1"); 
      try { 
       Thread.sleep(9999); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(IO.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      System.out.println(sync); 
     } 

    }; 
    Runnable t = new Runnable() { 
     @Override 
     public void run() { 
      sync = 2; 
      System.out.println("written thread 2"); 
      try { 
       Thread.sleep(9999); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(IO.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      System.out.println(sync); 
     } 
    }; 

    Thread th1 = new Thread(r); 
    Thread th2 = new Thread(t); 
    th1.start(); 
    th2.start(); 
} 

DEMO

результат:

written thread 1 
written thread 2 
2 
2 //!!!! Is intra-thread semantic violates? 

JLS в 17,4 говорит:

[...] Как уже упоминалось ранее, все потоки должны соблюдать правильную внутрипоточная семантика для Java-программ. [...]

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

Возможно, я правильно поняла семантическую концепцию внутри потока?

+0

Возможно, вы ищете переменные состояния ThreadLocal (http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html) вместо статического? –

+0

@ GáborBakos Я просто хотел бы понять концепцию внутрипоточной семантики на примере. – 2014-09-13 15:30:26

ответ

1

Проблема заключается в том, что вы получили себя и «межпоточные» действия здесь

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

не является «внутрипоточным» действием. Оба потока имеют общую ячейку памяти (переменная sync), а значение значения из одного потока - это эффект, который может быть обнаружен другим. Deascription из «внутри резьбы» семантикой говорит

Действия каждого потока в отдельности должны вести себя, как определяется семантикой этого потока, с тем исключением, что значения, замеченные каждой операции чтения определяются памяти модель.

(курсив мой, source)

+0

То есть в моем случае нити не изолированы, не так ли? – 2014-09-13 16:15:32

+1

Да. В некотором смысле, это точка потоков (в отличие от процессов): простой способ, с помощью которого они могут делиться ресурсами. И, конечно же, это и их пятка на Archille. Они могут легко наступать друг на друга. – Dirk

1

Intra-нить семантика относится только к переменным, которые не являются общими между потоками.

Поэтому выход соответствует модели памяти Java (JMM).

В другом случае ваша программа не синхронизирована должным образом, потому что у вас есть два потока, записывающих одну и ту же статическую переменную (sync), и поэтому программа может создавать как выходные (6, 2), так и (2, 2) и по-прежнему выполнять JMM.

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