Samples JDK
Test.java
1 package com.freemindcafe.concurrency.sample7;
2 
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Map;
6 import java.util.concurrent.ConcurrentHashMap;
7 import java.util.concurrent.CopyOnWriteArrayList;
8 
9 public class Test {
10 
11  @org.junit.Test
12  public void calling_conditional_replace_will_work_only_if_the_state_has_not_been_changed_1() throws Exception{
13  Map<Integer, List<Integer>> cache = new ConcurrentHashMap<Integer, List<Integer>>();
14  List<Integer> l = new ArrayList<>();
15  l.add(1);
16  cache.put(1, l);
17 
18  Runnable r1 = () -> {
19  List<Integer> list = cache.get(1);
20  list.add(2);
21  System.out.println(cache.replace(1, list, list));
22  };
23 
24  Runnable r2 = () -> {
25  while(true){
26  List<Integer> list = cache.get(1);
27  list.add(3);
28  if(!cache.replace(1, list, list)){
29  continue;
30  }
31  break;
32  }
33  };
34 
35  new Thread(r1).start();
36  new Thread(r2).start();
37 
38  synchronized (r2) {
39  r2.wait();
40  }
41 
42  }
43 
44  @org.junit.Test
45  public void calling_conditional_replace_will_work_only_if_the_state_has_not_been_changed_2() throws Exception{
46  Map<Integer, List<Integer>> cache = new ConcurrentHashMap<Integer, List<Integer>>();
47  List<Integer> l = new CopyOnWriteArrayList<Integer>();
48  l.add(1);
49  cache.put(1, l);
50 
51  Runnable r1 = () -> {
52  List<Integer> list = cache.get(1);
53  list.add(2);
54  System.out.println(cache.replace(1, list, list));
55  };
56 
57  Runnable r2 = () -> {
58  while(true){
59  List<Integer> list = cache.get(1);
60  list.add(3);
61  if(!cache.replace(1, list, list)){
62  continue;
63  }
64  break;
65  }
66  };
67 
68  new Thread(r1).start();
69  new Thread(r2).start();
70 
71  synchronized (r2) {
72  r2.wait();
73  }
74 
75  }
76 
77  @org.junit.Test
78  public void calling_conditional_replace_will_work_only_if_the_state_has_not_been_changed_3() throws Exception{
79  Map<Integer, Object> cache = new ConcurrentHashMap<Integer, Object>();
80  cache.put(1, new Object());
81 
82  Runnable r1 = () -> {
83  Object obj = cache.get(1);
84  System.out.println(cache.replace(1, obj, new Object()));
85  };
86 
87  Runnable r2 = () -> {
88  while(true){
89  Object obj = cache.get(1);
90  if(!cache.replace(1, obj, new Object())){
91  continue;
92  }
93  break;
94  }
95  };
96 
97  new Thread(r1).start();
98  new Thread(r2).start();
99 
100  synchronized (r2) {
101  r2.wait();
102  }
103 
104  }
105 
106 }