一、同步容器
Vector、Hashtable、Collections.synchronizedXxx
每次只能有一个线程访问
当同步容器在迭代过程中被修改将会抛出ConcurrentModificationException
二、并发容器
相比同步容器极大提高
1、ConcurrentHashMap、CopyOnWriteArrayList、Queue(ConcurrentLinkedQueue、PriorityQueue)、BlockingQueue、ConcurrentSkipListMap、ConcurrentSkipListSet
2、ConcurrentHashMap
采用分段锁,任意数量读线程并发访问、读写并发访问、一定数量写线程并发发问,
size和isEmpty精确度稍低
3、CopyOnWriteArrayList
写操作时会发布一个新的副本,但会有一定的开销,迭代多于修改时适合使用
4、BlockingQueue
阻塞方法: put和take
LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue、SynchronousQueue(没有队列,生产者直接给消费者,没有中间者)
5、Deque和BlocingDeque
双端队列
public class Test { public static void main(String[] args) { List<Integer> arrInt = new ArrayList<>(); for (int i = 0; i < 50; i++) { arrInt.add(i + 1); } final Queue<Integer> queue = new ConcurrentLinkedQueue<Integer>(); queue.addAll(arrInt); new Thread(new Runnable() { @Override public void run() { while(!queue.isEmpty()) { System.out.println(Thread.currentThread().getName() + " ====> " + queue.poll()); } } }, "a").start(); new Thread(new Runnable() { @Override public void run() { while(!queue.isEmpty()) { System.out.println(Thread.currentThread().getName() + " ====> " + queue.poll()); } } }, "b").start(); new Thread(new Runnable() { @Override public void run() { while(!queue.isEmpty()) { System.out.println(Thread.currentThread().getName() + " ====> " + queue.poll()); } } }, "c").start(); new Thread(new Runnable() { @Override public void run() { while(!queue.isEmpty()) { System.out.println(Thread.currentThread().getName() + " ====> " + queue.poll()); } } }, "d").start(); } }
三、同步工具类
1、闭锁 CountDownLatch
重要方法:
await() 等待计数器为0,否则一直阻塞
countDown() 计数器减一
package com.sosop.nio2; import java.util.concurrent.CountDownLatch; public class CloseLock { public static void main(String[] args) throws InterruptedException { CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(10); for (int i = 1; i <= 10; i++) { new Thread(new Task(String.valueOf(i), begin, end)).start(); } begin.countDown(); end.await(); } } class Task implements Runnable { private String name; private CountDownLatch begin; private CountDownLatch end; public Task(String name, CountDownLatch begin, CountDownLatch end) { this.name = name; this.begin = begin; this.end = end; } @Override public void run() { try{ System.out.println(name + " is waiting ..." ); begin.await(); System.out.println(name + " is working"); } catch (InterruptedException e) { e.printStackTrace(); } finally { end.countDown(); } } }
start.countDown()
end.await()
2.FutureTask
可返回结果,通过Callable实现
三状态:等待运行 正在运行 运行结束
get会阻塞到任务完成返回结果
package com.sosop.nio2; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class ClosableLock { public static void main(String[] args) throws InterruptedException, ExecutionException { MyTask task1 = new MyTask(10, 20); MyTask task2 = new MyTask(99, 1); Thread t1 = new Thread(task1); t1.start(); Thread t2 = new Thread(task2); t2.start(); System.out.println(task1.get()); System.out.println(task2.get()); } } class MyTask extends FutureTask<Integer> { public MyTask(final int a, final int b) { super(new Callable<Integer>() { @Override public Integer call() throws Exception { return a + b; } }); } }
3.信号量
Semaphore
初始化许可或证书的数量,执行操作前都必须获得许可acquir(),执行完成或使用完成后释放许可release()
package nioTest; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.Semaphore; public class SemaphoreTest { public static void main(String[] args) { Pool pool = new Pool(1); pool.add(1); pool.remove(2); pool.add(2); } } class Pool { private Semaphore sem; private Set<Integer> container; public Pool(int size) { container = Collections.synchronizedSet(new HashSet<Integer>()); sem = new Semaphore(size); } public void add(int element) { boolean in = false; try { sem.acquire(); in = container.add(element); } catch (InterruptedException e) { e.printStackTrace(); } finally { if(!in) { sem.release(); } } } public void remove(int element) { boolean out = container.remove(element); if(out) { sem.release(); } } }
4.栅栏
CyclicBarrier
等待所有线程汇集到一个地方再往下执行
闭锁不能重置但栅栏可以重置
package nioTest; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTest { public static void main(String[] args) { new Calculate(88).init().start(); } } class Calculate { private Member[] members; private CyclicBarrier barrier; public Calculate(int count) { this.members = new Member[count]; this.barrier = new CyclicBarrier(count, new Runnable() { @Override public void run() { System.out.println(Calculate.this.total()); } }); } public void start() { for (int i = 0; i < members.length; i++) { new Thread(members[i]).start(); } } public Calculate init() { for (int i = 0; i < members.length; i++) { members[i] = new Member(i + 1, barrier); } return this; } public int total() { int total = 0; for (Member member : members) { total += member.result(); } return total; } } class Member implements Runnable { private int result; private CyclicBarrier barrier; public Member(int result, CyclicBarrier barrier) { this.result = result; this.barrier = barrier; } @Override public void run() { try { this.result = this.result * 8; System.out.println("waiting ..."); barrier.await(); System.out.println("continu ..."); } catch (InterruptedException | BrokenBarrierException e) { return; } } public int result() { return this.result; } }
相关推荐
主要介绍了Java同步容器和并发容器详解,容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,下面小编和大家来一起学习下吧
在Java并发编程中,经常听到同步容器、并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器,如果有多个...
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。我们来讨论下同步容器。 一.为什么会出现同步容器? 在...
主要介绍了Java从同步容器到并发容器的操作过程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
详细介绍java并发编程... 同步容器 并发容器 阻塞队列 高级线程协作工具 信号量 闭锁 关卡 fork-join Executor部分 Executor基础 ThreadPoolExecutor的定制 线程的中断与任务的取消 其他
本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段(扩容,缓存,队列,拆分等),构建完整的并发与高并发知识体系,胜任实际开发中并发...
5.2 并发容器 5.2.1 ConcurrentHashMap 5.2.2 额外的原子Map操作 5.2.3 CopyOnWriteArrayList 5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 ...
同步容器与并发容器.mp4 并发容器CopyOnWriteArrayList原理与使用.mp4 并发容器ConcurrentLinkedQueue原理与使用.mp4 Java中的阻塞队列原理与使用.mp4 实战:简单实现消息队列.mp4 并发容器ConcurrentHashMap原理与...
java并发学习总结 例子:包含(并发容器、同步容器、同步工具、死锁、异常、中断、线程池、返回结果、同步方法等代码例子)
Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结。 2、分类文档 JVM虚拟机 JVM特点,结构与执行周期 JVM类加载机制 JVM运行时区数据 JVM执行引擎和垃圾回收 基础语法 理解Java中对象基础Object类 ...
5.2 并发容器 5.2.1 ConcurrentHashMap 5.2.2 额外的原子Map操作 5.2.3 CopyOnWriteArrayList 5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 ...
第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:...
5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 Synchronizer 5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 ...
资源概要:1,多线程;2,synchronized;3,volatile;4,多线程在JVM中的实现原理剖析 导语: 什么是多线程? 多线程(multithreading...并发工具类、并发容器、阻塞队列 线程池原理剖析 线程池案例-Web容器-压力测试
第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:...
第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:...
2020 该文档涵盖同步容器,线程池,jvm优化.
5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 synchronizer 5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 ...
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括同步容器类、并发容器类、阻塞队列和生产者消费者模式、阻塞和中断方法、同步工具类。最后是构建高效且可伸缩的结果缓存