Java的List如何实现线程安全?

作者&投稿:大季面 (若有异议请与网页底部的电邮联系)
java arryList 线程安全问题~

直接用Vector就可以了,它是线程安全的。ArrayList list=new ArrayList();就需要锁了,涉及同步,可以参考网上买票例子做。

以下是两个线程:

import java.util.*;

public class Thread_List_Operation {
//假设有这么一个队列
static List list = new LinkedList();

public static void main(String[] args) {
Thread t;
t = new Thread(new T1());
t.start();
t = new Thread(new T2());
t.start();

}

}

//线程T1,用来给list添加新元素
class T1 implements Runnable{

void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "为队列添加了一个元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}

}

}

//线程T2,用来给list添加新元素
class T2 implements Runnable{

void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "为队列添加了一个元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}

}

}

//结果(乱序)
Thread-0为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-1为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-0为队列添加了一个元素
Thread-0为队列添加了一个元素

零基础学习java可按照这份大纲来进行学习
第一阶段:Java专业基础课程
阶段目标:
1. 熟练掌握Java的开发环境与编程核心知识
2. 熟练运用Java面向对象知识进行程序开发
3. 对Java的核心对象和组件有深入理解
4. 熟练应用JavaAPI相关知识
5. 熟练应用JAVA多线程技术
6. 能综合运用所学知识完成一个项目
知识点:
1、基本数据类型,运算符,数组,掌握基本数据类型转换,运算符,流程控制。
2、数组,排序算法,Java常用API,类和对象,了解类与对象,熟悉常用API。
3、面向对象特性,集合框架,熟悉面向对象三大特性,熟练使用集合框架。
4、IO流,多线程。
5、网络协议,线程运用。
第二阶段:JavaWEB核心课程
阶段目标:
1. 熟练掌握数据库和MySQL核心技术
2. 深入理解JDBC与DAO数据库操作
3. 熟练运用JSP及Servlet技术完成网站后台开发
4. 深入理解缓存,连接池,注解,反射,泛型等知识
5. 能够运用所学知识完成自定义框架
知识点:
1、数据库知识,范式,MySQL配置,命令,建库建表,数据的增删改查,约束,视图,存储过程,函数,触发器,事务,游标,建模工具。
2、深入理解数据库管理系统通用知识及MySQL数据库的使用与管理。为Java后台开发打下坚实基础。Web页面元素,布局,CSS样式,盒模型,JavaScript,jQuery。
3、掌握前端开发技术,掌握jQuery。
4、Servlet,EL表达式,会话跟踪技术,过滤器,FreeMarker。
5、掌握Servlet相关技术,利用Servlet,JSP相关应用技术和DAO完成B/S架构下的应用开发。
6、泛型,反射,注解。
7、掌握JAVA高级应用,利用泛型,注解,枚举完成自己的CRUD框架开发为后续框架学习做铺垫。
8、单点登录,支付功能,项目整合,分页封装熟练运用JSP及Servlet核心知识完成项目实战。
第三阶段:JavaEE框架课程
阶段目标:
1. 熟练运用Linux操作系统常见命令及完成环境部署和Nginx服务器的配置
2. 熟练运用JavaEE三大核心框架:Spring,SpringMVC,MyBatis
3. 熟练运用Maven,并使用SpringBoot进行快速框架搭建
4. 深入理解框架的实现原理,Java底层技术,企业级应用等
5. 使用Shiro,Ztree和Spring,SpringMVC,Mybaits完成企业项目
知识点:
1、Linux安装配置,文件目录操作,VI命令,管理,用户与权限,环境部署,Struts2概述,hiberante概述。
2、Linux作为一个主流的服务器操作系统,是每一个开发工程师必须掌握的重点技术,并且能够熟练运用。
3、SSH的整合,MyBatis,SpringMVC,Maven的使用。
4、了解AOP原理,了解中央控制器原理,掌握MyBatis框架,掌握SSM框架的整合。
5、Shiro,Ztree,项目文档,项目规范,需求分析,原型图设计,数据库设计,工程构建,需求评审,配置管理,BUG修复,项目管理等。
6、独立自主完成一个中小型的企业级综合项目的设计和整体架构的原型和建模。独立自主完成一个大型的企业级综合项目,并具备商业价值

1、使用synchronized关键字;
2.使用Collections.synchronizedList();使用方法如下:
假如你创建的代码如下:List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList(),如:
List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());
其他的都没变,使用的方法也几乎与ArrayList一样,大家可以参考下api文档;
额外说下 ArrayList与LinkedList;这两个都是接口List下的一个实现,用法都一样,但用的场所的有点不同,ArrayList适合于进行大量的随机访问的情况下使用,LinkedList适合在表中进行插入、删除时使用,二者都是非线程安全,解决方法同上(为了避免线程安全,以上采取的方法,特别是第二种,其实是非常损耗性能的)。

List 实现线程安全的方式:

java.util.Vector 所有的操作方法都是 synchronized 修饰, 确保线程安全
java.util.Collections.synchronizedList(list) 同样利用 synchronized 代码块, 包装原 list 的操作, 实现线程安全
java.util.concurrent.CopyOnWriteArrayList 读写分离的思想, 写上锁, 读无锁. 写入时, 加锁 (利用了 java.util.concurrent.locks.ReentrantLock 上锁), 复制原数组 (并且数组长度 + 1, 赋值数组末尾元素为要新增的元素), 再更新数组的引用, 解锁.

synchronized一加,或者使用lock 可以实现线程安全,但是这样的List要是很多个,代码量会大大增加。 CopyOnWrite 写入时复制,它使一个List同步的替代品,通常情况下提供了更好的并发性,并且避免了再迭代时候对容器的加锁和复制。

java自带类
在java中我找到自带有两种方法

CopyOnWriteArrayList
CopyOnWrite 写入时复制,它使一个List同步的替代品,通常情况下提供了更好的并发性,并且避免了再迭代时候对容器的加锁和复制。通常更适合用于迭代,在多插入的情况下由于多次的复制性能会一定的下降。

下面是add方法的源代码

public boolean add(E e) {
final ReentrantLock lock = this.lock; // 加锁 只允许获得锁的线程访问
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
// 创建个长度加1的数组并复制过去
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e; // 赋值
setArray(newElements); // 设置内部的数组
return true;
} finally {
lock.unlock();
}
}


ava.sql.SQLException: You have an error in your SQL syntax_百度知 ...
fileid是什么数据类型的?如果是数字的,试试把单引号去掉:String sql = "select * from tblFile where fileID=" + fileID;

关于任务管理器的基本进程代码有哪些?
这些svchost进程提供很多系统服务,如:rpcss服务(remote procedure call)、dmserver服务(logical disk manager)、dhcp服务(dhcp client)等。 如果要了解每个svchost进程到底提供了多少系统服务,可以在win2000的命令提示符窗口中输入“tlist -s”命令来查看,该命令是win2000 support tools提供的。在winxp则使用“tasklist \/...

推荐几个好的FPS射击游戏(除了CF、CS)
反恐行动、AVA、热血战队、狼队、坦克世界(第三人称坦克射击游戏)、绝地反击 这些行吗?http:\/\/games.sina.com.cn\/r\/list\/t_fps\/2.html (新浪排的FPS射击网游排行榜)

tomcat 启动报ava.lang.NoClassDefFoundError
应该是你的JDK的版本太低了,你重新安装下JDK,版本最好是1.6的,然后配置下环境变量,就可以了,我以前也出现过

暴风影音 2007 V7.02.01 全功能完美版支持哪儿些格式?
如果交错设置为1秒这里将是:VAVAVAVAVAVAVAVAVA。Inverse Telecine Telecine 的反向工程。此过程将29.97fps的片源还原为本来的24fps。Keyframe 关键帧 一个...Streamlist 流目录 流目录是一个包括路径名和你的VOB文件名的ASCII测试文件,一行一个文件。这里有一个小例子:e:\\video_ts\\vts_01_1.vobe:\\video_ts...

list of english names with chinese
i just wanna coorect your little mistake amid your inquiry.the right way to spell this word should be "equivalent".

"OAOT"是什么的缩写,以及它在英语中的含义和用法?
在教育领域中,我们常常遇到一个英语缩写词"OAOT",它实际上是"Opiskelun aloituksen osallistava tuki"的缩写,中文翻译为“参与学习初始阶段的支持”。这个缩写词主要用于描述对学习新阶段参与者的辅助措施。它在学术和教育交流中具有一定的使用频率,尤其是在描述为新学期学生提供的各类支持服务时。O...

我要PASCAL源程序
left:=nil;root^.right:=nil;new(tmphead);tmphead:=nil;root^.wrd:=rootkey;root^.dat:=tmphead;end;function ava(v:char):boolean;begin if ((v>='a')and(v<='z')) or ((v>='A')and(v<='Z')) or ((v>='0')and(v<='9')) then ava:=true else ava:=false;...

求 钢炼的歌的歌词
OP1「メリッサ」MERISSA 歌 ポルノグラフィティ 君の手で切り裂いて 远い日の记忆を 悲しみの息の根を止めてくれよ さあ 爱に焦がれた胸を贯け 明日が来るはずの空を见て 迷うばかりの心持てあましている 傍らの鸟がはばたいた どこか光を见つけられたのかな なあ お前の背に...

上古卷轴4提升技能等级的训练师在那
Dog-hater Tsrava位于Leyawiin Dog trainer Ganrednel位于Cheydinhal 大师 Torbern位于Cyrodiil东北,具体位置就不多说了,跟着指南针绝对不会找错的。他没...Glistel位于Chorrol,他是和初级开锁教官Ancrus在一起的 中级 Othrelos位于Evlen Garden区域 Mirabelle Monet位于Anvil的Waterfront 大师 Marana Rian住在Imperial...

黄平县15127139566: 如何线程安全地遍历List -
叔杰雪山: 方式一: for(int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); }方式二: Iterator iterator = list.iterator(); while(iterator.hasNext()) {System.out.println(iterator.next()); }方式三: for(Object item : list) {System.out.println(item); }方式...

黄平县15127139566: java list是不是线程安全的 -
叔杰雪山: 直接用Vector就可以了,它是线程安全的.ArrayList list=new ArrayList();就需要锁了,涉及同步,可以参考网上买票例子做.

黄平县15127139566: java arryList 线程安全问题 -
叔杰雪山: 在Collections工具类中有这样的方法:staticList synchronizedList(List list) 返回线程安全的集合 还有这种的set maP的你看看API文档

黄平县15127139566: List是线程安全的吗?若不是安全,怎么变成安全的 -
叔杰雪山: 你说的是java还是C++? java中解决这个问题通常有两种方法 一:使用synchronized关键字; 二:使用Collections.synchronizedList(); 假如你创建的代码如下:List<Map<String,Object>> data=new ArrayList<Map<String,Object>>(); 那么...

黄平县15127139566: Java中的类如何保证线程安全 -
叔杰雪山: java中,线程安全的解决方法或过程:1.如果对象是immutable,则是线程安全的,例如:String,可以放心使用.2. 如果对象是线程安全的,则放心使用.3.有条件线程安全,对于Vector和Hashtable一般情况下是线程安全的,但是对于某些特殊情况,需要通过额外的synchronized保证线程安全.4.使用synchronized关键字.

黄平县15127139566: java 如何实现一个线程安全的队列 -
叔杰雪山: java.util.concurrent ConcurrentLinkedQueue 类提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列.自己去参考一下jdk5或6的api文档,里面已经实现了

黄平县15127139566: JAVA 中ArrayList的用法! -
叔杰雪山: 1、如何使用ArrayList 最简单的例子: ArrayList List = new ArrayList(); for( int i=0;i <10;i++ ) //给数组增加10个Int元素 List.Add(i); //..程序做一些处理 List.RemoveAt(5);//将第6个元素移除 for( int i=0;i <3;i++ ) //再增加3个元素 List.Add(i+20); Int...

黄平县15127139566: java如何实现线程安全的缓存 -
叔杰雪山: 简单来说就是多线程的时候,多线程同时修改同一个类的时候,由于访问顺序随机导致类功能出错,至于线程安全类设计方法很多的,Java可以用synchronize标识类,只允许一个线程在同一时间访问它,选择线程安全的数据类型例如ArrayList,数组是不安全的,你可以多去百度查!

黄平县15127139566: Java 多线程处理一个List -
叔杰雪山: import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.ArrayUtils; public class Test_4 { /** * 多线程处理list ** @param data 数据list * @param threadNum 线程数 */ public synchronized void handleList(List data, int ...

黄平县15127139566: java并发,如何加锁,哪些类是线程安全的 -
叔杰雪山: 线程安全是指要控制多个线程对某个资源的有序访问或修改,而在这些线程之间没有产生冲突.在Java里,线程安全一般体现在两个方面: 1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网