本文主要是介绍【Java多线程】并发容器CopyOnWriteArrayList,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一个不安全的List
预期输出结果为10000,但是实际运行结果为9992,是因为线程不安全,应该使用synchronized同步块
不安全代码
package cn.hanquan.test;import java.util.ArrayList;
import java.util.List;/** 线程不安全的例子*/
public class TestList {public static void main(String[] args) throws InterruptedException {List<String> list = new ArrayList<String>();for (int i = 0; i < 10000; i++) {new Thread(() -> {list.add(Thread.currentThread().getName());}).start();}Thread.sleep(10000);System.out.println(list.size());}
}
安全代码:(1)
输出结果为:10000
package cn.hanquan.test;import java.util.ArrayList;
import java.util.List;/** 线程安全的例子*/
public class TestList {public static void main(String[] args) throws InterruptedException {List<String> list = new ArrayList<String>();for (int i = 0; i < 10000; i++) {new Thread(() -> {synchronized (list) {list.add(Thread.currentThread().getName());}}).start();}Thread.sleep(10000);System.out.println(list.size());}
}
安全代码:(2)
- 使用安全的
CopyOnWriteArrayList
替代普通的List
CopyOnWriteArrayList能够保证工作内存和主内存在写的过程中能够正确的控制。因为其内部已经实现了synchronized。
package cn.hanquan.test;import java.util.concurrent.CopyOnWriteArrayList;/** 线程不安全的例子*/
public class TestList {public static void main(String[] args) throws InterruptedException {CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();for (int i = 0; i < 10000; i++) {new Thread(() -> {list.add(Thread.currentThread().getName());}).start();}Thread.sleep(10000);System.out.println(list.size());}
}
输出结果为:10000
这篇关于【Java多线程】并发容器CopyOnWriteArrayList的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!