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

Popular posts from this blog

python - TypeError: start must be a integer -

c# - DevExpress RepositoryItemComboBox BackColor property ignored -

django - Creating multiple model instances in DRF3 -