Difference between revisions of "Atomicity"
Jump to navigation
Jump to search
Line 56: | Line 56: | ||
=Code To Fix= | =Code To Fix= | ||
+ | get then put is not atomic | ||
+ | |||
+ | call compute | ||
+ | |||
+ | call compute | ||
+ | |||
+ | use ConcurrentHashMap | ||
+ | |||
+ | use ConcurrentHashMap | ||
+ | |||
+ | or say shoot! | ||
+ | |||
+ | or say shoot! | ||
+ | |||
{{CodeToImplement|StockPortfolio|transfer|atomicity.stockportfolio.studio}} | {{CodeToImplement|StockPortfolio|transfer|atomicity.stockportfolio.studio}} | ||
Revision as of 20:46, 12 April 2018
Contents
Motivation
Many race conditions can be prevented by proper encapsulation avoiding check-then-write and read-then-modify-then-write in non-atomically.
Background
Code To Investigate
YUCK
class: | CheckThenActCourse.java | DEMO: |
methods: | isSpaceRemaining add drop |
|
package: | atomicity.course.studio | |
source folder: | src//java |
public class CheckThenActCourse { private final Collection<Student> students; private final int limit; public CheckThenActCourse(int limit, Supplier<Collection<Student>> collectionSupplier) { this.students = collectionSupplier.get(); this.limit = limit; } public int getLimit() { return this.limit; } public boolean isSpaceRemaining() { synchronized (this.students) { return this.students.size() < this.limit; } } public void add(Student student) { synchronized (this.students) { this.students.add(student); } } public boolean drop(Student student) { synchronized (this.students) { return this.students.remove(student); } } }
Code To Implement
class: | Course.java | |
methods: | addIfSpace drop |
|
package: | atomicity.course.studio | |
source folder: | student/src/main/java |
method: public boolean addIfSpace(Student student)
(sequential implementation only)
method: public boolean drop(Student student)
(sequential implementation only)
Code To Fix
get then put is not atomic
call compute
call compute
use ConcurrentHashMap
use ConcurrentHashMap
or say shoot!
or say shoot!
class: | StockPortfolio.java | |
methods: | transfer | |
package: | atomicity.stockportfolio.studio | |
source folder: | student/src/main/java |
private final ConcurrentMap<String, Integer> map;
private int transfer(String listingSymbol, int deltaShareCount) { Integer oldValue = this.map.get(listingSymbol); Integer newValue; if (oldValue != null) { newValue = oldValue + deltaShareCount; } else { newValue = deltaShareCount; } this.map.put(listingSymbol, newValue); return newValue; }
Testing Your Solution
Correctness
class: | AtomicityTestSuite.java | |
package: | atomicity | |
source folder: | testing/src/test/java |