27 多线程(七)——并发容器

在java中,有一个专门用来处理并发容器的包:java.util.concurrent 包,其中有一个CopyOnWriteArrayList类,相当于ArrayList的线程安全版。

我们可以使用它代替ArrayList,就无需加synchronized来锁线程了。

注:本节内容了解即可(面试用),因为这是高级并发才会使用的,后期再来补充本文。

先拿之前1w个线程往ArrayList容器添加内容的例子来看。

代码:

package _20191205;
import java.util.List;
import java.util.ArrayList;
public class SynBlockTest02 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();

		for(int i = 0;i < 10000;i++	) {

			new Thread(()->{
				synchronized (list) {//重点在这里,synchronized代码要与被锁的对象被修改的地方尽可能近
					list.add(Thread.currentThread().getName().toString());
				}
			},"线程"+i).start();
		}
		System.out.println("8s后输出结果");
		try {
			Thread.sleep(8000);
		}catch(InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(list.size());

	}
}

  

然后我们就可以修改为线程版的ArrayList:

导包,把ArrayList替换为CopyOnWriteArrayList,删掉synchronized同步块。

package _20191205;
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
public class SynBlockTest06 {
	public static void main(String[] args) {
		CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

		for(int i = 0;i < 10000;i++	) {

			new Thread(()->{
			  list.add(Thread.currentThread().getName().toString());
			},"线程"+i).start();
		}
		System.out.println("8s后输出结果");
		try {
			Thread.sleep(8000);
		}catch(InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(list.size());

	}
}

  

原文地址:https://www.cnblogs.com/Scorpicat/p/11994557.html

时间: 2024-11-14 21:50:38

27 多线程(七)——并发容器的相关文章

多线程之并发容器ConcurrentHashMap(一)

简介 ConcurrentHashMap 是 util.concurrent 包的重要成员.本文将结合 Java 内存模型,分析 JDK 源代码,探索 ConcurrentHashMap 高并发的具体实现机制. 由于 ConcurrentHashMap 的源代码实现依赖于 Java 内存模型,所以阅读本文需要读者了解 Java 内存模型.同时,ConcurrentHashMap 的源代码会涉及到散列算法和链表数据结构,所以,读者需要对散列算法和基于链表的数据结构有所了解. Java 内存模型 由

多线程并发容器CopyOnWriteArrayList

原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet.CopyOnW

多线程的并发一般不是程序员决定,而是由容器决定

多线程的并发一般不是程序员决定,而是由容器决定. 多线程出现故障的原因: 两个线程同时访问一个数据资源(临界资源),形成数据发生不一致和不完整. 数据的不一致往往是因为一个线程中的两个关联的操作只完成了一步. 1 package TomTexts; 2 3 4 class ExceptionExam7_1 extends Exception //自定义异常类ExceptionExam7_1 5 { 6 private int show; 7 ExceptionExam7_1 (int a) 8

多线程系列五:并发工具类和并发容器

一.并发容器 1.ConcurrentHashMap 为什么要使用ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表 形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry. HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下Hash

Java学习笔记—多线程(同步容器和并发容器)

简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector.Hashtable以及SynchronizedList等容器,如果有多个线程调用同步容器的方法,它们将会串行执行. 可以通过查看Vector.Hashtable等同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchronized,但在某

27 Apr 18 GIL 多进程多线程使用场景 线程互斥锁与GIL对比 基于多线程实现并发的套接字通信 进程池与线程池 同步、异步、阻塞、非阻塞

27 Apr 18 一.全局解释器锁 (GIL) 运行test.py的流程: a.将python解释器的代码从硬盘读入内存 b.将test.py的代码从硬盘读入内存  (一个进程内装有两份代码) c.将test.py中的代码像字符串一样读入python解释器中解析执行 1 .GIL:全局解释器锁 (CPython解释器的特性) In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple na

多线程六 同步容器&amp;并发容器

同步容器(使用的是synchronized,并且不一定是百分百安全) 本篇续 -- 线程之间的通信 ,介绍java提供的并发集合,既然正确的使用wait和notify比较困难,java平台为我们提供了更高级的并发容器来替代 一. Vector&ArrayList Vector虽然它的set和get方法都被Synchronized修饰,但是开启两条线程并发访问,一条线程拼命往里写,另一台循环往移除,这样并发访问不一定是百分百的线程安全的,很可能出现数组越界异常,而且现在基本已经不适用它了,它基本被

深入浅出 Java Concurrency (27): 并发容器 part 12 线程安全的List/Set[转]

本小节是<并发容器>的最后一部分,这一个小节描述的是针对List/Set接口的一个线程版本. 在<并发队列与Queue简介>中介绍了并发容器的一个概括,主要描述的是Queue的实现.其中特别提到一点LinkedList是List/Queue的实现,但是LinkedList确实非线程安全的.不管BlockingQueue还是ConcurrentMap的实现,我们发现都是针对链表的实现,当然尽可能的使用CAS或者Lock的特性,同时都有通过锁部分容器来提供并发的特性.而对于List或者

非阻塞算法在并发容器中的实现【转】

转自:https://www.ibm.com/developerworks/cn/java/j-lo-concurrent/ 非阻塞算法在 Java 中的应用越来越广泛 , ConcurrentLinkedQueue 是 java. concurrent 包中基于非阻塞算法实现的并发容器的典范.通过本文,您将了解非阻塞算法的工作原理及其在 ConcurrentLinkedQueue 中的具体实现机制. 简介 非阻塞算法在更细粒度的层面协调争用,它比传统的锁有更高的并发性.随着非阻塞算法在 Jav