Commit 4cbde337 authored by Trisha Gee's avatar Trisha Gee
Browse files

[Ch15] Creating an example that uses CopyOnWriteArrayList to correct store all change

parent 5354648e
Loading
Loading
Loading
Loading
+69 −0
Changes for src/main/java/ch15/ThreadSafeCollection.java: 69 added lines, 0 removed lines.
Original line number Diff line number Diff line
package ch15;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadSafeCollection {
  public static void main(String[] args) {
    ExecutorService threadPool = Executors.newFixedThreadPool(2);
    threadPool.execute(new AddUpperCaseJob());
    threadPool.execute(new AddLowerCaseJob());
    threadPool.shutdown();
  }
}

class DataSafe {
  private final List<String> letters = new CopyOnWriteArrayList<>();
  private final static DataSafe instance = new DataSafe();

  private DataSafe() {
  }

  public static DataSafe getInstance() {
    return instance;
  }

  public List<String> getLetters() {
    return letters;
  }

  public void addLetter(char letter) {
    letters.add(String.valueOf(letter));
  }
}

class AddUpperCaseJob implements Runnable {
  DataSafe a = DataSafe.getInstance();
  char letter = 'A';

  public void run() {
    for (int i = 0; i < 26; i++) {
      a.addLetter(letter++);
      try {
        Thread.sleep(50);
      } catch (InterruptedException ignored) {
      }
    }
    System.out.println("one " + a.getLetters());
    System.out.println("a.getLetters().size() = " + a.getLetters().size());
  }
}

class AddLowerCaseJob implements Runnable {
  DataSafe a = DataSafe.getInstance();
  char letter = 'a';

  public void run() {
    for (int i = 0; i < 26; i++) {
      a.addLetter(letter++);
      try {
        Thread.sleep(50);
      } catch (InterruptedException ignored) {
      }
    }
    System.out.println("two " + a.getLetters());
    System.out.println("a.getLetters().size() = " + a.getLetters().size());
  }
}