jtulach@103: package org.apidesign.deadlock; jtulach@103: jtulach@103: import org.junit.Test; jtulach@103: import static org.junit.Assert.*; jtulach@103: jtulach@103: public class SynchronizedFieldsTest { jtulach@103: public SynchronizedFieldsTest() { jtulach@103: } jtulach@103: jtulach@103: @Test jtulach@103: public void increment() { jtulach@103: SynchronizedFields instance = new SynchronizedFields(); jtulach@103: instance.increment(); jtulach@103: } jtulach@103: jtulach@103: @Test jtulach@103: public void unsafeDecrement() { jtulach@103: SynchronizedFields instance = new SynchronizedFields(); jtulach@103: try { jtulach@103: instance.unsafeDecrement(); jtulach@103: } catch (java.lang.AssertionError ex) { jtulach@103: // OK jtulach@103: return; jtulach@103: } jtulach@103: fail("This will fail as unsafeDecrement is not synchronized, and that" + jtulach@103: "is why it cannot access the field using getter and setter" jtulach@103: ); jtulach@103: } jtulach@103: jtulach@103: @Test jtulach@103: public void fixUnsafeDecrementFromOutside() { jtulach@103: SynchronizedFields instance = new SynchronizedFields(); jtulach@103: synchronized (instance) { jtulach@103: // in contract to original "Monitors", one can "fix" this jtulach@103: // problem from outside by using synchronizing externally jtulach@103: instance.unsafeDecrement(); jtulach@103: } jtulach@103: } jtulach@103: }