[concurrency-interest] JLS 17.5

Dr Heinz M. Kabutz heinz at javaspecialists.eu
Wed Feb 26 08:58:18 EST 2020

Looking at JLS13, I noticed the following example 17.5.2:

Example 17.5-2. final Fields For Security
final fields are designed to allow for necessary security guarantees. 
Consider the

following program. One thread (which we shall refer to as thread 1) 

Global.s = "/tmp/usr".substring(4);

while another thread (thread 2) executes

String myS = Global.s;
if (myS.equals("/tmp"))System.out.println(myS);

String objects are intended to be immutable and string operations do not 
perform synchronization. While the String implementation does not have 
any data races, other code could have data races involving the use of 
String objects, and the memory model makes weak guarantees for programs 
that have data races. In particular, if the fields of the String class 
were not final, then it would be possible (although unlikely) that 
thread 2 could initially see the default value of 0 for the offset of 
the string object, allowing it to compare as equal to "/tmp". A later 
operation on the String object might see the correct offset of 4, so 
that the String object is perceived as being "/usr". Many security 
features of the Java programming language depend upon String objects 
being perceived as truly immutable, even if malicious code is using data 
races to pass String references between threads.

It assumes that String has an "offset" field and when we make a 
substring.  However, this was changed in Java 7 already, thus the JLS 
should be updated.


Dr Heinz M. Kabutz (PhD CompSci)
Author of "The Java™ Specialists' Newsletter" - www.javaspecialists.eu
Java Champion - www.javachampions.org
JavaOne Rock Star Speaker
Tel: +30 69 75 595 262
Skype: kabutz

More information about the Concurrency-interest mailing list