# HG changeset patch # User wenzelm # Date 1418391117 -3600 # Node ID e557a9ddee5f4671475d6d0b69b5245f6eb71173 # Parent 853a8cb902aa7ac3648cbf82ca98e655172b45ce Synchronized.value is actually synchronized (NB: underlying Unsynchronized.ref is not necessarily volatile); diff -r 853a8cb902aa -r e557a9ddee5f NEWS --- a/NEWS Fri Dec 12 14:30:33 2014 +0100 +++ b/NEWS Fri Dec 12 14:31:57 2014 +0100 @@ -235,6 +235,9 @@ * Renamed "pairself" to "apply2", in accordance to @{apply 2}. INCOMPATIBILITY. +* Synchronized.value (ML) is actually synchronized (as in Scala): +subtle change of semantics with minimal potential for INCOMPATIBILITY. + *** System *** diff -r 853a8cb902aa -r e557a9ddee5f src/Pure/Concurrent/synchronized.ML --- a/src/Pure/Concurrent/synchronized.ML Fri Dec 12 14:30:33 2014 +0100 +++ b/src/Pure/Concurrent/synchronized.ML Fri Dec 12 14:31:57 2014 +0100 @@ -33,7 +33,8 @@ cond = ConditionVar.conditionVar (), var = Unsynchronized.ref x}; -fun value (Var {var, ...}) = ! var; +fun value (Var {name, lock, var, ...}) = + Multithreading.synchronized name lock (fn () => ! var); (* synchronized access *)