Draft JEP on enhanced volatiles

Remi Forax forax at univ-mlv.fr
Sun Feb 9 12:11:17 UTC 2014


On 02/08/2014 04:50 PM, Doug Lea wrote:
> On 02/08/2014 06:19 AM, Remi Forax wrote:
>
>> It seems I have to answer.
>> You don't need to have what you call 'method-handle-macros' to 
>> implement the
>> .volatile syntax,
>
> (Aside: I love macros enough to want them to be done right someday,
> but they seem to be the wrong plan of attack for this problem.)

What I propose is not macros but a way to write intrinsics in Java,
which I think is the right way to tackle this problem, at API level,
you can still see intrinsics has a kind of macro system, but I don't 
think it helps.


>
>> Let me try to summarize the problems you mention earlier,
>> there are two main issues with the current 
>> java.util.concurrent.atomic API,
>
> Another: There is a (very!) undesirable but available fallback for 
> .volatile
> that doesn't apply to FieldUpdaters: If method handles don't work
> out, generate exactly the same Unsafe code that we manually write
> today, with some crazy further fallback if run on a JVM not
> supporting the intrinsics.

I think you can not do that, because for that you need to publicly 
expose the methods of Unsafe,
so someone may generate a bytecode that call these methods creating a 
security hole.
That's why these methods were put in Unsafe after all.

>
> -Doug

Rémi

>
>
>
>>    - erasure of generics,
>>      because of that, the API implementation does numerous of runtime 
>> checks
>>      which have a cost at runtime hence some users perfers to use the
>>      unsupported class sun.misc.Unsafe
>>    - no lvalue or & at language level,
>>      because of that the volatile field name is passed as a pair 
>> (Class, String)
>>      and at runtime
>>
>> For the former, erasure of generics, we had the same issue with the 
>> creation of
>> a lambda
>> because the runtime need the reified types in order to create the 
>> proxy class
>> with the right bridges. This was solved by using invokedynamic because
>> invokedynamic
>> allows to pass out of band values representing the non-erased types.
>>
>> For the later, the .volatile syntax introduces a language level way 
>> to reference
>> a field,
>> this is exactly what we want, hooray as Brian wrote. That's true but 
>> there is a
>> downside,
>> not in the syntax by itself but in the way the syntax is coupled with 
>> a class
>> VolatileXXX.
>> Accessing to the field in order to modifying it will require to pass 
>> through an
>> instance
>> of VolatileXXX which introduce an extra level of indirection.
>> Because of that level of indirection, users may still prefer to use 
>> Unsafe.
>> This problem can be solved if VolatileXXX take a 
>> java.lang.reflect.Field at
>> construction
>> (or any values that morally represent a field) and not own the field 
>> itself.
>>
>>>
>>>
>>>> I think that making required performance characteristics (e.g. 
>>>> "must be
>>>> equivalent in performance to Unsafe counterparts") a part of 
>>>> acceptance
>>>> criteria is also something that should be done.
>>>
>>> Yes. I don't think this needs writing down though. If people
>>> continue to use Unsafe in these cases for the sake of performance,
>>> we all lose.
>>
>> cheers,
>> Rémi
>>
>
>




More information about the core-libs-dev mailing list