import java.util.* ;
import java.util.concurrent.locks.* ;
class Locker implements AutoCloseable {
private final Lock lock;
Locker( Lock lock) { this .lock = Objects.requireNonNull ( lock) ;
this .lock .lock ( ) ; }
@Override public void close( ) { lock.unlock ( ) ; }
}
class Example {
static ReentrantLock lock = new ReentrantLock( ) ;
static void modifySharedState( ) {
lock.unlock ( ) ; // program bug 1. causes unlock() in close() to throw
( ( Object ) null ) .
toString ( ) ; // program bug 2. causes modifySharedState() to throw }
public static void main
( String [ ] args
) { try ( Locker locker = new Locker( lock) ) {
// If both modifySharedState() and unlock()
// throw an exception, the unlock() exception
// is added to the modifySharedState()'s
// suppressed exceptions.
modifySharedState( ) ;
}
}
static {
Thread .
currentThread ( ) .
setUncaughtExceptionHandler ( ) ;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuKjsKCmNsYXNzIExvY2tlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgewogICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGxvY2s7CiAgICBMb2NrZXIoTG9jayBsb2NrKSB7IHRoaXMubG9jayA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwobG9jayk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jay5sb2NrKCk7IH0KICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHsgbG9jay51bmxvY2soKTsgfQp9CiAKY2xhc3MgRXhhbXBsZSB7CglzdGF0aWMgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKICAgIHN0YXRpYyB2b2lkIG1vZGlmeVNoYXJlZFN0YXRlKCkgewogICAgCWxvY2sudW5sb2NrKCk7ICAgICAgICAgICAgICAvLyBwcm9ncmFtIGJ1ZyAxLiBjYXVzZXMgdW5sb2NrKCkgaW4gY2xvc2UoKSB0byB0aHJvdwogICAgCSgoT2JqZWN0KSBudWxsKS50b1N0cmluZygpOyAvLyBwcm9ncmFtIGJ1ZyAyLiBjYXVzZXMgbW9kaWZ5U2hhcmVkU3RhdGUoKSB0byB0aHJvdwogICAgfQogCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJdHJ5IChMb2NrZXIgbG9ja2VyID0gbmV3IExvY2tlcihsb2NrKSkgewoJCSAgICAvLyBJZiBib3RoIG1vZGlmeVNoYXJlZFN0YXRlKCkgYW5kIHVubG9jaygpCgkJICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbiwgdGhlIHVubG9jaygpIGV4Y2VwdGlvbgoJCSAgICAvLyBpcyBhZGRlZCB0byB0aGUgbW9kaWZ5U2hhcmVkU3RhdGUoKSdzCgkJICAgIC8vIHN1cHByZXNzZWQgZXhjZXB0aW9ucy4KCQkgICAgbW9kaWZ5U2hhcmVkU3RhdGUoKTsKCQl9Cgl9CiAKCXN0YXRpYyB7CgkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoCgkJCShUaHJlYWQgdCwgVGhyb3dhYmxlIHgpIC0+CgkJCQl4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KQoJCSk7Cgl9Cn0=