changeset 289:62c33527319f

Chapter 1.b: VarHandles tests (experimental) Contributed-by: Frank Yuan <frank.yuan@oracle.com>
author shade
date Thu, 09 Jun 2016 16:15:20 +0300
parents 6192759ee4c7
children e3d57d660c2b
files jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2DoubleResult.java jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2FloatResult.java jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2IntResult.java jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2LongResult.java jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2StringResult.java jcstress-test-gen/pom.xml jcstress-test-gen/src/main/java/org/openjdk/jcstress/chapters/Chapter1bTestGenerator.java jcstress-test-gen/src/main/java/org/openjdk/jcstress/chapters/GeneratorUtils.java jcstress-test-gen/src/main/resources/chapter1b/arrays/AddAndGetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/CAETest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/CASTest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/GetAndAddTest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/GetAndSetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/LoadLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/LoadStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/LoadStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreLoadFenceTestWeak.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreStoreFenceTest2Weak.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/WeakCASContendStrongTest.java.template jcstress-test-gen/src/main/resources/chapter1b/arrays/WeakCASTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/AddAndGetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/CAETest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/CASTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/GetAndAddTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/GetAndSetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/LoadLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/LoadStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/LoadStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreLoadFenceTestWeak.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreStoreFenceTest2Weak.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/WeakCASContendStrongTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteArray/WeakCASTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/AddAndGetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/CAETest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/CASTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/GetAndAddTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/GetAndSetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/LoadLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/LoadStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/LoadStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreLoadFenceTestWeak.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreStoreFenceTest2Weak.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/WeakCASContendStrongTest.java.template jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/WeakCASTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/AddAndGetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/CAETest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/CASTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/GetAndAddTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/GetAndSetTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/LoadLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/LoadLoadNoFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreNoFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreNoFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreLoadFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreLoadFenceTestWeak.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreLoadNoFenceTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreFenceTest2Weak.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreNoFenceTest1.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreNoFenceTest2.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/WeakCASContendStrongTest.java.template jcstress-test-gen/src/main/resources/chapter1b/fields/WeakCASTest.java.template pom.xml tests-all/pom.xml tests-chapter-1b/LICENSE tests-chapter-1b/THIRD_PARTY_README tests-chapter-1b/pom.xml tests-chapter-1b/src/main/java/Test.java tests-chapter-1b/src/main/resources/LICENSE tests-chapter-1b/src/main/resources/THIRD_PARTY_README
diffstat 82 files changed, 7659 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2DoubleResult.java	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.jcstress.infra.results;
+
+import org.openjdk.jcstress.annotations.Result;
+
+import java.io.Serializable;
+
+@Result
+public class Bool2DoubleResult implements Serializable {
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r1;
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r2;
+    
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public double r3;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Bool2DoubleResult that = (Bool2DoubleResult) o;
+
+        if (r1 != that.r1) return false;
+        if (r2 != that.r2) return false;
+        if (Double.compare(that.r3, r3) != 0) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (r1 ? 1 : 0);
+        result = 31 * result + (r2 ? 1 : 0);
+        long temp = r3 != +0.0d ? Double.doubleToLongBits(r3) : 0L;
+        result = 31 * result + (int) (temp ^ (temp >>> 32));
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return r1 + ", " + r2 + ", " + r3;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2FloatResult.java	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.jcstress.infra.results;
+
+import org.openjdk.jcstress.annotations.Result;
+
+import java.io.Serializable;
+
+@Result
+public class Bool2FloatResult implements Serializable {
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r1;
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r2;
+    
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public float r3;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Bool2FloatResult that = (Bool2FloatResult) o;
+
+        if (r1 != that.r1) return false;
+        if (r2 != that.r2) return false;
+        if (Float.compare(that.r3, r3) != 0) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (r1 ? 1 : 0);
+        result = 31 * result + (r2 ? 1 : 0);
+        result = 31 * result + (r3 != +0.0f ? Float.floatToIntBits(r3) : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return r1 + ", " + r2 + ", " + r3;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2IntResult.java	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.jcstress.infra.results;
+
+import org.openjdk.jcstress.annotations.Result;
+
+import java.io.Serializable;
+
+@Result
+public class Bool2IntResult implements Serializable {
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r1;
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r2;
+    
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public int r3;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Bool2IntResult that = (Bool2IntResult) o;
+
+        if (r1 != that.r1) return false;
+        if (r2 != that.r2) return false;
+        if (r3 != that.r3) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (r1 ? 1 : 0);
+        result = 31 * result + (r2 ? 1 : 0);
+        result = 31 * result + r3;
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return r1 + ", " + r2 + ", " + r3;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2LongResult.java	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.jcstress.infra.results;
+
+import org.openjdk.jcstress.annotations.Result;
+
+import java.io.Serializable;
+
+@Result
+public class Bool2LongResult implements Serializable {
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r1;
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r2;
+    
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public long r3;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Bool2LongResult that = (Bool2LongResult) o;
+
+        if (r1 != that.r1) return false;
+        if (r2 != that.r2) return false;
+        if (r3 != that.r3) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (r1 ? 1 : 0);
+        result = 31 * result + (r2 ? 1 : 0);
+        result = 31 * result + (int) (r3 ^ (r3 >>> 32));
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return r1 + ", " + r2 + ", " + r3;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-core/src/main/java/org/openjdk/jcstress/infra/results/Bool2StringResult.java	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.jcstress.infra.results;
+
+import org.openjdk.jcstress.annotations.Result;
+
+import java.io.Serializable;
+
+@Result
+public class Bool2StringResult implements Serializable {
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r1;
+
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public boolean r2;
+    
+    @sun.misc.Contended
+    @jdk.internal.vm.annotation.Contended
+    public String r3;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Bool2StringResult that = (Bool2StringResult) o;
+
+        if (r1 != that.r1) return false;
+        if (r2 != that.r2) return false;
+        if (r3 != null ? !r3.equals(that.r3) : that.r3 != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (r1 ? 1 : 0);
+        result = 31 * result + (r2 ? 1 : 0);
+        result = 31 * result + (r3 != null ? r3.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return r1 + ", " + r2 + ", " + r3;
+    }
+
+}
--- a/jcstress-test-gen/pom.xml	Tue Jun 07 15:02:35 2016 +0300
+++ b/jcstress-test-gen/pom.xml	Thu Jun 09 16:15:20 2016 +0300
@@ -138,6 +138,22 @@
                             </transformers>
                         </configuration>
                     </execution>
+                    <execution>
+                        <id>chapter1b-generator</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <finalName>chapter1b-generator</finalName>
+                            <transformers>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>org.openjdk.jcstress.chapters.Chapter1bTestGenerator</mainClass>
+                                </transformer>
+                            </transformers>
+                        </configuration>
+                    </execution>
                 </executions>
             </plugin>
             <plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/java/org/openjdk/jcstress/chapters/Chapter1bTestGenerator.java	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,604 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.jcstress.chapters;
+
+
+import static java.util.Map.entry;
+import static java.util.Set.of;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Source.DATA_SOURCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Source.VIEW_SOURCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Type.SHORT;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Type.CHAR;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Type.INT;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Type.LONG;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Type.FLOAT;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Type.DOUBLE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Type.STRING;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.Get;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.GetVolatile;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.GetOpaque;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.GetAcquire;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.Set;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.SetVolatile;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.SetOpaque;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.SetRelease;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.FullFence;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.AcquireFence;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.ReleaseFence;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.LoadLoadFence;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.StoreStoreFence;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.GetAndAdd;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.AddAndGet;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.CompareAndSet;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.CompareAndExchangeVolatile;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.CompareAndExchangeAcquire;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.CompareAndExchangeRelease;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.WeakCompareAndSet;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.WeakCompareAndSetAcquire;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.WeakCompareAndSetRelease;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.WeakCompareAndSetVolatile;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.GetAndSet;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.Type.GET_SET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.Type.STATIC_FENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.Type.ATOMIC_UPDATE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Method.Type.NUMERIC_ATOMIC_UPDATE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_ADDANDGET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_GETANDADD;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_GETANDSET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_CAE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_CAS;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_WEAKCAS;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_GETLOADLOADFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_LOADSTOREFENCESET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_GETLOADSTOREFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_STORESTOREFENCESET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_SETSTORESTOREFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_SETSTORELOADFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_WEAKSETSTORELOADFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_WEAKSETSTORESTOREFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_GET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.T_SET;
+
+import org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation;
+
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.SETVOLATILE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.SETRELEASE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.RELEASEFENCE_SET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.FULLFENCE_SET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDSET_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGEVOLATILE_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGERELEASE_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETRELEASE_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETVOLATILE_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.ADDANDGET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GETANDADD;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GETANDSET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.STORESTOREFENCE_SET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GETVOLATILE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GETACQUIRE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GET_ACQUIREFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GET_FULLFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GET_COMPAREANDSET_FAIL;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGEVOLATILE_FAIL;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGEACQUIRE_FAIL;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETACQUIRE_FAIL;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETVOLATILE_FAIL;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.ADDANDGET_ZERO;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GETANDADD_ZERO;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GETANDSET_OUT;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GET_LOADLOADFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.SET_FULLFENCE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGEVOLATILE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGERELEASE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGEACQUIRE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDSET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETRELEASE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETACQUIRE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETVOLATILE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.SET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSET_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGEACQUIRE_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETACQUIRE_SUC;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GET;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.COMPAREANDEXCHANGERELEASE_FAIL;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSET_RETURN;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.WEAKCOMPAREANDSETRELEASE_RETURN;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.SETOPAQUE;
+import static org.openjdk.jcstress.chapters.Chapter1bTestGenerator.Target.Operation.GETOPAQUE;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.openjdk.jcstress.Spp;
+import org.openjdk.jcstress.Values;
+
+import static org.openjdk.jcstress.chapters.GeneratorUtils.readFromResource;
+import static org.openjdk.jcstress.chapters.GeneratorUtils.upcaseFirst;
+import static org.openjdk.jcstress.chapters.GeneratorUtils.writeOut;
+
+public class Chapter1bTestGenerator {
+    public static void main(String[] args) throws Exception {
+        if (args.length < 1) {
+            throw new IllegalStateException("Need a destination argument");
+        }
+        String dest = args[0];
+
+        for(Entry<String, Target> template : TEMPLATES.entrySet()) {
+            final String templateName = template.getKey();
+            final Target target = template.getValue();
+
+            String templateFile = "/chapter1b/fields/" + templateName + ".java.template";
+            if (Chapter1bTestGenerator.class.getResource(templateFile) != null) {
+                makeFieldTests(target, "fields", templateName, readFromResource(templateFile),
+                        (pkg, testName, result) -> writeOut(dest, pkg, testName, result));
+            }
+
+            templateFile = "/chapter1b/arrays/" + templateName + ".java.template";
+            if (Chapter1bTestGenerator.class.getResource(templateFile) != null) {
+                makeArrayTests(target, "arrays", templateName, readFromResource(templateFile),
+                        (pkg, testName, result) -> writeOut(dest, pkg, testName, result));
+            }
+
+            templateFile = "/chapter1b/byteArray/" + templateName + ".java.template";
+            if (Chapter1bTestGenerator.class.getResource(templateFile) != null) {
+                makeByteBufferTests(target, "byteArray", "byteArray", BufferType.ARRAY, templateName,
+                        readFromResource(templateFile),
+                        (pkg, testName, result) -> writeOut(dest, pkg, testName, result));
+            }
+
+            templateFile = "/chapter1b/byteBuffer/" + templateName + ".java.template";
+            if (Chapter1bTestGenerator.class.getResource(templateFile) != null) {
+                makeByteBufferTests(target, "byteBuffer", "byteBuffer", BufferType.HEAP, templateName,
+                        readFromResource(templateFile),
+                        (pkg, testName, result) -> writeOut(dest, pkg, testName, result));
+            }
+
+            templateFile = "/chapter1b/byteBuffer/" + templateName + ".java.template";
+            if (Chapter1bTestGenerator.class.getResource(templateFile) != null) {
+                makeByteBufferTests(target, "byteBuffer", "byteBuffer", BufferType.DIRECT, templateName,
+                        readFromResource(templateFile),
+                        (pkg, testName, result) -> writeOut(dest, pkg, testName, result));
+            }
+        }
+    }
+
+    private static void makeFieldTests(Target target, String vhType, String templateName, String template,
+            FileWriter writer) throws IOException {
+        for (Type type : DATA_SOURCE.supportedTypes()) {
+            for (Operation operation : target.operations) {
+                if (!DATA_SOURCE.supported(operation.method, type))
+                    break;
+
+                String result = generateConcreteOperation(template, target.target, operation.operation,
+                        "field", "field = $1;");
+
+                String pkg = BASE_PKG + "." + vhType + "." + templateName;
+                String testName = operation.method.name() + upcaseFirst(type.type);
+
+                result = Spp.spp(result, keys(type), vars(type, "this", pkg, testName));
+                writer.write(pkg, testName, result);
+            }
+        }
+    }
+
+    private static void makeArrayTests(Target target, String vhType, String templateName, String template,
+            FileWriter writer) throws IOException {
+        for (Type type : DATA_SOURCE.supportedTypes()) {
+            for (Operation operation : target.operations) {
+                if (!DATA_SOURCE.supported(operation.method, type))
+                    break;
+
+                String result = generateConcreteOperation(template, target.target, operation.operation,
+                        "array[\\$index\\$]", "array[\\$index\\$] = $1;");
+
+                String pkg = BASE_PKG + "." + vhType + "." + templateName;
+                String testName = operation.method.name() + upcaseFirst(type.type);
+                int length = getVLength(type);
+
+                String currentResult = Spp.spp(result, keys(type),
+                        arrayVars(type, "array", pkg, testName + "Begin", String.valueOf(length), "0", ", 0"));
+                writer.write(pkg, testName + "Begin", currentResult);
+
+                currentResult = Spp.spp(result, keys(type),
+                        arrayVars(type, "array", pkg, testName + "End", String.valueOf(length), String.valueOf(length - 1), ", " + String.valueOf(length - 1)));
+                writer.write(pkg, testName + "End", currentResult);
+
+                currentResult = Spp.spp(result, keys(type),
+                        arrayVars(type, "array", pkg, testName + "Random", String.valueOf(length), "random", ", random"));
+                writer.write(pkg, testName + "Random", currentResult);
+            }
+        }
+    }
+
+    private static void makeByteBufferTests(Target target, String vhType, String object,
+            BufferType bufferType, String templateName, String template, FileWriter writer)
+            throws IOException {
+        for (Type type : VIEW_SOURCE.supportedTypes()) {
+            for (Operation operation : target.operations) {
+                if (!VIEW_SOURCE.supported(operation.method, type))
+                    break;
+
+                String result = generateConcreteOperation(template, target.target, operation.operation,
+                        "(\\$type\\$) vh.get(\\$object\\$\\$index_para\\$)",
+                        "vh.set(\\$object\\$\\$index_para\\$, $1);");
+
+                String pkg = BASE_PKG + "." + vhType + bufferType.pkgAppendix() + "." + templateName;
+                String testName = operation.method.name() + upcaseFirst(type.type);
+                int length = getVLength(type);
+
+                String currentResult = Spp.spp(result, keys(type),
+                        viewVars(type, object, pkg, testName + "Begin", String.valueOf(length), "off",
+                                ", off", String.valueOf(type.sizeInArray), bufferType.allocateOp));
+                writer.write(pkg, testName + "Begin", currentResult);
+
+                currentResult = Spp.spp(result, keys(type),
+                        viewVars(type, object, pkg, testName + "End", String.valueOf(length), "end", ", end",
+                                String.valueOf(type.sizeInArray), bufferType.allocateOp));
+                writer.write(pkg, testName + "End", currentResult);
+
+                currentResult = Spp.spp(result,keys(type),
+                        viewVars(type, object, pkg, testName + "Random", String.valueOf(length), "random",
+                                ", random", String.valueOf(type.sizeInArray), bufferType.allocateOp));
+                writer.write(pkg, testName + "Random", currentResult);
+            }
+        }
+    }
+
+    private static String generateConcreteOperation(String result, String target, String concreteOp,
+            String getOp, String setOp) {
+        result = result.replaceAll(target, concreteOp);
+        return result.replaceAll("%GetVar%", getOp).replaceAll("%SetVar<(.+)>%", setOp)
+                .replaceAll("%CompareAndSet<(.+), (.+)>%", COMPAREANDSET.operation);
+    }
+
+    private static Set<String> keys(Type type) {
+        if (type.alwaysAtomic)
+            return of("alwaysAtomic");
+        else
+            return of();
+    }
+
+    private static Map<String, String> vars(Type type, String object, String pkg, String testName) {
+        Map<String, String> map = new HashMap<>();
+        map.put("type", type.type);
+        map.put("Type", upcaseFirst(type.type));
+        map.put("TestClassName", testName);
+        map.put("package", pkg);
+        map.put("object", object);
+
+        for (int i = 0; i < type.values.length; i++) {
+            map.put("value" + i, type.values[i]);
+            map.put("valueLiteral" + i, type.valueLiterals[i]);
+        }
+
+        map.put("index", "");
+        map.put("index_para", "");
+
+        return map;
+    }
+
+    private static Map<String, String> arrayVars(Type type, String object, String pkg, String testName,
+            String length, String index, String indexPara) {
+        Map<String, String> map = vars(type, object, pkg, testName);
+        map.put("length", length);
+        map.put("index", index);
+        map.put("index_para", indexPara);
+
+        return map;
+    }
+
+    private static Map<String, String> viewVars(Type type, String object, String pkg, String testName,
+            String length, String index, String indexPara, String unitSize, String bufferAllocateOp) {
+        Map<String, String> map = arrayVars(type, object, pkg, testName, length, index, indexPara);
+        map.put("unit_size", unitSize);
+        map.put("buffer_allocate", bufferAllocateOp);
+
+        return map;
+    }
+
+    private static int getVLength(Type type) {
+        final int TOTAL_BYTES = 256; // to ensure 2 cache lines. If it's array
+                                     // and type is String, the real total bytes
+                                     // may be 512
+        return TOTAL_BYTES / type.sizeInArray;
+    }
+
+    @FunctionalInterface
+    private interface FileWriter {
+        void write(String pkg, String testName, String result) throws IOException;
+    }
+
+    static enum Type {
+        INT("int", Integer.BYTES, true, new String[] { "-2", "7" }, new String[] { "-2", "7" }), // here value2 should equal value0 + value1 + value1, to meet GetAndAdd, AddAndGet tests
+        LONG("long", Long.BYTES, false, new String[] { "-2L", "7" }, new String[] { "-2", "7" }), // here value2 should equal value0 + value1 + value1, to meet GetAndAdd, AddAndGet tests
+        STRING("String", 4, true, new String[] { "\"2\"", "\"7\"" }, new String[] { "2", "7" }), // reference may be compressed on 64-bits, 4 is to make sure the real total bytes exceed 256
+        BOOLEAN("boolean", 1, true, new String[] {}, new String[] {}),
+        BYTE("byte", Byte.BYTES, true, new String[] {}, new String[] {}),
+        SHORT("short", Short.BYTES, true, new String[] {}, new String[] {}),
+        CHAR("char", Character.BYTES, true, new String[] {}, new String[] {}),
+        FLOAT("float", Float.BYTES, true, new String[] { "2", "7" }, new String[] { "2.0", "7.0" }),
+        DOUBLE("double", Double.BYTES, false, new String[] { "2", "7" }, new String[] { "2.0", "7.0" });
+
+        private Type(String type, int sizeInArray, boolean alwaysAtomic, String[] extraValueLiterals,
+                String[] extraValues) {
+            this.type = type;
+            this.sizeInArray = sizeInArray;
+            this.alwaysAtomic = alwaysAtomic;
+
+            valueLiterals = new String[extraValueLiterals.length + 2];
+            valueLiterals[0] = Values.DEFAULTS_LITERAL.get(type);
+            valueLiterals[1] = Values.VALUES_LITERAL.get(type);
+            for (int i = 0; i < extraValueLiterals.length; i++)
+                valueLiterals[i + 2] = extraValueLiterals[i];
+
+            values = new String[extraValues.length + 2];
+            values[0] = Values.DEFAULTS.get(type);
+            values[1] = Values.VALUES.get(type);
+            for (int i = 0; i < extraValues.length; i++)
+                values[i + 2] = extraValues[i];
+        }
+
+        String type;
+        int sizeInArray;
+        boolean alwaysAtomic;
+        String[] valueLiterals;
+        String[] values;
+    }
+
+    static abstract class Source {
+        protected abstract Type[] supportedTypes();
+
+        protected abstract boolean supported(Method method, Type type);
+
+        protected boolean commonSupported(Method method) {
+            if (method.type == GET_SET || method.type == STATIC_FENCE)
+                return true;
+            else
+                return false;
+        }
+
+        static final Source DATA_SOURCE = new Source() {
+
+            @Override
+            protected Type[] supportedTypes() {
+                return Type.values();
+            }
+
+            @Override
+            protected boolean supported(Method method, Type type) {
+                if (commonSupported(method))
+                    return true;
+
+                if ((type == INT || type == LONG || type == STRING) && method.type == ATOMIC_UPDATE)
+                    return true;
+
+                if ((type == INT || type == LONG) && method.type == NUMERIC_ATOMIC_UPDATE)
+                    return true;
+
+                return false;
+            }
+
+        };
+
+        static final Source VIEW_SOURCE = new Source() {
+
+            @Override
+            protected Type[] supportedTypes() {
+                return VIEW_SUPPORTED_TYPES;
+            }
+
+            @Override
+            protected boolean supported(Method method, Type type) {
+                if (commonSupported(method))
+                    return true;
+
+                if ((type == INT || type == LONG || type == FLOAT || type == DOUBLE)
+                        && method.type == ATOMIC_UPDATE)
+                    return true;
+
+                if ((type == INT || type == LONG) && method.type == NUMERIC_ATOMIC_UPDATE)
+                    return true;
+
+                return false;
+            }
+
+            private final Type[] VIEW_SUPPORTED_TYPES = new Type[] { SHORT, CHAR, INT, LONG, FLOAT, DOUBLE };
+
+        };
+
+    }
+
+    static enum Method {
+        Get(GET_SET), GetVolatile(GET_SET), GetOpaque(GET_SET), GetAcquire(GET_SET),
+        Set(GET_SET), SetVolatile(GET_SET), SetOpaque(GET_SET), SetRelease(GET_SET),
+
+        FullFence(STATIC_FENCE), AcquireFence(STATIC_FENCE), ReleaseFence(STATIC_FENCE),
+        LoadLoadFence(STATIC_FENCE), StoreStoreFence(STATIC_FENCE),
+
+        CompareAndSet(ATOMIC_UPDATE), CompareAndExchangeVolatile(ATOMIC_UPDATE),
+        CompareAndExchangeAcquire(ATOMIC_UPDATE), CompareAndExchangeRelease(ATOMIC_UPDATE),
+        WeakCompareAndSet(ATOMIC_UPDATE), WeakCompareAndSetAcquire(ATOMIC_UPDATE),
+        WeakCompareAndSetRelease(ATOMIC_UPDATE), WeakCompareAndSetVolatile(ATOMIC_UPDATE), GetAndSet(ATOMIC_UPDATE),
+
+        GetAndAdd(NUMERIC_ATOMIC_UPDATE), AddAndGet(NUMERIC_ATOMIC_UPDATE);
+
+        private Method(Type type) {
+            this.type = type;
+        }
+
+        Type type;
+
+        static enum Type {
+            GET_SET, STATIC_FENCE, ATOMIC_UPDATE, NUMERIC_ATOMIC_UPDATE;
+        }
+    }
+
+    private static final String LNSEP = System.getProperty("line.separator");
+
+    enum Target {
+        T_ADDANDGET("%AddAndGet<(.+)>%", of(ADDANDGET)),
+        T_GETANDADD("%GetAndAdd<(.+)>%", of(GETANDADD)),
+        T_GETANDSET("%GetAndSet<(.+)>%", of(GETANDSET)),
+        T_CAE("%CAE<(.+), (.+)>%", of(COMPAREANDEXCHANGEVOLATILE, COMPAREANDEXCHANGERELEASE, COMPAREANDEXCHANGEACQUIRE)),
+        T_CAS("%CAS<(.+), (.+)>%", of(COMPAREANDSET)),
+        T_WEAKCAS("%WeakCAS<(.+), (.+)>%", of(WEAKCOMPAREANDSETRELEASE, WEAKCOMPAREANDSETACQUIRE, WEAKCOMPAREANDSET, WEAKCOMPAREANDSETVOLATILE)),
+
+        T_GETLOADLOADFENCE("%GetLoadLoadFence<>%", of(GETVOLATILE, GETACQUIRE, GET_ACQUIREFENCE, GET_LOADLOADFENCE, GET_FULLFENCE, GET_COMPAREANDSET_FAIL, COMPAREANDEXCHANGEVOLATILE_FAIL, COMPAREANDEXCHANGEACQUIRE_FAIL, WEAKCOMPAREANDSETACQUIRE_FAIL, WEAKCOMPAREANDSETVOLATILE_FAIL, ADDANDGET_ZERO, GETANDADD_ZERO, GETANDSET_OUT)),
+        T_LOADSTOREFENCESET("%LoadStoreFenceSet<(.+)>%", of(SETVOLATILE, SETRELEASE, RELEASEFENCE_SET, FULLFENCE_SET, COMPAREANDSET_SUC, COMPAREANDEXCHANGEVOLATILE_SUC, COMPAREANDEXCHANGERELEASE_SUC, WEAKCOMPAREANDSETRELEASE_SUC, WEAKCOMPAREANDSETVOLATILE_SUC, ADDANDGET, GETANDADD, GETANDSET)),
+        // GET_FULLFENCE is redundant for T_GETLOADSTOREFENCE, in this case, load + fullFence + store, in previous case, also load + fullFence + store
+        T_GETLOADSTOREFENCE("%GetLoadStoreFence<>%", of(GETVOLATILE, GETACQUIRE, GET_ACQUIREFENCE, GET_COMPAREANDSET_FAIL, COMPAREANDEXCHANGEVOLATILE_FAIL, COMPAREANDEXCHANGEACQUIRE_FAIL, WEAKCOMPAREANDSETACQUIRE_FAIL, WEAKCOMPAREANDSETVOLATILE_FAIL, ADDANDGET_ZERO, GETANDADD_ZERO, GETANDSET_OUT)),
+
+        T_STORESTOREFENCESET("%StoreStoreFenceSet<(.+)>%", of(SETVOLATILE, SETRELEASE, RELEASEFENCE_SET, STORESTOREFENCE_SET, FULLFENCE_SET, COMPAREANDSET_SUC, COMPAREANDEXCHANGEVOLATILE_SUC, COMPAREANDEXCHANGERELEASE_SUC, WEAKCOMPAREANDSETRELEASE_SUC, WEAKCOMPAREANDSETVOLATILE_SUC, ADDANDGET, GETANDADD, GETANDSET)),
+        //FULLFENCE_SET, is redundant
+        //atomic update operations are also redundant in some sense, in some previous cases, it's getVolatile + store/load semantics already be tested,
+        //in following cases, setVolatile + store/load be tested, but for atomic update operations, its setVolatile always be with getVolatile, so can't identify which semantics take effect
+        T_SETSTORESTOREFENCE("%SetStoreStoreFence<(.+)>%", of(SETVOLATILE, COMPAREANDSET_SUC, COMPAREANDEXCHANGEVOLATILE_SUC, ADDANDGET, GETANDADD, GETANDSET)),
+        T_SETSTORELOADFENCE("%SetStoreLoadFence<(.+)>%", of(SETVOLATILE, SET_FULLFENCE, COMPAREANDSET_SUC, COMPAREANDEXCHANGEVOLATILE_SUC, ADDANDGET, GETANDADD, GETANDSET)),
+
+        T_WEAKSETSTORELOADFENCE("%WeakSetStoreLoadFence<(.+)>%", of(WEAKCOMPAREANDSETVOLATILE_SUC)),
+        T_WEAKSETSTORESTOREFENCE("%WeakSetStoreStoreFence<(.+)>%", of(WEAKCOMPAREANDSETVOLATILE_SUC)),
+
+        T_GET("%Get<>%", of(GET, COMPAREANDEXCHANGERELEASE_FAIL, WEAKCOMPAREANDSET_RETURN, WEAKCOMPAREANDSETRELEASE_RETURN)),
+        T_SET("%Set<(.+)>%", of(SET, WEAKCOMPAREANDSET_SUC, COMPAREANDEXCHANGEACQUIRE_SUC, WEAKCOMPAREANDSETACQUIRE_SUC)),
+
+        T_SETOPAQUE("%SetOpaque<(.+)>%", of(SETOPAQUE)),
+        T_GETOPAQUE("%GetOpaque<>%", of(GETOPAQUE));
+
+        Target(String target, Set<Operation> operations) {
+            this.target = target;
+            this.operations = operations;
+        }
+
+        String target;
+        Set<Operation> operations;
+
+        enum Operation {
+            SETVOLATILE("vh.setVolatile(\\$object\\$\\$index_para\\$, $1);", SetVolatile),
+            SETRELEASE("vh.setRelease(\\$object\\$\\$index_para\\$, $1);", SetRelease),
+            RELEASEFENCE_SET("VarHandle.releaseFence();" + LNSEP + "%SetVar<$1>%", ReleaseFence),
+            FULLFENCE_SET("VarHandle.fullFence();" + LNSEP + "%SetVar<$1>%", FullFence),
+            COMPAREANDSET_SUC("vh.compareAndSet(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", CompareAndSet),
+            COMPAREANDEXCHANGEVOLATILE_SUC("vh.compareAndExchangeVolatile(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", CompareAndExchangeVolatile),
+            COMPAREANDEXCHANGERELEASE_SUC("vh.compareAndExchangeRelease(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", CompareAndExchangeRelease),
+            WEAKCOMPAREANDSETRELEASE_SUC("vh.weakCompareAndSetRelease(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", WeakCompareAndSetRelease), //in fact, it may fail spuriously, however, if it suc test will run as expected, if it fail, the result will still fall in ACCEPTABLE range. Other WEAKXXX_SUC/RETURN are same as this except some cases of WEAKCOMPAREANDSETVOLATILE_SUC
+            WEAKCOMPAREANDSETVOLATILE_SUC("vh.weakCompareAndSetVolatile(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", WeakCompareAndSetVolatile), //if it is used for SetStoreLoadFence and SetStoreStoreFence, the spurious failure will break the ACCEPTABLE Outcome, so have to write particular cases for it.
+            ADDANDGET("vh.addAndGet(\\$object\\$\\$index_para\\$, $1);", AddAndGet),
+            GETANDADD("vh.getAndAdd(\\$object\\$\\$index_para\\$, $1);", GetAndAdd),
+            GETANDSET("vh.getAndSet(\\$object\\$\\$index_para\\$, $1);", GetAndSet),
+            STORESTOREFENCE_SET("VarHandle.storeStoreFence();" + LNSEP + "%SetVar<$1>%", StoreStoreFence),
+
+            GETVOLATILE("(\\$type\\$) vh.getVolatile(\\$object\\$\\$index_para\\$);", GetVolatile),
+            GETACQUIRE("(\\$type\\$) vh.getAcquire(\\$object\\$\\$index_para\\$);", GetAcquire),
+            GET_ACQUIREFENCE("%GetVar%;" + LNSEP + "VarHandle.acquireFence();", AcquireFence),
+            GET_FULLFENCE("%GetVar%;" + LNSEP + "VarHandle.fullFence();", FullFence),
+            GET_COMPAREANDSET_FAIL("%GetVar%;" + LNSEP + "vh.compareAndSet(\\$object\\$\\$index_para\\$, \\$valueLiteral3\\$, \\$valueLiteral3\\$);", CompareAndSet),
+            COMPAREANDEXCHANGEVOLATILE_FAIL("(\\$type\\$) vh.compareAndExchangeVolatile(\\$object\\$\\$index_para\\$, \\$valueLiteral3\\$, \\$valueLiteral3\\$);", CompareAndExchangeVolatile),
+            COMPAREANDEXCHANGEACQUIRE_FAIL("(\\$type\\$) vh.compareAndExchangeAcquire(\\$object\\$\\$index_para\\$, \\$valueLiteral3\\$, \\$valueLiteral3\\$);", CompareAndExchangeAcquire),
+            WEAKCOMPAREANDSETACQUIRE_FAIL("%GetVar%;" + LNSEP + "vh.weakCompareAndSetAcquire(\\$object\\$\\$index_para\\$, \\$valueLiteral3\\$, \\$valueLiteral3\\$);", WeakCompareAndSetAcquire),
+            WEAKCOMPAREANDSETVOLATILE_FAIL("%GetVar%;" + LNSEP + "vh.weakCompareAndSetVolatile(\\$object\\$\\$index_para\\$, \\$valueLiteral3\\$, \\$valueLiteral3\\$);", WeakCompareAndSetVolatile),
+            ADDANDGET_ZERO("(\\$type\\$) vh.addAndGet(\\$object\\$\\$index_para\\$, 0);", AddAndGet),
+            GETANDADD_ZERO("(\\$type\\$) vh.getAndAdd(\\$object\\$\\$index_para\\$, 0);", GetAndAdd),
+            GETANDSET_OUT("(\\$type\\$) vh.getAndSet(\\$object\\$\\$index_para\\$, \\$valueLiteral3\\$);", GetAndSet),
+            GET_LOADLOADFENCE("%GetVar%;" + LNSEP + "VarHandle.loadLoadFence();", LoadLoadFence),
+
+            SET_FULLFENCE("%SetVar<$1>%" + LNSEP + "VarHandle.fullFence();", FullFence),
+
+            COMPAREANDEXCHANGEVOLATILE("(\\$type\\$) vh.compareAndExchangeVolatile(\\$object\\$\\$index_para\\$, $1, $2);", CompareAndExchangeVolatile),
+            COMPAREANDEXCHANGERELEASE("(\\$type\\$) vh.compareAndExchangeRelease(\\$object\\$\\$index_para\\$, $1, $2);", CompareAndExchangeRelease),
+            COMPAREANDEXCHANGEACQUIRE("(\\$type\\$) vh.compareAndExchangeAcquire(\\$object\\$\\$index_para\\$, $1, $2);", CompareAndExchangeAcquire),
+            COMPAREANDSET("vh.compareAndSet(\\$object\\$\\$index_para\\$, $1, $2);", CompareAndSet),
+            WEAKCOMPAREANDSETRELEASE("vh.weakCompareAndSetRelease(\\$object\\$\\$index_para\\$, $1, $2);", WeakCompareAndSetRelease),
+            WEAKCOMPAREANDSETACQUIRE("vh.weakCompareAndSetAcquire(\\$object\\$\\$index_para\\$, $1, $2);", WeakCompareAndSetAcquire),
+            WEAKCOMPAREANDSET("vh.weakCompareAndSet(\\$object\\$\\$index_para\\$, $1, $2);", WeakCompareAndSet),
+            WEAKCOMPAREANDSETVOLATILE("vh.weakCompareAndSetVolatile(\\$object\\$\\$index_para\\$, $1, $2);", WeakCompareAndSetVolatile),
+
+            SET("vh.set(\\$object\\$\\$index_para\\$, $1);", Set),
+            WEAKCOMPAREANDSET_SUC("vh.weakCompareAndSet(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", WeakCompareAndSet),
+            COMPAREANDEXCHANGEACQUIRE_SUC("vh.compareAndExchangeAcquire(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", CompareAndExchangeAcquire),
+            WEAKCOMPAREANDSETACQUIRE_SUC("vh.weakCompareAndSetAcquire(\\$object\\$\\$index_para\\$, \\$valueLiteral0\\$, $1);", WeakCompareAndSetAcquire),
+
+            GET("(\\$type\\$) vh.get(\\$object\\$\\$index_para\\$);", Get),
+            COMPAREANDEXCHANGERELEASE_FAIL("(\\$type\\$) vh.compareAndExchangeRelease(\\$object\\$\\$index_para\\$, \\$valueLiteral3\\$, \\$valueLiteral3\\$);", CompareAndExchangeRelease),
+            WEAKCOMPAREANDSET_RETURN("vh.weakCompareAndSet(\\$object\\$\\$index_para\\$, \\$valueLiteral1\\$, \\$valueLiteral3\\$) ? \\$valueLiteral1\\$ : \\$valueLiteral0\\$;", WeakCompareAndSet), //I suspect it should be incorrect to compare with 0
+            WEAKCOMPAREANDSETRELEASE_RETURN("vh.weakCompareAndSetRelease(\\$object\\$\\$index_para\\$, \\$valueLiteral1\\$, \\$valueLiteral3\\$) ? \\$valueLiteral1\\$ : \\$valueLiteral0\\$;", WeakCompareAndSetRelease), //I suspect it should be incorrect to compare with 0
+
+            SETOPAQUE("vh.setOpaque(\\$object\\$\\$index_para\\$, $1);", SetOpaque),
+            GETOPAQUE("(\\$type\\$) vh.getOpaque(\\$object\\$\\$index_para\\$);", GetOpaque);
+
+            Operation(String operation, Method method) {
+                this.operation = operation;
+                this.method = method;
+            }
+
+            String operation;
+            Method method;
+        }
+    }
+
+    private enum BufferType {
+        ARRAY("", ""), HEAP("heap", "ByteBuffer.allocate"), DIRECT("direct", "ByteBuffer.allocateDirect");
+
+        BufferType(String type, String allocateOp) {
+            this.type = type;
+            this.allocateOp = allocateOp;
+        }
+
+        String pkgAppendix() {
+            return type.equals("") ? "" : "." + type;
+        }
+
+        private String type;
+        String allocateOp;
+    }
+
+    private static final Map<String, Target> TEMPLATES = Map.ofEntries(
+            entry("AddAndGetTest", T_ADDANDGET),
+            entry("CAETest", T_CAE), entry("CASTest", T_CAS),
+            entry("GetAndAddTest", T_GETANDADD),
+            entry("GetAndSetTest", T_GETANDSET),
+            entry("LoadLoadFenceTest", T_GETLOADLOADFENCE),
+            entry("LoadLoadNoFenceTest", T_GET),
+            entry("LoadStoreFenceTest1", T_LOADSTOREFENCESET),
+            entry("LoadStoreFenceTest2", T_GETLOADSTOREFENCE),
+            entry("LoadStoreNoFenceTest1", T_SET),
+            entry("LoadStoreNoFenceTest2", T_GET),
+            entry("StoreLoadFenceTest", T_SETSTORELOADFENCE),
+            entry("StoreLoadFenceTestWeak", T_WEAKSETSTORELOADFENCE),
+            entry("StoreLoadNoFenceTest", T_SET),
+            entry("StoreStoreFenceTest1", T_STORESTOREFENCESET),
+            entry("StoreStoreFenceTest2", T_SETSTORESTOREFENCE),
+            entry("StoreStoreFenceTest2Weak", T_WEAKSETSTORESTOREFENCE),
+            entry("StoreStoreNoFenceTest1", T_SET),
+            entry("StoreStoreNoFenceTest2", T_SET),
+            entry("WeakCASTest", T_WEAKCAS),
+            entry("WeakCASContendStrongTest", T_WEAKCAS));
+
+    private static final String BASE_PKG = "org.openjdk.jcstress.tests.varhandles";
+
+}
--- a/jcstress-test-gen/src/main/java/org/openjdk/jcstress/chapters/GeneratorUtils.java	Tue Jun 07 15:02:35 2016 +0300
+++ b/jcstress-test-gen/src/main/java/org/openjdk/jcstress/chapters/GeneratorUtils.java	Thu Jun 09 16:15:20 2016 +0300
@@ -70,4 +70,8 @@
         }
         return sb.toString();
     }
+
+    static String upcaseFirst(String s) {
+        return Character.toUpperCase(s.charAt(0)) + s.substring(1);
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/AddAndGetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of addAndGet.")
+@Outcome(id = "$value2$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value1$, $value2$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because addAndGet is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/CAETest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndExchange.")
+@Outcome(id = "$value2$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = %CAE<$valueLiteral0$, $valueLiteral1$>%
+    }
+
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = %CAE<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/CASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN, desc = "not both shall fail")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %CAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/GetAndAddTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndAdd.")
+@Outcome(id = "$value1$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndAdd is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/GetAndSetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndSet.")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value2$, $value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndSet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndSet<$valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/LoadLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load load fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before fullFence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        array[$index$] = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = %GetLoadLoadFence<>%
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/LoadStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load var in actor2 before store $value1$ to var in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to var in actor1 before load var in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load x after store var in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load x after store var because only if r1 = $value1$ x may be assigned to $value1$ and then r2 can be $value1$ from x.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = x;
+        %LoadStoreFenceSet<$valueLiteral1$>%
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = array[$index$];
+        x = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/LoadStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load y in actor2 before store $value1$ to y in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to y in actor1 before load y in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load var after store y in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load var after store y because only if r1 = $value1$ var may be assigned to $value1$ and then r2 can be $value1$ from var.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = %GetLoadStoreFence<>%
+        y = $valueLiteral1$;
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        array[$index$] = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store load fence.")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        %SetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = array[$index$];
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreLoadFenceTestWeak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store load fence, but may fail spuriously, so has different Outcomes with common StoreLoadFenceTest.")
+//when weak cas succeed
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 not observe x is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe x is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed, if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r1 may read half of x")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = array[$index$];
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        %StoreStoreFenceSet<$valueLiteral1$>%
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = array[$index$];
+        VarHandle.fullFence();
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        %SetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/StoreStoreFenceTest2Weak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store store fence, but may fail spuriously, so has different Outcomes with common StoreStoreFenceTest2.")
+//when weak cas succeed
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 not observe y is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe y is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed
+@Outcome(id = "$value0$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "r1 may read half of y")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+        
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/WeakCASContendStrongTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests weakCompareAndSet contend with strong compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 execute after actor1")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 execute before actor1 or win the contention with actor1")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN,  desc = "not both shall fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN,  desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CompareAndSet<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/arrays/WeakCASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of weakCompareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.ACCEPTABLE,  desc = "both may fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    $type$[] array = new $type$[$length$];
+
+    static final int random = new Random().nextInt($length$ - 2) + 1;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.arrayElementVarHandle($type$[].class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %WeakCAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = array[$index$];
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/AddAndGetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of addAndGet.")
+@Outcome(id = "$value2$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value1$, $value2$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because addAndGet is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/CAETest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndExchange.")
+@Outcome(id = "$value2$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = %CAE<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = %CAE<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/CASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN, desc = "not both shall fail")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %CAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/GetAndAddTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndAdd.")
+@Outcome(id = "$value1$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndAdd is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/GetAndSetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndSet.")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value2$, $value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndSet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndSet<$valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/LoadLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load load fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before fullFence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        vh.set(byteArray$index_para$, $valueLiteral1$);
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = %GetLoadLoadFence<>%
+        r.r2 = x;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/LoadStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load var in actor2 before store $value1$ to var in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to var in actor1 before load var in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load x after store var in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load x after store var because only if r1 = $value1$ x may be assigned to $value1$ and then r2 can be $value1$ from x.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = x;
+        %LoadStoreFenceSet<$valueLiteral1$>%
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = ($type$) vh.get(byteArray$index_para$);
+        x = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/LoadStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load y in actor2 before store $value1$ to y in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to y in actor1 before load y in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load var after store y in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load var after store y because only if r1 = $value1$ var may be assigned to $value1$ and then r2 can be $value1$ from var.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = %GetLoadStoreFence<>%
+        y = $valueLiteral1$;
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        vh.set(byteArray$index_para$, r.r1);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store load fence.")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        %SetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteArray$index_para$);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreLoadFenceTestWeak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store load fence, but may fail spuriously, so has different Outcomes with common StoreLoadFenceTest.")
+//when weak cas succeed
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 not observe x is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe x is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed, if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r1 may read half of x")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteArray$index_para$);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        %StoreStoreFenceSet<$valueLiteral1$>%
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = ($type$) vh.get(byteArray$index_para$);
+        VarHandle.fullFence();
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        %SetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/StoreStoreFenceTest2Weak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store store fence, but may fail spuriously, so has different Outcomes with common StoreStoreFenceTest2.")
+//when weak cas succeed
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 not observe y is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe y is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed
+@Outcome(id = "$value0$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "r1 may read half of y")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+        
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/WeakCASContendStrongTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests weakCompareAndSet contend with strong compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 execute after actor1")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 execute before actor1 or win the contention with actor1")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN,  desc = "not both shall fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN,  desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CompareAndSet<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteArray/WeakCASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of weakCompareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.ACCEPTABLE,  desc = "both may fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+    
+    byte[] byteArray = new byte[$length$ * $unit_size$];
+    int off = ByteBuffer.wrap(byteArray).alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteArrayViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %WeakCAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = ($type$) vh.get(byteArray$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/AddAndGetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of addAndGet.")
+@Outcome(id = "$value2$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value1$, $value2$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because addAndGet is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/CAETest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndExchange.")
+@Outcome(id = "$value2$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = %CAE<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = %CAE<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/CASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN, desc = "not both shall fail")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %CAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/GetAndAddTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndAdd.")
+@Outcome(id = "$value1$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndAdd is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/GetAndSetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndSet.")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value2$, $value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndSet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndSet<$valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/LoadLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load load fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before fullFence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        vh.set(byteBuffer$index_para$, $valueLiteral1$);
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = %GetLoadLoadFence<>%
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/LoadStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load var in actor2 before store $value1$ to var in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to var in actor1 before load var in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load x after store var in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load x after store var because only if r1 = $value1$ x may be assigned to $value1$ and then r2 can be $value1$ from x.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = x;
+        %LoadStoreFenceSet<$valueLiteral1$>%
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = ($type$) vh.get(byteBuffer$index_para$);
+        x = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/LoadStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load y in actor2 before store $value1$ to y in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to y in actor1 before load y in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load var after store y in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load var after store y because only if r1 = $value1$ var may be assigned to $value1$ and then r2 can be $value1$ from var.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = %GetLoadStoreFence<>%
+        y = $valueLiteral1$;
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        vh.set(byteBuffer$index_para$, r.r1);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store load fence.")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        %SetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreLoadFenceTestWeak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store load fence, but may fail spuriously, so has different Outcomes with common StoreLoadFenceTest.")
+//when weak cas succeed
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 not observe x is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe x is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed, if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r1 may read half of x")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        %StoreStoreFenceSet<$valueLiteral1$>%
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = ($type$) vh.get(byteBuffer$index_para$);
+        VarHandle.fullFence();
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        %SetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/StoreStoreFenceTest2Weak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store store fence, but may fail spuriously, so has different Outcomes with common StoreStoreFenceTest2.")
+//when weak cas succeed
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 not observe y is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe y is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed
+@Outcome(id = "$value0$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "r1 may read half of y")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+        
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/WeakCASContendStrongTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests weakCompareAndSet contend with strong compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 execute after actor1")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 execute before actor1 or win the contention with actor1")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN,  desc = "not both shall fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN,  desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CompareAndSet<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/byteBuffer/WeakCASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of weakCompareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.ACCEPTABLE,  desc = "both may fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    static final int unaligned_rand = (new Random().nextInt($length$ - 3) + 1) * $unit_size$;
+
+    ByteBuffer byteBuffer = $buffer_allocate$($length$ * $unit_size$);
+    int off = byteBuffer.alignmentOffset(0, $unit_size$);
+    int end = off == 0 ? ($length$ - 1) * $unit_size$ : ($length$ - 1) * $unit_size$ - off;
+    int random = off == 0 ? unaligned_rand + $unit_size$ : unaligned_rand + off;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.byteBufferViewVarHandle($type$[].class, BIG_ENDIAN);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %WeakCAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = ($type$) vh.get(byteBuffer$index_para$);
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/AddAndGetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of addAndGet.")
+@Outcome(id = "$value2$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value1$, $value2$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because addAndGet is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %AddAndGet<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/CAETest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndExchange.")
+@Outcome(id = "$value2$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because compareAndExchange is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = %CAE<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = %CAE<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/CASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN, desc = "not both shall fail")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %CAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/GetAndAddTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndAdd.")
+@Outcome(id = "$value1$, $value0$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndAdd is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndAdd<$valueLiteral1$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/GetAndSetTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("Tests atomicity of getAndSet.")
+@Outcome(id = "$value0$, $value1$, $value2$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute before actor2")
+@Outcome(id = "$value2$, $value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 execute after actor2")
+@Outcome(id = "$value0$, $value0$, $value2$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "This won't happen because getAndSet is atomic")
+@State
+public class $TestClassName$ {
+
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        r.r1 = ($type$) %GetAndSet<$valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r2 = ($type$) %GetAndSet<$valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1($Type$Result3 r) {
+        r.r3 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/LoadLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load load fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before fullFence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        field = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = %GetLoadLoadFence<>%
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/LoadLoadNoFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which eliminate effect of load load fence on a volatile variable.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE,  desc = "load var is reordered with load x in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, reordering may happen in actor2, both may read half-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    volatile $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        field = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = %Get<>%
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load var in actor2 before store $value1$ to var in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to var in actor1 before load var in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load x after store var in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load x after store var because only if r1 = $value1$ x may be assigned to $value1$ and then r2 can be $value1$ from x.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = x;
+        %LoadStoreFenceSet<$valueLiteral1$>%
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = field;
+        x = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of load store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load y in actor2 before store $value1$ to y in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to y in actor1 before load y in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN,  desc = "can't load var after store y in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load var after store y because only if r1 = $value1$ var may be assigned to $value1$ and then r2 can be $value1$ from var.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = %GetLoadStoreFence<>%
+        y = $valueLiteral1$;
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        field = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreNoFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which eliminate effect of load store fence on a volatile variable.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load var in actor2 before store $value1$ to var in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to var in actor1 before load var in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "load x is reordered with store var in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load x after store var because only if r1 = $value1$ x may be assigned to $value1$ and then r2 can be $value1$ from x.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when reordering happen, half-value r1 can spread to r2.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    volatile $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = x;
+        %Set<$valueLiteral1$>%
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = field;
+        x = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/LoadStoreNoFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94, when reordering happen, half-value r1 can spread to r2.065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which eliminate effect of load store fence on a volatile variable.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load y in actor2 before store $value1$ to y in actor1, all results are $value0$")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to y in actor1 before load y in actor2")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "load var is reordered with store y in actor1.")
+@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "this won't happen even if load var after store y because only if r1 = $value1$ var may be assigned to $value1$ and then r2 can be $value1$ from var.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when reordering happen, half-value r1 can spread to r2.")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+
+    volatile $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        $type$ i = %Get<>%
+        y = $valueLiteral1$;
+        r.r2 = i;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        field = r.r1;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreLoadFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store load fence.")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        %SetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = field;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreLoadFenceTestWeak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import java.lang.invoke.MethodHandles;
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store load fence, but may fail spuriously, so has different Outcomes with common StoreLoadFenceTest.")
+//when weak cas succeed
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.FORBIDDEN, desc = "if r1 = 0, store var must be submitted already before fullFence in actor2, r2 must get the update")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 not observe x is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe x is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed, if r1 is half-value or value0, store var is submitted before fullFence in actor2, r2 must be full-value, vice versa.
+@Outcome(id = "$value1$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec.")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r1 may read half of x")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreLoadFence<$valueLiteral1$>%
+        r.r1 = x;
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+    
+    @Actor
+    public void actor2($Type$Result3 r) {
+        x = $valueLiteral1$;
+        VarHandle.fullFence();
+        r.r2 = field;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreLoadNoFenceTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which eliminate effect of store load fence on a volatile variable.")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor1 observe actor2 update, actor2 not yet observe actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe actor1 update, actor1 not yet observe actor2 update")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "both actor1 and actor2 observe each other update")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "store var is reordered with load x in actor1.")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//x is volatile, r1 won't be half-value
+@Outcome(id = "$value1$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec. r1 get x update")
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec. t1 not get x update")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    volatile $type$ x;
+       
+    volatile $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1($Type$Result2 r) {
+        %Set<$valueLiteral1$>%
+        r.r1 = x;
+    }
+    
+    @Actor
+    public void actor2($Type$Result2 r) {
+        x = $valueLiteral1$;
+        r.r2 = field;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "var won't be observed to be updated before x is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load x in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load x must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        %StoreStoreFenceSet<$valueLiteral1$>%
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = field;
+        VarHandle.fullFence();
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which take effect of store store fence.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(id = "$value0$, .*", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1() {
+        %SetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreFenceTest2Weak.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result3;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("weakCompareAndSetVolatile can take effect of store store fence, but may fail spuriously, so has different Outcomes with common StoreStoreFenceTest2.")
+//when weak cas succeed
+@Outcome(id = "$value0$, $value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after var is already updated but y hasn't yet")
+@Outcome(id = "$value1$, $value0$, $value1$", expect = Expect.FORBIDDEN,  desc = "y won't be observed to be updated before var is updated")
+@Outcome(id = "$value1$, $value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+//when weak cas fail, r2 can only be $value0$
+@Outcome(id = "$value0$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 not observe y is updated")
+@Outcome(id = "$value1$, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe y is updated")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+//when weak cas succeed
+@Outcome(id = "$value0$, .*, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, when load var in actor2 before storestore Fence in actor1")
+@Outcome(id = ".*, $value1$, $value1$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, if r1 is half-value, load var must get a full-value")
+//when weak cas fail
+@Outcome(id = ".*, $value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "r1 may read half of y")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Actor
+    public void actor1($Type$Result3 r) {
+        boolean result = %WeakSetStoreStoreFence<$valueLiteral1$>%
+        y = $valueLiteral1$;
+        
+        r.r3 = result ? $valueLiteral1$ : $valueLiteral0$;
+    }
+
+    @Actor
+    public void actor2($Type$Result3 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreNoFenceTest1.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which eliminate effect of store store fence on a volatile variable.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE,  desc = "store var is reordered with store x")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, reordering may happen, both may read half-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ x;
+    
+    volatile $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1() {
+        x = $valueLiteral1$;
+        %Set<$valueLiteral1$>%
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = field;
+        r.r2 = x;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/StoreStoreNoFenceTest2.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.Ref;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.$Type$Result2;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+
+@JCStressTest
+@Description("Tests VarHandle methods which eliminate effect of store store fence on a volatile variable.")
+@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables before actor1 update")
+@Outcome(id = "$value0$, $value1$", expect = Expect.ACCEPTABLE, desc = "actor2 observe the variables after x is already updated but var hasn't yet")
+@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE,  desc = "store var is reordered with store y")
+@Outcome(id = "$value1$, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 observe the variables after actor1 update completely")
+#if[alwaysAtomic]
+@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")
+#else[alwaysAtomic]
+@Outcome(expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, reordering may happen, both may read half-value")
+@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")
+#end[alwaysAtomic]
+@State
+public class $TestClassName$ {
+
+    $type$ y;
+    
+    volatile $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1() {
+        %Set<$valueLiteral1$>%
+        y = $valueLiteral1$;
+    }
+
+    @Actor
+    public void actor2($Type$Result2 r) {
+        r.r1 = y;
+        VarHandle.fullFence();
+        r.r2 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/WeakCASContendStrongTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests weakCompareAndSet contend with strong compareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor2 execute after actor1")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 execute before actor1 or win the contention with actor1")
+@Outcome(id = "false, false, $value0$", expect = Expect.FORBIDDEN,  desc = "not both shall fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN,  desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %CompareAndSet<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = field;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jcstress-test-gen/src/main/resources/chapter1b/fields/WeakCASTest.java.template	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package$;
+
+import static java.nio.ByteOrder.BIG_ENDIAN;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.util.Random;
+import java.nio.ByteBuffer;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.Expect;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.Outcome;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.annotations.Description;
+import org.openjdk.jcstress.infra.results.Bool2$Type$Result;
+
+
+@JCStressTest
+@Description("Tests atomicity of weakCompareAndSet.")
+@Outcome(id = "true, false, $value1$", expect = Expect.ACCEPTABLE,  desc = "actor1 update successfully")
+@Outcome(id = "false, true, $value2$", expect = Expect.ACCEPTABLE, desc = "actor2 update successfully")
+@Outcome(id = "false, false, $value0$", expect = Expect.ACCEPTABLE,  desc = "both may fail")
+@Outcome(id = "true, true, $value1$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@Outcome(id = "true, true, $value2$", expect = Expect.FORBIDDEN, desc = "not both shall succeed")
+@State
+public class $TestClassName$ {
+
+    $type$ field;
+
+    static final VarHandle vh;
+
+    static {
+        try {
+            vh = MethodHandles.lookup().findVarHandle($TestClassName$.class, "field", $type$.class);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @Actor
+    public void actor1(Bool2$Type$Result r) {
+        r.r1 = %WeakCAS<$valueLiteral0$, $valueLiteral1$>%
+    }
+    
+    @Actor
+    public void actor2(Bool2$Type$Result r) {
+        r.r2 = %WeakCAS<$valueLiteral0$, $valueLiteral2$>%
+    }
+
+    @Arbiter 
+    public void arbiter1(Bool2$Type$Result r) {
+        r.r3 = field;
+    }
+
+}
\ No newline at end of file
--- a/pom.xml	Tue Jun 07 15:02:35 2016 +0300
+++ b/pom.xml	Thu Jun 09 16:15:20 2016 +0300
@@ -168,6 +168,7 @@
         <module>tests-chapter-0b</module>
         <module>tests-chapter-0c</module>
         <module>tests-chapter-1a</module>
+        <module>tests-chapter-1b</module>
         <module>tests-chapter-2b</module>
         <module>tests-all</module>
     </modules>
--- a/tests-all/pom.xml	Tue Jun 07 15:02:35 2016 +0300
+++ b/tests-all/pom.xml	Thu Jun 09 16:15:20 2016 +0300
@@ -98,5 +98,11 @@
             <artifactId>jcstress-tests-chapter-1a</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.openjdk.jcstress</groupId>
+            <artifactId>jcstress-tests-chapter-1b</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        
     </dependencies>
 </project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests-chapter-1b/LICENSE	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,347 @@
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it.  By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.  This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it.  (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price.  Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights.  These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have.  You must
+make sure that they, too, receive or can get the source code.  And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software.  If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.  We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License.  The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language.  (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope.  The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program).  Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+    a) You must cause the modified files to carry prominent notices stating
+    that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in whole or
+    in part contains or is derived from the Program or any part thereof, to be
+    licensed as a whole at no charge to all third parties under the terms of
+    this License.
+
+    c) If the modified program normally reads commands interactively when run,
+    you must cause it, when started running for such interactive use in the
+    most ordinary way, to print or display an announcement including an
+    appropriate copyright notice and a notice that there is no warranty (or
+    else, saying that you provide a warranty) and that users may redistribute
+    the program under these conditions, and telling the user how to view a copy
+    of this License.  (Exception: if the Program itself is interactive but does
+    not normally print such an announcement, your work based on the Program is
+    not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works.  But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable source
+    code, which must be distributed under the terms of Sections 1 and 2 above
+    on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three years, to
+    give any third party, for a charge no more than your cost of physically
+    performing source distribution, a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of Sections 1
+    and 2 above on a medium customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer to
+    distribute corresponding source code.  (This alternative is allowed only
+    for noncommercial distribution and only if you received the program in
+    object code or executable form with such an offer, in accord with
+    Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it.  For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable.  However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License.  Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License.  However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works.  These actions are prohibited by law if you do not
+accept this License.  Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein.  You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License.  If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices.  Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded.  In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time.  Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission.  For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+    One line to give the program's name and a brief idea of what it does.
+
+    Copyright (C) <year> <name of author>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+    more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc., 59
+    Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+    with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
+    software, and you are welcome to redistribute it under certain conditions;
+    type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.  Here
+is a sample; alter the names:
+
+    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+    'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+    signature of Ty Coon, 1 April 1989
+
+    Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Oracle America and/or its affiliates are
+subject to the following clarification and special exception to the GPL, but
+only where Oracle has expressly included in the particular source file's header
+the words "Oracle designates this particular file as subject to the "Classpath"
+exception as provided by Oracle in the LICENSE file that accompanied this code."
+
+    Linking this library statically or dynamically with other modules is making
+    a combined work based on this library.  Thus, the terms and conditions of
+    the GNU General Public License cover the whole combination.
+
+    As a special exception, the copyright holders of this library give you
+    permission to link this library with independent modules to produce an
+    executable, regardless of the license terms of these independent modules,
+    and to copy and distribute the resulting executable under terms of your
+    choice, provided that you also meet, for each linked independent module,
+    the terms and conditions of the license of that module.  An independent
+    module is a module which is not derived from or based on this library.  If
+    you modify this library, you may extend this exception to your version of
+    the library, but you are not obligated to do so.  If you do not wish to do
+    so, delete this exception statement from your version.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests-chapter-1b/THIRD_PARTY_README	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,29 @@
+DO NOT TRANSLATE OR LOCALIZE.
+-----------------------------
+
+%% This notice is provided with respect to JOpt-Simple v4.6.
+
+--- begin of LICENSE ---
+
+Copyright (c) SourceForge
+
+The MIT License Copyright (c) Permission is hereby granted, free of
+charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests-chapter-1b/pom.xml	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,149 @@
+<!--
+Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 only, as
+published by the Free Software Foundation.  Oracle designates this
+particular file as subject to the "Classpath" exception as provided
+by Oracle in the LICENSE file that accompanied this code.
+
+This code is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+version 2 for more details (a copy is included in the LICENSE file that
+accompanied this code).
+
+You should have received a copy of the GNU General Public License version
+2 along with this work; if not, write to the Free Software Foundation,
+Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+or visit www.oracle.com if you need additional information or have any
+questions.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.openjdk.jcstress</groupId>
+        <artifactId>jcstress-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>jcstress-tests-chapter-1b</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Chapter 1.b: Core Library Foundations: Experimental VarHandles tests</name>
+    <url>http://maven.apache.org</url>
+
+    <scm>
+        <connection>scm:hg:http://hg.openjdk.java.net/code-tools/jcstress/</connection>
+    </scm>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.9</source>
+                    <target>1.9</target>
+                    <debug>false</debug>
+                    <meminitial>4096</meminitial>
+                    <fork>true</fork>
+                    <compilerArgs>
+                        <!--
+                            No, compiler, we need that sun.misc.Contended here.
+                            Stop complaining sun.misc package is invisible. You can't?
+                            Huh, I guess no module access checks for you then:
+                        -->
+                        <arg>-XDnoModules</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>1.2.1</version>
+                <executions>
+                    <execution>
+                        <id>gen</id>
+                        <goals>
+                            <goal>exec</goal>
+                        </goals>
+                        <phase>
+                            generate-sources
+                        </phase>
+                        <configuration>
+                            <executable>${java.home}/bin/java</executable>
+                            <arguments>
+                                <argument>-jar</argument>
+                                <argument>../jcstress-test-gen/target/chapter1b-generator.jar</argument>
+                                <argument>${project.build.directory}/generated-sources/tests/</argument>
+                            </arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>1.7</version>
+                <executions>
+                    <execution>
+                        <id>add-source</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>${project.build.directory}/generated-sources/tests/</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.mycila.maven-license-plugin</groupId>
+                <artifactId>maven-license-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>buildnumber-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-enforcer-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openjdk.jcstress</groupId>
+            <artifactId>jcstress-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjdk.jcstress</groupId>
+            <artifactId>jcstress-test-gen</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests-chapter-1b/src/main/java/Test.java	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+// Stub to break the habit of revision control systems to remove empty dirs
+public class Test {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests-chapter-1b/src/main/resources/LICENSE	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,347 @@
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it.  By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.  This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it.  (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price.  Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights.  These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have.  You must
+make sure that they, too, receive or can get the source code.  And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software.  If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.  We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License.  The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language.  (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope.  The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program).  Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+    a) You must cause the modified files to carry prominent notices stating
+    that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in whole or
+    in part contains or is derived from the Program or any part thereof, to be
+    licensed as a whole at no charge to all third parties under the terms of
+    this License.
+
+    c) If the modified program normally reads commands interactively when run,
+    you must cause it, when started running for such interactive use in the
+    most ordinary way, to print or display an announcement including an
+    appropriate copyright notice and a notice that there is no warranty (or
+    else, saying that you provide a warranty) and that users may redistribute
+    the program under these conditions, and telling the user how to view a copy
+    of this License.  (Exception: if the Program itself is interactive but does
+    not normally print such an announcement, your work based on the Program is
+    not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works.  But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable source
+    code, which must be distributed under the terms of Sections 1 and 2 above
+    on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three years, to
+    give any third party, for a charge no more than your cost of physically
+    performing source distribution, a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of Sections 1
+    and 2 above on a medium customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer to
+    distribute corresponding source code.  (This alternative is allowed only
+    for noncommercial distribution and only if you received the program in
+    object code or executable form with such an offer, in accord with
+    Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it.  For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable.  However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License.  Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License.  However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works.  These actions are prohibited by law if you do not
+accept this License.  Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein.  You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License.  If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices.  Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded.  In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time.  Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission.  For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+    One line to give the program's name and a brief idea of what it does.
+
+    Copyright (C) <year> <name of author>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+    more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc., 59
+    Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+    with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
+    software, and you are welcome to redistribute it under certain conditions;
+    type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.  Here
+is a sample; alter the names:
+
+    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+    'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+    signature of Ty Coon, 1 April 1989
+
+    Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Oracle America and/or its affiliates are
+subject to the following clarification and special exception to the GPL, but
+only where Oracle has expressly included in the particular source file's header
+the words "Oracle designates this particular file as subject to the "Classpath"
+exception as provided by Oracle in the LICENSE file that accompanied this code."
+
+    Linking this library statically or dynamically with other modules is making
+    a combined work based on this library.  Thus, the terms and conditions of
+    the GNU General Public License cover the whole combination.
+
+    As a special exception, the copyright holders of this library give you
+    permission to link this library with independent modules to produce an
+    executable, regardless of the license terms of these independent modules,
+    and to copy and distribute the resulting executable under terms of your
+    choice, provided that you also meet, for each linked independent module,
+    the terms and conditions of the license of that module.  An independent
+    module is a module which is not derived from or based on this library.  If
+    you modify this library, you may extend this exception to your version of
+    the library, but you are not obligated to do so.  If you do not wish to do
+    so, delete this exception statement from your version.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests-chapter-1b/src/main/resources/THIRD_PARTY_README	Thu Jun 09 16:15:20 2016 +0300
@@ -0,0 +1,29 @@
+DO NOT TRANSLATE OR LOCALIZE.
+-----------------------------
+
+%% This notice is provided with respect to JOpt-Simple v4.6.
+
+--- begin of LICENSE ---
+
+Copyright (c) SourceForge
+
+The MIT License Copyright (c) Permission is hereby granted, free of
+charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---