Вот попытка:
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]
Есть очень хороший технический доклад о модели памяти Java . Если вам не нравится wideos , «происходит раньше»
в контексте модели памяти Java.
По сути, все записи видны другим потокам, если они происходят до связи. Предположим, что поток A записывает в поле X, а поток B читает из него, поэтому происходит до установления связи между записью и чтением, если:
Итак, я думаю, что второй вариант верен, как они его реализовали, я не знаю.
I'd suggest you start with:
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.