public class LambdaBehavior { interface Mixin { Map backingMap = Collections.synchronizedMap(new WeakHashMap<>()); default String getName() { return backingMap.get(this); } default void setName(String name) { backingMap.put(this, name); } } interface X extends Runnable, Mixin {} static X makeI() { return () -> System.out.println("x"); } static X makeII() { return new X() { @Override public void run() { System.out.println("X"); } }; } static X makeIII(String s) { return () -> System.out.println(s); } @Test public void thing() { X xi1 = makeI(); X xi2 = makeI(); xi1.setName("x1"); xi2.setName("x2"); X xii1 = makeII(); X xii2 = makeII(); xii1.setName("x1"); xii2.setName("x2"); X xiii1 = makeIII(""); X xiii2 = makeIII(""); xiii1.setName("x1"); xiii2.setName("x2"); System.out.println("Lambda with no implicit closure variable:"); System.out.println(xi1.getName()); System.out.println(xi2.getName()); System.out.println("Anonymous class:"); System.out.println(xii1.getName()); System.out.println(xii2.getName()); System.out.println("Lambda with implicit closure variable:"); System.out.println(xiii1.getName()); System.out.println(xiii2.getName()); } } //Outputs: // Lambda with no implicit closure variable: // x2 // x2 // Anonymous class: // x1 // x2 // Lambda with implicit closure variable: // x1 // x2