CopyOnWriteArrayList并发理解
2016-05-03 15:06
393 查看
public class CopyOnWriteArrayListTest {
// ConcurrentLinkedQueue list = new ConcurrentLinkedQueue();
// System.out.println(“get:” + list.poll());
System.out.println(“get:” + list.get(0));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
虽然CopyOnWriteArrayList适用于读大写小的场景,原因是读时无锁,写时有锁,但是其在并发读写时还是需要注意get时的ArrayIndexOutOfBoundsException错误,例子如上,此时会抛出以下异常:
Exception in thread “2” java.lang.ArrayIndexOutOfBoundsException: 0
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:368)
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:377)
at me.base.knowledge.sync.CopyOnWriteArrayListTestWorker.run02(CopyOnWriteArrayListTest.java:29)atme.base.knowledge.sync.CopyOnWriteArrayListTestWorker.run02(CopyOnWriteArrayListTest.java:29)
at me.base.knowledge.sync.CopyOnWriteArrayListTestWorker.run(CopyOnWriteArrayListTest.java:43)
at java.lang.Thread.run(Thread.java:745)
但是换用线程安全的ConcurrentLinkedQueue后,无异常抛出,但是也失去的高读性能。
private static class Worker implements Runnable { CopyOnWriteArrayList list = new CopyOnWriteArrayList();
// ConcurrentLinkedQueue list = new ConcurrentLinkedQueue();
private void run01() { System.out.println(Thread.currentThread().getName() + " enter run01"); System.out.println("remove:" + list.remove(0)); } private void run02() { System.out.println(Thread.currentThread().getName() + " enter run02"); try { list.add("A"); Thread.sleep(2000);
// System.out.println(“get:” + list.poll());
System.out.println(“get:” + list.get(0));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override public void run() { String name = Thread.currentThread().getName(); if (name.equals("1")) { run01(); } if (name.equals("2")) { run02(); } } } public static void main(String[] args) { Worker work = new Worker(); Thread th1 = new Thread(work, "1"); Thread th2 = new Thread(work, "2"); th1.start(); th2.start(); System.out.println("end"); }
}
虽然CopyOnWriteArrayList适用于读大写小的场景,原因是读时无锁,写时有锁,但是其在并发读写时还是需要注意get时的ArrayIndexOutOfBoundsException错误,例子如上,此时会抛出以下异常:
Exception in thread “2” java.lang.ArrayIndexOutOfBoundsException: 0
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:368)
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:377)
at me.base.knowledge.sync.CopyOnWriteArrayListTestWorker.run02(CopyOnWriteArrayListTest.java:29)atme.base.knowledge.sync.CopyOnWriteArrayListTestWorker.run02(CopyOnWriteArrayListTest.java:29)
at me.base.knowledge.sync.CopyOnWriteArrayListTestWorker.run(CopyOnWriteArrayListTest.java:43)
at java.lang.Thread.run(Thread.java:745)
但是换用线程安全的ConcurrentLinkedQueue后,无异常抛出,但是也失去的高读性能。
相关文章推荐
- shop++内存溢出配置
- Spinner-DropDown下划线和位置
- WEB打印插件Lodop
- 第2课:SparkStreaming 透彻理解三板斧之二:解密SparkStreaming运行机制和架构
- (OK) dnf——install docker on Fedora23
- new/delete operator、operator new/delete、placement new
- Centos运行级别和开机过程
- tomcat启动startup.bat一闪而过
- Nginx打开目录浏览功能(autoindex)
- top命令显示CPU使用率过了100%原因
- centos7安装DNS服务器
- citytech摄像头 opencv+rtsp获得图像
- 免安装版本tomcat的变量配置
- Adobe Photoshop CC2015 下载-安装-注册机破解
- Hadoop新手学习指导之hadoop核心知识学习
- 深入理解Linux内核day06--进程调度
- linux下c编程之UDP
- nginx 配置文件详解
- Linux suid功能
- linux下的切割文件命令split