2015-12-30 8 views
3

Насколько я знаю, видимость имеет дело с тем, в каком состоянии нить может наблюдать/видеть обновление для общей переменной (ов) другим потоком. Даже однопроцессорная система может пострадать от проблемы видимости. В процессе обработки заказов в какой последовательности поток просматривает операции памяти, выполняемые другим прогоном в другом ЦП. Однопроцессорная система не страдает проблемой заказа. Но я чувствовал, что иногда так называемая проблема заказа может быть интерпретирована с понятием Видимость, е, g.Каковы отношения/различия между видимостью и порядком?

//Thread1 runs 
int data; 
boolean ready; 
void method1(){ 
    data=1; 
    ready=true; 
} 

//Thread2 runs 
void method2(){ 
    if(ready){ 
    System.out.print(data); 
    } 
} 

Если выход выше программы был «0» (а не «1»), можно сказать, что существует проблема заказа (т.е. изменение порядка) --- записываемый в готовпоявился должно быть зарегистрировано до записи до данные. Тем не менее, я думаю, что мы также можем интерпретировать этот результат в результате видимости: Thread2 впервые увидел обновление до по готовому по Thread1, а затем данные, возможно, из-за того, что буфер хранилища сбросился в кеш процессора, а если печать (данные) было выполнено до того, как Thread2 увидел обновление до данных, затем мы получили выход «0». Принимая это во внимание, я просто задаюсь вопросом, что такое разница/взаимосвязь между видимостью и порядком?

+0

Посмотрите на это сообщение от Doug Lea о [Синхронизация и модель памяти Java] (http://gee.cs.oswego.edu/dl/cpj/jmm.html). Это хороший обзор об атомарности, видимости и всех порядках, которые могут отличаться по мере того, как вы ожидаете. Вот еще один автор того же автора о [JSR-133 - модели памяти Java] (http://gee.cs.oswego.edu/dl/jmm/cookbook.html). – SubOptimal

+0

Я хотел бы добавить еще один (потому что я просто наткнулся на него) http://jpbempel.blogspot.fr/2013/05/volatile-and-memory-barriers.html – SubOptimal

+0

Спасибо @SubOptimal, ваши рекомендуемые статьи хороши, и я прочитал их, прежде чем задал этот вопрос. – user2351818

ответ

1

Да, заказ и видимость связаны с вопросами.

  • Видимость о том /, когда один поток видит результаты памяти записывает выполняется другим потоком

  • заказа составляет приблизительно порядок, в котором обновления рассматривается второй поток, соответствует ли (программа) порядок, в котором их написал первый поток.

Модель памяти Java напрямую не адресует порядок записи. Любые ограничения на порядок (по вашему мнению) являются следствием правил видимости: они указаны в JLS. Это включает случай, когда вы используете переменные volatile, чтобы эффективно блокировать переупорядочение.

Следует также отметить, что переупорядочение записей (с точки зрения второго потока) может происходить всякий раз, когда модель памяти JLS не требует видимости. Правильная синхронизация гарантирует видимость в точке синхронизации.

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