java reentrantlock usage considerationsschmidt/cs254/2021-pdfs/4...common traps & pitfalls, e.g....
TRANSCRIPT
![Page 1: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/1.jpg)
Java ReentrantLock
Usage Considerations
Douglas C. [email protected]
www.dre.vanderbilt.edu/~schmidt
Institute for Software
Integrated Systems
Vanderbilt University
Nashville, Tennessee, USA
![Page 2: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/2.jpg)
2
Learning Objectives in this Part of the Lesson• Understand the concept of mutual
exclusion in concurrent programs
• Note a human-known use of mutualexclusion
• Recognize the structure & functionalityof Java ReentrantLock
• Be aware of reentrant mutex semantics
• Know the key methods defined bythe Java ReentrantLock class
• Master how to use ReentrantLockin practice
• Appreciate Java ReentrantLockusage considerations
![Page 3: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/3.jpg)
3
ReentrantLock UsageConsiderations
![Page 4: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/4.jpg)
4
• ReentrantLock must be used via a “fully bracketed” protocol
ReentrantLock Usage Considerations
The thread that acquires the lock must be the one to release it
void someMethod() {
ReentrantLock lock
= this.lock;
lock.lock();
try { ...
} finally {
lock.unlock();
}
}
![Page 5: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/5.jpg)
5
• ReentrantLock must be used via a “fully bracketed” protocol
• This design is known as the “Scoped Locking” pattern
ReentrantLock Usage Considerations
See www.dre.vanderbilt.edu/~schmidt/PDF/locking-patterns.pdf
void someMethod() {
ReentrantLock lock
= this.lock;
lock.lock();
try { ...
} finally {
lock.unlock();
}
}
The finally clause ensures that the lock is released on all paths out the try clause
![Page 6: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/6.jpg)
6
• ReentrantLock must be used via a “fully bracketed” protocol
• This design is known as the “Scoped Locking” pattern
• Implemented implicitly viaJava synchronized methods & statements
ReentrantLock Usage Considerationsvoid someMethod() {
synchronized (this) {
...
}
}
synchronized void anotherMethod()
{
...
}
See lesson on “Java Built-in Monitor Object”
![Page 7: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/7.jpg)
7
• ReentrantLock must be used via a “fully bracketed” protocol
• This design is known as the “Scoped Locking” pattern
• Implemented implicitly viaJava synchronized methods & statements
• This pattern is commonly usedin C++ (& C#) via constructors & destructors
void write_to_file
(std::ofstream &file,
const std::string &msg)
{
static std::mutex mutex;
std::lock_guard<std::mutex>
lock(mutex);
file << msg << std::endl;
}
ReentrantLock Usage Considerations
See en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
![Page 8: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/8.jpg)
8
• ReentrantLock supports “recursive mutex” semantics where a lock may be acquired multiple times by the same thread, without causing self-deadlock
ReentrantLock Usage Considerations
See en.wikipedia.org/wiki/Reentrant_mutex
![Page 9: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/9.jpg)
9
• ReentrantLocks can be tedious & error-prone to program due to common traps & pitfalls
ReentrantLock Usage Considerations
![Page 10: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/10.jpg)
10
• ReentrantLocks can be tedious & error-prone to program due to common traps & pitfalls, e.g.
• Holding a lock for a long time without needing it
ReentrantLock Usage Considerations
void someMethod() {
ReentrantLock lock
= this.lock;
lock.lock();
try {
for (;;) {
// Do something that
// doesn’t involve lock
}
} finally {
lock.unlock();
}
}
![Page 11: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/11.jpg)
11
• ReentrantLocks can be tedious & error-prone to program due to common traps & pitfalls, e.g.
• Holding a lock for a long time without needing it
• Acquiring a lock & forgetting to release it
ReentrantLock Usage Considerations
void someMethod() {
ReentrantLock lock
= this.lock;
lock.lock();
... // Critical section
return;
}
This lock may be locked indefinitely!
![Page 12: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/12.jpg)
12
• ReentrantLocks can be tedious & error-prone to program due to common traps & pitfalls, e.g.
• Holding a lock for a long time without needing it
• Acquiring a lock & forgetting to release it
ReentrantLock Usage Considerations
void someMethod() {
ReentrantLock lock
= this.lock;
lock.lock();
try {
... // Critical section
return;
} finally {
lock.unlock();
}
}
See docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
Use the try/finally idiom to ensure a fully-bracketed semaphore is always released, even if exceptions occur
![Page 13: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/13.jpg)
13
• ReentrantLocks can be tedious & error-prone to program due to common traps & pitfalls, e.g.
• Holding a lock for a long time without needing it
• Acquiring a lock & forgetting to release it
• Releasing a lock that wasnever acquired
• or has already been released
ReentrantLock Usage Considerations
void someMethod() {
ReentrantLock lock
= this.lock;
// lock.lock();
try {
... // Critical section
} finally {
lock.unlock();
}
}
![Page 14: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/14.jpg)
14
• ReentrantLocks can be tedious & error-prone to program due to common traps & pitfalls, e.g.
• Holding a lock for a long time without needing it
• Acquiring a lock & forgetting to release it
• Releasing a lock that wasnever acquired
• Accessing a resource without acquiring a lock for it first
• or after releasing it
Compare with lesson on “Java Built-in Monitor Objects”
ReentrantLock Usage Considerations
void someMethod() {
ReentrantLock lock
= this.lock;
// lock.lock();
try {
... // Critical section
} finally {
// lock.unlock();
}
}
![Page 15: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/15.jpg)
15
• ReentrantLocks can be tedious & error-prone to program due to common traps & pitfalls, e.g.
• Holding a lock for a long time without needing it
• Acquiring a lock & forgetting to release it
• Releasing a lock that wasnever acquired
• Accessing a resource without acquiring a lock for it first
• Calling lock() within the try block
ReentrantLock Usage Considerations
void someMethod() {
ReentrantLock lock
= this.lock;
try {
lock.lock();
... // Critical section
} finally {
lock.unlock();
}
}
Chaos & insanity will result if lock() throws an exception!
![Page 16: Java ReentrantLock Usage Considerationsschmidt/cs254/2021-PDFs/4...common traps & pitfalls, e.g. •Holding a lock for a long time without needing it •Acquiring a lock & forgetting](https://reader036.vdocuments.site/reader036/viewer/2022071517/613b6222f8f21c0c8268f7ec/html5/thumbnails/16.jpg)
16
End of Java ReentrantLockUsage Considerations