Difference between revisions of "Atomic Stack Assignment"
Jump to navigation
Jump to search
(28 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | =Stack= | + | =Motivation= |
− | + | We will build a thread-safe implementation of a Stack using atomics. | |
− | + | =Background= | |
− | + | ==Atomics== | |
− | + | [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html AtomicReference<V>] | |
− | + | : [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html#get-- get()] | |
− | + | : [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html#compareAndSet-V-V- compareAndSet(expect, update)] | |
− | |||
− | |||
=Code To Implement= | =Code To Implement= | ||
− | |||
− | |||
− | |||
− | + | ==AtomicStack== | |
− | + | While ConcurrentStack could simply rely on synchronized to provide thread-safety, AtomicStack must change its data structure. To be {{ThreadSafeLink}}, AtomicStack must correctly use [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html AtomicReference<V>]. | |
− | |||
− | [https:// | ||
− | + | Do NOT hold any [https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html intrinsic locks (via synchronized)] or hold any explicit [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html Locks]. It would be wasteful (and missing the point) to pay the lock overhead when the AtomicReference will get the job done. | |
+ | {{CodeToImplement|AtomicStack|constructor<br/>push<br/>peek<br/>pop|stack.atomic.exercise}} | ||
====constructor and instance variables==== | ====constructor and instance variables==== | ||
− | + | Be sure to initialize whatever state you need to implement a mutable thread-safe Stack using atomics. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
====push==== | ====push==== | ||
====peek==== | ====peek==== | ||
Line 63: | Line 23: | ||
=Testing= | =Testing= | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{{TestSuite|__AtomicStackTestSuite|stack.atomic.exercise}} | {{TestSuite|__AtomicStackTestSuite|stack.atomic.exercise}} | ||
− | = | + | =Pledge, Acknowledgments, Citations= |
− | {{ | + | {{Pledge|atomic-stack}} |
− | |||
− |
Latest revision as of 02:25, 23 April 2024
Contents
Motivation
We will build a thread-safe implementation of a Stack using atomics.
Background
Atomics
Code To Implement
AtomicStack
While ConcurrentStack could simply rely on synchronized to provide thread-safety, AtomicStack must change its data structure. To be @ThreadSafe, AtomicStack must correctly use AtomicReference<V>.
Do NOT hold any intrinsic locks (via synchronized) or hold any explicit Locks. It would be wasteful (and missing the point) to pay the lock overhead when the AtomicReference will get the job done.
class: | AtomicStack.java | |
methods: | constructor push peek pop |
|
package: | stack.atomic.exercise | |
source folder: | student/src/main/java |
constructor and instance variables
Be sure to initialize whatever state you need to implement a mutable thread-safe Stack using atomics.
push
peek
pop
Testing
class: | __AtomicStackTestSuite.java | |
package: | stack.atomic.exercise | |
source folder: | testing/src/test/java |
Pledge, Acknowledgments, Citations
file: | atomic-stack-pledge-acknowledgments-citations.txt |
More info about the Honor Pledge