jmm: Java Memory Model companion code (volatile, happens-before, DCL)
Runnable jcstress + JUnit companion for the ankurm.com post on the Java Memory Model, double-checked locking, and the volatile fix.
This commit is contained in:
Executable
+42
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
# Regenerates every file in output/. Run from the jmm/ directory after `mvn package`.
|
||||
#
|
||||
# Needs a JDK 25 on PATH (or set JAVA_HOME below) - jcstress-core 0.16's annotation
|
||||
# processor is NOT auto-discovered by javac on JDK 25 without -processorpath, which is
|
||||
# why the pom's <annotationProcessorPaths> block exists; see output/04-*.txt.
|
||||
#
|
||||
# The three jcstress runs below use a fixed, non-default JVM config (-jvmArgs) on
|
||||
# purpose: without it, jcstress auto-detects and iterates over several compiler-flag
|
||||
# combinations, multiplying the number of forked JVMs far past what this sandbox's
|
||||
# 2 CPUs can get through in a reasonable time. -f 2 -iters 15 -time 1000 with a fixed
|
||||
# JVM config took about 4m45s per test on that hardware.
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
JAR=target/jcstress.jar
|
||||
[ -f "$JAR" ] || { echo "Run 'mvn package' first."; exit 1; }
|
||||
|
||||
run_test() {
|
||||
local test_class="$1" out_file="$2"
|
||||
echo "==> $test_class"
|
||||
{
|
||||
echo "\$ java -jar target/jcstress.jar -t $test_class -jvmArgs \"-Xmx256m\" -f 2 -iters 15 -time 1000"
|
||||
echo
|
||||
} > "$out_file"
|
||||
java -jar "$JAR" -t "$test_class" -jvmArgs "-Xmx256m" -f 2 -iters 15 -time 1000 -v 2>/dev/null \
|
||||
| awk '/^RUN RESULTS:/{p=1} p==1 && /VM error stream:/{exit} p' >> "$out_file"
|
||||
}
|
||||
|
||||
run_test PlainPublicationTest output/01-plain-publication.txt
|
||||
run_test VolatilePublicationTest output/02-volatile-publication.txt
|
||||
run_test FinalFieldPublicationTest output/03-final-field-publication.txt
|
||||
|
||||
echo "==> SingletonBehaviorTest (JUnit)"
|
||||
mvn -q test
|
||||
{
|
||||
echo '$ mvn -q test'
|
||||
echo
|
||||
cat target/surefire-reports/com.ankurm.jmm.SingletonBehaviorTest.txt
|
||||
} > output/05-singleton-behavior.txt
|
||||
|
||||
echo "Done. output/ regenerated."
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Quick ad hoc jcstress run against one test class, printed to the terminal instead of
|
||||
# a captured output/ file. Example:
|
||||
# ./scripts/run.sh PlainPublicationTest
|
||||
# ./scripts/run.sh PlainPublicationTest -m tough # extra args pass straight through
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
TEST="${1:?Usage: run.sh <TestClassName> [extra jcstress args]}"
|
||||
shift || true
|
||||
|
||||
JAR=target/jcstress.jar
|
||||
[ -f "$JAR" ] || { echo "Run 'mvn package' first."; exit 1; }
|
||||
|
||||
java -jar "$JAR" -t "$TEST" -jvmArgs "-Xmx256m" -f 2 -iters 15 -time 1000 -v "$@"
|
||||
Reference in New Issue
Block a user