大数据必学Java基础(六十一):同步类容器对比应用
【摘要】 同步类容器应用一、应用问题比如ArrayList,HashMap,线程不安全,现在想把线程不安全的集合转换为线程安全的集合:public class Test01 { //这是main方法,程序的入口 public static void main(String[] args) { //ArrayList为案例:从线程不安全 转为线程安全: List...
同步类容器应用
一、应用问题
比如ArrayList,HashMap,线程不安全,现在想把线程不安全的集合转换为线程安全的集合:
public class Test01 {
//这是main方法,程序的入口
public static void main(String[] args) {
//ArrayList为案例:从线程不安全 转为线程安全:
List list = Collections.synchronizedList(new ArrayList());
}
}
试试ArrayList的线程不安全:
package com.lanson.test02;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author : Lansonli
*/
public class Demo {
//这是main方法,程序的入口
public static void main(String[] args) {
//创建一个ArrayList集合:
ArrayList list = new ArrayList();
//创建一个线程池:线程池定长100
ExecutorService es = Executors.newFixedThreadPool(100);
//并发向集合中添加10000个数据:
for (int i = 0; i < 10000; i++) {
//每个线程处理任务:run方法中的内容就是线程单元,任务,实际线程执行的部分
es.execute(new Runnable() {
@Override
public void run() {
list.add("aaa");
}
});
}
//关闭线程池:
es.shutdown();
//监控线程是否执行完毕:
while(true){
//线程都执行完以后返回true
if(es.isTerminated()){
System.out.println("所有的子线程都执行完毕了!");
//执行完毕以后看一下集合中元素的数量:
System.out.println(list.size());
if(list.size() == 10000){
System.out.println("线程安全!");
}else{
System.out.println("线程不安全!");
}
//线程执行完以后,while循环可以停止:
break;
}
}
}
}
结果:

二、利用同步类容器解决
package com.lanson.test02;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author : Lansonli
*/
public class Demo {
//这是main方法,程序的入口
public static void main(String[] args) {
//创建一个ArrayList集合:
ArrayList oldlist = new ArrayList();
List list = Collections.synchronizedList(oldlist);
//创建一个线程池:线程池定长100
ExecutorService es = Executors.newFixedThreadPool(100);
//并发向集合中添加10000个数据:
for (int i = 0; i < 10000; i++) {
//每个线程处理任务:run方法中的内容就是线程单元,任务,实际线程执行的部分
es.execute(new Runnable() {
@Override
public void run() {
list.add("aaa");
}
});
}
//关闭线程池:
es.shutdown();
//监控线程是否执行完毕:
while(true){
//线程都执行完以后返回true
if(es.isTerminated()){
System.out.println("所有的子线程都执行完毕了!");
//执行完毕以后看一下集合中元素的数量:
System.out.println(list.size());
if(list.size() == 10000){
System.out.println("线程安全!");
}else{
System.out.println("线程不安全!");
}
//线程执行完以后,while循环可以停止:
break;
}
}
}
}
结果:

源码解析:

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)