Бывает раньше между потоками и атомарной переменной Часть 2 - PullRequest
0 голосов
/ 18 ноября 2018

Поскольку ответ на раньше случался между потоками и атомарной переменной , состоял в том, что утверждения не выполняются, мне нужна альтернативная реализация.Thread1 и Thread2 обновляют целые числа t1 и t2 соответственно.Как только они обновлены, никакие другие обновления не происходят к t1 или t2.Значения, назначенные для t1 и t2, поступают из общего счетчика, который увеличивается после каждого назначения.Мне нужно убедиться, что следующие утверждения верны:

int cnt=0;
ReentrantLock lock = new ReentrantLock();
volatile Integer t1=null;
volatile Integer t2=null;

//Thread1
lock.lock();
try{t1=cnt++;}finally{lock.unlock();}
if(t2 == null){
  assert t2==null || t2>t1;
}

//Thread2
lock.lock();
try{t2=cnt++;}finally{lock.unlock();}
if(t1==null){
  assert t1==null || t1>t2;
}

Вопрос в том, имеют ли место утверждения?Требуется ли энергозависимость на t1 и t2, как показано?Есть ли лучший / правильный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018
  1. Да, утверждения пройдут. Между каждым чтением и записью есть HB, и есть гарантия, что если первый поток получит блокировку, второй не сможет ни увеличить счетчик, ни инициализировать его переменную t. Поэтому, если поток внутри if(t1==null){} t2 будет null или больше, чем t1. То же самое относится и к другой теме.
  2. Вы не можете удалить volatile из этого кода, потому что t1 и t2 являются общими для разных потоков, и вам необходимо убедиться, что между чтениями и записями этих полей в разных потоках есть HB. * ​​1011 *
  3. Если существует лучшее решение, я боюсь, что не смогу найти его так быстро. Я думаю, что любое правильное решение, в которое можно попасть внутрь if(t1==null){...}, должно удовлетворять требованию: t1=cnt++ должен выполняться только одним потоком одновременно.
0 голосов
/ 19 ноября 2018

Существует возможность записи потока1 в t1 после того, как поток2 выполнил if (t1 == null) до достижения соответствующего оператора assert или наоборот.

Оператор If и последующее утверждение должны быть выполнены в синхронизированномконтекст.

...