Скажем, у меня есть две темы, работающие, как это:Работает ли этот нестандартный шаблон синхронизации Java?
- Пронизывайте, который выполняет вычисления при обновлении пикселей общего изображения
- Thread B периодически считывает изображение и копирует его на экран
Thread A быстро выполняет работу, скажем, 1 миллион обновлений в секунду, поэтому я подозреваю, что было бы неплохо заблокировать и разблокировать блокировку/мьютекс/монитор, что часто. Но если нет блокировки и нет способа установить связь «из-за» из потока A в поток B, то по модели памяти Java (спецификация JMM) нить B не гарантируется вообще, чтобы увидеть какие-либо обновления A для изображения.
Таким образом, я думал, что минимальное решение для потоков A и B для одновременной синхронизации одной и той же общей блокировки, но фактически не выполняет какую-либо работу внутри синхронизированного блока - это то, что делает шаблон нестандартным и сомнительны. В качестве иллюстрации в половину реального кода наполовину псевдо:
class ComputationCanvas extends java.awt.Canvas {
private Object lock = new Object();
private int[] pixels = new int[1000000];
public ComputationCanvas() {
new Thread(this::runThreadA).start();
new Thread(this::runThreadB).start();
}
private void runThreadA() {
while (true) {
for (1000 steps) {
update pixels directly
without synchornization
}
synchronized(lock) {} // Blank
}
}
private void runThreadB() {
while (true) {
Thread.sleep(100);
synchronized(lock) {} // Blank
this.repaint();
}
}
@Override
public void paint(Graphics g) {
g.drawImage(pixels, 0, 0);
}
}
ли добавлять пустые блоки синхронизации, таким образом, правильно добиться эффекта переноса данных из потоков А в поток B? Или есть другое решение, которое я не мог себе представить?
Почему атомный булев не должен делать трюк? Синхронизация ни на чем не оставляет работу из синхронизации – efekctive
Почему бы не использовать 'volatile'? – shmosel
Возможно: http://stackoverflow.com/questions/17108541/happens-before-relationships-with-volatile-fields-and-synchronized-blocks-in-jav – flakes