Re: Records and bi-directional relationships

Novi via Concurrency-interest <[email protected]>
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <op.0cuces1jwcnyyd@desktop-p40ugk8>
Hello Brian Goetz,

I always wonder what is the best way to model cycles in Java when using
immutable classes.

> What you're doing in the `Surface` constructor is allowing the `this`
> reference escape during construction, which undermines the memory model
> guarantees for final fields.

After reading your article "Safe construction techniques"[1], I thought it
we be okay if the `this` reference escapes during construction as long as
no other thread can see it.


> What you're doing in the `Surface` constructor is allowing the `this`
> reference escape during construction, which undermines the memory model
> guarantees for final fields.

Does an escaped `this` reference always undermine the memory model
guarantees for final fields?
Or does it only undermine the memory model if the `this` reference is
published during construction so that it is accessible from other threads?


- Novi


1: https://www.ibm.com/developerworks/library/j-jtp0618/index.html



Am 14.12.2019, 23:11 Uhr, schrieb Brian Goetz <[email protected]>:

> I think you are asking: is it possible to create cycles with records?
> And the answer is, mostly no.  (You can have records that have mutable
> components and then later mutate them to be cyclic.
>
> What you're doing in the `Surface` constructor is allowing the `this`
> reference escape during construction, which undermines the memory model
> guarantees for final fields.
>
> On 12/14/2019 4:58 PM, Gunnar Morling wrote:
>> Hi all,
>>
>> I was exploring the records feature in the latest 14 EA build a bit. An
>> interesting question came up in how records will work for
>> bi-directional relationships between two record types.
>>
>> I found no way to instantiate such pair of records without creating a
>> temporary instance of one of the two (unlike with regular classes,
>> where I
>> could wire the relationship from within the constructor of one). Did I
>> miss
>> an alternative way to do so (see below for what I came up with)?
>>
>> A related question: this program will raise a StackOverflowError in the
>> toString() method. Is this an accepted limitation?
>>
>> Thanks,
>>
>> --Gunnar
>>
>>      public class RecordsBidi {
>>          public static void main (String... args) {
>>              Surface surface = new Surface(new Point(1, 2));
>>              System.out.println(surface);
>>          }
>>
>>          record Point(int x, int y, Surface owning) {
>>              public Point(int x, int y) {
>>                  this(x, y, null);
>>              }
>>          }
>>
>>          record Surface(Point center) {
>>              public Surface(Point center) {
>>                 this.center = new Point(center.x, center.y, this);
>>              }
>>          }
>>      }
_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.