哪些集合对象线程是安全的,哪些是不安全的。
来源:互联网 发布:php开源做账系统 编辑:程序博客网 时间:2024/06/08 20:08
- 首先给出结论,ArrayList,LinkedList,HashMap,StringBuilder是不安全的。vector,HashTable,StringBuffer是线程安全的。下面用代码来看看。
- ArrayList测试
package testThread;import java.util.ArrayList;import java.util.List;class Ticket implements Runnable { private static int t=0; List<Integer> data = new ArrayList<>(); boolean flag=true; public void run() { while (flag) { if (t<100) { data.add(t); t++; //System.out.println(t); }else { flag=false; System.out.println("数据宽度"+data.size()); for (int i = 0; i < data.size(); i++) { System.out.println(data.get(i)); } } } } }public class thread1 { public static void main(String[] args) { Ticket t=new Ticket(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); t1.start(); t2.start(); t3.start(); }}
ArrayList测试结果
2.LinkedList
package te;import java.util.LinkedList;import java.util.List;class Ticket implements Runnable { private static int t=0; List<Integer> data = new LinkedList<Integer>(); boolean flag=true; public void run() { while (flag) { if (t<100) { data.add(t); t++; //System.out.println(t); }else { flag=false; System.out.println("数据宽度"+data.size()); for (int i = 0; i < data.size(); i++) { System.out.println(data.get(i)); } } } } }public class Thread7 { public static void main(String[] args) { Ticket t=new Ticket(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); t1.start(); t2.start(); t3.start(); }}
LinkedList结果
3.HashMap
package te;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;class Ticket implements Runnable { private static int t=0; Map data = new HashMap<Integer,Integer>(); boolean flag=true; public void run() { while (flag) { if (t<100) { data.put(t,t); t++; //System.out.println(t); }else { flag=false; Collection da=data.values(); Iterator<Integer> it=da.iterator(); while (it.hasNext()) { Integer integer = (Integer) it.next(); System.err.println(integer); } } } } }public class Thread7 { public static void main(String[] args) { Ticket t=new Ticket(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); t1.start(); t2.start(); t3.start(); }}
HashMap测试
4.vector
package te;import java.util.Vector;class Ticket implements Runnable { private static int t=0; Vector<Integer> vector=new Vector<Integer>(); boolean flag=true; public void run() { while (flag) { if (t<100) { vector.add(t); t++; }else { flag=false; for(int i=0;i<vector.size();i++) { System.out.println(vector.get(i)); } } } } }public class Thread7 { public static void main(String[] args) { Ticket t=new Ticket(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); t1.start(); t2.start(); t3.start(); }}
vector线程是安全的
5.stringbuilder和stringbuffer
package te;class Ticket implements Runnable { private static int t=0; StringBuffer sb = new StringBuffer(); StringBuilder sc=new StringBuilder(); boolean flag=true; public void run() { while (flag) { if (t<100) { sb.append(t+"a "); sc.append(t+"a "); t++; }else { flag=false; System.out.println("stringbuffer"+sb); System.out.println("stringbuilder"+sc); } } } }public class Thread7 { public static void main(String[] args) { Ticket t=new Ticket(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); t1.start(); t2.start(); t3.start(); }}
结果测试 stringbuilder是不安全的
6.分析总结
凡是线程不安全的,我们可以来看源码来分析 ,这是arraylist的源码,我们很容易发现这是由于没有synchronized关键字。
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
再来看看vector,有synchronized关键字。
public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
0 0
- 哪些集合对象线程是安全的,哪些是不安全的。
- Java哪些集合类是线程安全的?
- SimpleDateFormat是线程不安全的,怎样使用使其安全?
- .Net 中 System.IO.File 中的方法哪些是线程安全的
- 怎么理解Stringbuffer是线程安全的stringbuilder是线程不安全的
- 验证java的StringBuffer是线程安全而StringBuilder是线程不安全的
- StringBuffer JDK1.0出现是线程安全的 StringBuilderJDK1.5出现是线程不安全的
- 代码验证java的StringBuffer是线程安全而StringBuilder是线程不安全的
- 哪些数据库是免费的?
- 哪些人是有罪的?
- c++的应用领域是哪些?
- 集合对象中是线程安全
- HashMap为什么是线程不安全的?
- Servlet为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- springboot集成activemq,超赞!!!
- iOS中关于适配的那些事(本篇首要了解autoresizing、autoLayout、VFL;下篇了解第三方适配)
- 八皇后问题
- C++11时代的标准库快餐教程(3) - 排序
- 多个用户对一个文件操作
- 哪些集合对象线程是安全的,哪些是不安全的。
- Collection集合大家族
- 使用原子主机、Ansible 和 Cockpit 部署容器
- 下载图片
- STL笔记(2)-vector,迭代器具体用法介绍
- Vue结合原生js实现自定义组件自动生成
- 判断回文结构 python
- 第八章
- Linux 五大初始化系统