...
Code Block | ||
---|---|---|
| ||
public class BookWrapper { private final Book book; private final Object lock = new Object(); BookWrapper(Book book) { this.book = book; } public void issue(int days) { synchronized(lock) { book.issue(); } } public Calendar getDueDate() { synchronized(lock) { return book.getDueDate(); } } public void renew() { synchronized(lock) { if (book.getDueDate().after( Calendar.getInstance())) { throw new IllegalStateException("Book overdue"); } else { book.issue(14); } } } } |
Wiki Markup |
---|
Consequently, its locking strategy is independent of the locking policy of the {{Book}} instance. This solution incurs a very small performance penalty but the resulting code is much more robust \[[API 06|AA. Java References#API 06]\]. |
Risk Assessment
Using client-side locking when the thread-safe class does not commit to its locking strategy can cause data inconsistencies and deadlock.
...