同步类容器应用
一、应用问题
比如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;
}
}
}
}
结果:
源码解析:
正文完