多线程之-CopyOnWriteArrayList
2015-03-23 22:07
253 查看
1、测试ArrayList为线程不安全的方法
输出结果:
2、提供线程安全的方式,使用Lock lock = new ReentrantLock(); 提供
3、使用CopyOnWriteArrayList来保证线程安全,他都写入是线程安全的
package jdk; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; /** * Created by yesh on 2015/3/23. */ public class TestCopyOnWriteArrayList { public List<Object> list = new ArrayList<Object>(); public CountDownLatch countDownLatch = new CountDownLatch(20); public static void main(String[] args) throws InterruptedException { final TestCopyOnWriteArrayList arrayList = new TestCopyOnWriteArrayList(); for(int i=0;i<20;i++) { new Thread(new Runnable() { @Override public void run() { arrayList.add(); } }).start(); } arrayList.countDownLatch.await(); System.out.println(arrayList.list.size()); } public void add(){ int size = 1000; for(int i=0;i<size;i++) { try { list.add(new Object()); }finally { } } countDownLatch.countDown(); } }
输出结果:
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 109 at java.util.ArrayList.add(ArrayList.java:441) at jdk.TestCopyOnWriteArrayList.add(TestCopyOnWriteArrayList.java:35) at jdk.TestCopyOnWriteArrayList$1.run(TestCopyOnWriteArrayList.java:23) at java.lang.Thread.run(Thread.java:744)
2、提供线程安全的方式,使用Lock lock = new ReentrantLock(); 提供
package jdk; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created by yesh on 2015/3/23. */ public class TestCopyOnWriteArrayList { public List<Object> list = new ArrayList<Object>(); public CountDownLatch countDownLatch = new CountDownLatch(20); public static void main(String[] args) throws InterruptedException { final TestCopyOnWriteArrayList arrayList = new TestCopyOnWriteArrayList(); for(int i=0;i<20;i++) { new Thread(new Runnable() { @Override public void run() { arrayList.add(); } }).start(); } arrayList.countDownLatch.await(); System.out.println(arrayList.list.size()); } private Lock lock = new ReentrantLock(); //使用Lock来使用 public void add(){ int size = 1000; for(int i=0;i<size;i++) { try { lock.lock(); list.add(new Object()); }finally { lock.unlock(); } } countDownLatch.countDown(); } }
3、使用CopyOnWriteArrayList来保证线程安全,他都写入是线程安全的
package jdk; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; /** * Created by yesh on 2015/3/23. */ public class TestCopyOnWriteArrayList { public List<Object> list = new CopyOnWriteArrayList<Object>(); public CountDownLatch countDownLatch = new CountDownLatch(20); public static void main(String[] args) throws InterruptedException { final TestCopyOnWriteArrayList arrayList = new TestCopyOnWriteArrayList(); for(int i=0;i<20;i++) { new Thread(new Runnable() { @Override public void run() { arrayList.add(); } }).start(); } arrayList.countDownLatch.await(); System.out.println(arrayList.list.size()); } public void add(){ int size = 1000; for(int i=0;i<size;i++) { try { list.add(new Object()); }finally { } } countDownLatch.countDown(); } }
相关文章推荐
- Java多线程系列--【JUC集合02】- CopyOnWriteArrayList
- java多线程(10)--并发类容器 CopyOnWriteArrayList 的使用
- JAVA多线程 之 CopyOnWriteArrayList和CopyOnWriteArraySet
- Java多线程 -- JUC包源码分析2 -- Copy On Write/CopyOnWriteArrayList/CopyOnWriteArraySet
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
- 【多线程】Java并发编程:并发容器之CopyOnWriteArrayList(转载)
- Java多线程-----CopyOnWriteArrayList
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
- 多线程-CopyOnWriteArrayList
- JAVA 多线程随笔 (三) 多线程用到的并发容器 (ConcurrentHashMap,CopyOnWriteArrayList, CopyOnWriteArraySet)
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
- 多线程-CopyOnWriteArrayList
- Java 7之多线程并发容器 - CopyOnWriteArrayList
- CopyOnWriteArrayList引发OOM
- 图解集合3:CopyOnWriteArrayList
- 并发容器之CopyOnWriteArrayList
- list类的变体: Java中 CopyOnWriteArrayList 的使用
- java.util.concurrent.CopyOnWriteArrayList CopyOnWriteArraySet