Что объем кэша сбрасывает требуемый Java, синхронизируют ключевое слово?

Вот попытка:

f = lambda *n: (e for a in n
    for e in (f(*a) if isinstance(a, (list)) else (a,)))

print(list(f([1,2,3,(4,5,6),[7,8,9]])))
# [1, 2, 3, (4, 5, 6), 7, 8, 9]
9
задан Lawrence Dol 6 May 2009 в 01:46
поделиться

3 ответа

Есть очень хороший технический доклад о модели памяти Java . Если вам не нравится wideos , «происходит раньше» в контексте модели памяти Java.

По сути, все записи видны другим потокам, если они происходят до связи. Предположим, что поток A записывает в поле X, а поток B читает из него, поэтому происходит до установления связи между записью и чтением, если:

  • x is volatile
  • запись в x была защищена той же блокировкой, что и чтение из x
  • , возможно, еще несколько.

Итак, я думаю, что второй вариант верен, как они его реализовали, я не знаю.

5
ответ дан 4 December 2019 в 23:07
поделиться

I'd suggest you start with:

1
ответ дан 4 December 2019 в 23:07
поделиться

You need to understand that the pre-5.0 JMM was never really implemented exactly, because it wasn't actually feasible.

So pre-5.0 you did technically have to write everything out to shared memory. In 1.5 (actually 1.4) this is relaxed. In particular, if a lock cannot escape a thread, then the JVM is entitled to treat it as a nop. Further, an unlock followed by a lock of the same lock can be coalesced, which is not true of the old JMM. For an escaped lock, the JVM often has to be pessimistic and flush more than is technically necessary.

1
ответ дан 4 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: