`

java同步容器与并发容器

 
阅读更多

一、同步容器

 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集合包中提供了大量的容器类来帮组我们简化开发,下面小编和大家来一起学习下吧

    Java并发:同步容器&并发容器

     在Java并发编程中,经常听到同步容器、并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器,如果有多个...

    Java并发编程:同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。我们来讨论下同步容器。  一.为什么会出现同步容器?  在...

    Java从同步容器到并发容器的操作过程

    主要介绍了Java从同步容器到并发容器的操作过程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    详细介绍java并发编程...  同步容器   并发容器   阻塞队列 高级线程协作工具   信号量   闭锁   关卡 fork-join Executor部分   Executor基础 ThreadPoolExecutor的定制   线程的中断与任务的取消   其他

    Java高并发编程,构建并发编程知识体系,提升面试成功率

    本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段(扩容,缓存,队列,拆分等),构建完整的并发与高并发知识体系,胜任实际开发中并发...

    Java并发编程实战

    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 ...

    Java并发编程原理与实战

    同步容器与并发容器.mp4 并发容器CopyOnWriteArrayList原理与使用.mp4 并发容器ConcurrentLinkedQueue原理与使用.mp4 Java中的阻塞队列原理与使用.mp4 实战:简单实现消息队列.mp4 并发容器ConcurrentHashMap原理与...

    java 并发学习总结

    java并发学习总结 例子:包含(并发容器、同步容器、同步工具、死锁、异常、中断、线程池、返回结果、同步方法等代码例子)

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结。 2、分类文档 JVM虚拟机 JVM特点,结构与执行周期 JVM类加载机制 JVM运行时区数据 JVM执行引擎和垃圾回收 基础语法 理解Java中对象基础Object类 ...

    Java 并发编程实战

    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 ...

    龙果java并发编程完整视频

    第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:...

    Java并发编程实践 PDF 高清版

    5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 Synchronizer 5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 ...

    Java-并发(Concurrent)编程

    资源概要:1,多线程;2,synchronized;3,volatile;4,多线程在JVM中的实现原理剖析 导语: 什么是多线程? 多线程(multithreading...并发工具类、并发容器、阻塞队列 线程池原理剖析 线程池案例-Web容器-压力测试

    龙果 java并发编程原理实战

    第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:...

    Java 并发编程原理与实战视频

    第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:...

    java并发编程.pdf

    2020 该文档涵盖同步容器,线程池,jvm优化.

    JAVA并发编程实践_中文版(1-16章全)_1/4

    5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 synchronizer 5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 ...

    《java并发编程实战》读书笔记-第5章-基础构建模块

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括同步容器类、并发容器类、阻塞队列和生产者消费者模式、阻塞和中断方法、同步工具类。最后是构建高效且可伸缩的结果缓存

Global site tag (gtag.js) - Google Analytics