多线程同时增加和获取数据的情况:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { new Main().test(); } private List<String> mData = new ArrayList<>(); private List<String> mCloneData; private int count = 0; public void test() { new Thread(new Runnable() { @Override public void run() { while (true) { mData.add(count++ + ""); mCloneData = null; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { for (String string : getData()) { System.out.println(string); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); } private List<String> getData() { if (mCloneData == null) { mCloneData = new ArrayList<>(mData); } return mCloneData; } }
多线程同时增加、获取和删除数据的情况:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { new Main().test(); } private List<String> mData = new ArrayList<>(); private List<String> mCloneData; private int count = 0; public void test() { new Thread(new Runnable() { @Override public void run() { while (true) { synchronized (mData) { mData.add(count++ + ""); } mCloneData = null; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { for (String string : getData()) { System.out.println(string); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { synchronized (mData) { Iterator<String> iterator = mData.iterator(); int i = 0; while (iterator.hasNext()) { String string = iterator.next(); int code = count - 1; if (string.equals(code + "")) { iterator.remove(); } if (i < 5) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } i++; } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } private List<String> getData() { if (mCloneData == null) { mCloneData = new ArrayList<>(mData); } return mCloneData; } }
参考链接: