public class Tree { public /*@ monitored */ Tree left, right; public /*@ monitored non_null */ Thing contents; //@ axiom (\forall Tree t; t.left != null ==> t < t.left); //@ axiom (\forall Tree t; t.right != null ==> t < t.right); Tree(/*@ non_null */ Thing c) { contents = c; } //@ requires \max(\lockset) <= this; public synchronized void visit() { contents.mungle(); if (left != null) left.visit(); if (right != null) right.visit(); } //@ requires \max(\lockset) <= this; public synchronized void wiggleWoggle() { // Perform a rotation on this.right (but give up and just // return if this.right or this.right.left is null): // // this this // / \ / \ // ... x ... v // / \ --> / \ // v y u x // / \ / \ // u w w y // { Tree x = this.right; if (x == null) return; synchronized (x) { Tree v = x.left; if (v == null) return; synchronized (v) { x.left = v.right; v.right = x; this.right = v; } // line (a) } } // Undo the rotation: { Tree v = this.right; synchronized (v) { // line (b) Tree x = v.right; if (x != null) { // line (c) synchronized (x) { // line (d) v.right = x.left; x.left = v; this.right = x; } } // line (e) } } } }