multithreading - Java Unsafe.storeFence() documentation wrong? -
java 8 has added 3 fences sun.misc.unsafe
.
i feel confused after read documentation.
so, searched web, , found link.
according page above, believe these methods add nothing in practice. correct me if i'm wrong, speaking, loadfence(), storefence() , fullfence() correspond volatile read, lazy write , volatile write respectively, although technically these fences stronger volatile variables. loadfence() acquire fence, , storefence() release fence, , fullfence() full fence.
but documentation storefence() looks strange.
it says,
/** * ensures lack of reordering of stores before fence * loads or stores after fence. */ void storefence();
that doesn't release fence. how supposed used? shouldn't be
/** * ensures lack of reordering of loads or stores before fence * stores after fence. */ void storefence();
i assume before means earlier , after means later.
edit
i don't mean "we don't use them in usual development" when these "fences add nothing in practice".
i mean, without these methods in unsafe, can these "fences". if correct, in practice, reading dummy volatile has effect of loadfence(), , writing dummy volatile has effect of fullfence(), , unsafe.putorderedxxx() (or atomicinteger.lazyset()) has effect of storefence().
they may have subtle difference, in current implementation, exchangeable. (seems implied link)
that mean "they add nothing new".
another edit
this fixed.
see https://bugs.openjdk.java.net/browse/jdk-8038978
thanks @john-vint
there diff in jdk9. there similar questions asked , clarified:
http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/84e19392365e
/** ! * ensures loads before fence not reordered loads , ! * stores after fence; "loadload plus loadstore barrier". ! * ! * corresponds c11 atomic_thread_fence(memory_order_acquire) ! * (an "acquire fence"). ! * ! * pure loadload fence not provided, since addition of loadstore ! * desired, , current hardware instructions ! * provide loadload barrier provide loadstore barrier free. * @since 1.8 */ public native void loadfence(); /** ! * ensures loads , stores before fence not reordered ! * stores after fence; "storestore plus loadstore barrier". ! * ! * corresponds c11 atomic_thread_fence(memory_order_release) ! * (a "release fence"). ! * ! * pure storestore fence not provided, since addition of loadstore ! * desired, , current hardware instructions ! * provide storestore barrier provide loadstore barrier free. * @since 1.8 */ public native void storefence(); /** ! * ensures loads , stores before fence not reordered ! * loads , stores after fence. implies effects of both ! * loadfence() , storefence(), , in addition, effect of storeload ! * barrier. ! * ! * corresponds c11 atomic_thread_fence(memory_order_seq_cst). * @since 1.8 */ public native void fullfence();
Comments
Post a Comment