У меня есть класс обслуживания, содержащий метод для добавления Student
к Section
.Теперь с каждым Section
связан set
из Students
.
Также существует Map<Section, Set<Student>>
, определяющий отношения между ними.
Внешний вид service
что-то вроде этого с методом addStudent
:
public class MembershipService {
private final Map<Section, Set<Student>> studentsBySection = new HashMap<>();
public void addStudentToSection(Student student, Section sec) {
Set<Student> students = studentsBySection.get(sec);
if (students == null) {
students = new HashSet<>();
studentsBySection.put(sec, students);
}
students.add(student);
}
// ..... also containing helper method : getStudents(Section s)
Мне требуется проверить функциональность в многопоточном сценарии, где мне нужно показать, что произойдет, если два или более потоков попытаются добавить или прочитать студентов из общегоmap
.
Я четко знаю, что замена Hashmap
на ConcurrentHashMap
решит мою задачу, но не в состоянии продемонстрировать точное поведение.
Мое решение
Я создал два потока: Student1
и Student2
и попытался передать один и тот же экземпляр Service
обоим и выполнить добавление.Ожидаемое поведение с hashmap
должно быть ConcurrentModificationException
, а с ConcurrentHashMap
оно не должно выбрасываться.Но он не показывает ожидаемое поведение и работает нормально даже с HashMap
.Пожалуйста, руководство.
Вот код:
Student1
public class Student1 implements Runnable{
Services services;
public Student1(Services ser) {
this.services = ser;
new Thread(this, "Student 1").start();
}
@Override
public void run() {
final Student ALEX = new Student("alex");
services.getMembershipService().addStudentToSection(ALEX,services.getSection());;
try {
System.out.println("Student 1 sleeping");
Thread.sleep(100);
} catch (Exception e) {
System.out.println(e);
}
}
}
Student2
public class Student2 implements Runnable{
Services services;
public Student2(Services ser) {
this.services = ser;
new Thread(this, "Student 2").start();
}
@Override
public void run() {
final Student JOHN = new Student("john");
services.getMembershipService().addStudentToSection(JOHN,services.getSection());;
try {
System.out.println("Student 2 sleeping");
Thread.sleep(100);
} catch (Exception e) {
System.out.println(e);
}
}
}
Tester.java
public static void main(String[] args) {
final Services services = ServiceFactory.createServices();
final Section A = new Section("A");
services.createSection(A);
Student1 one = new Student1(services);
Student2 two = new Student2(services);
}
Как мне доказать свою правоту?
ПРИМЕЧАНИЕ: Это не How ConcurrentHashMap works in java
или многопоточность в целом. Об этом известно.Я просто не могу привести его в соответствие с моими требованиями.