java.util.concurrent包下并发锁的特点与适用场景
| 序号 | 类 | 备注 | 核心代码 | 适用场景 |
| 1 | synchronized | 同步锁 |
并发锁加在方法级别上,如果是单例class对象,则只能允许一个线程进入 |
排斥相同锁对象进入并发代码块 |
| 2 | Semaphore | 信号量锁 | final Semaphore semaphore = new Semaphore(2,true); //示例new一个对象,指定2个信号量,表示可以允许同时有2个线程进入信号量锁代码块。
semaphore.acquire(); //获取锁,获取不到锁则阻塞。由构造函数的数字决定允许有几个线程可以并发获得这个锁。也就是允许几个线程可以进入这个并发锁持有的代码块。 |
控制线程并发进入某代码块数量 |
| 3 | CountDownLatch | 共享锁 | final CountDownLatch countDownLatch = new CountDownLatch(1); //这里的数字代表需要扣减几次才能执行锁内代码块
countDownLatch.await(); //线程堵塞,等待执行controller.countDown();代码 |
在执行过程中,需要其他已知数量的N个数据作为解除当前线程阻塞的条件。 |
| 4 | Exchanger | 交换器 | 创建Exchanger交换器对象,用来同步producer生产者和consumer消费者
Exchanger<List<String>> exchanger = new Exchanger<List<String>>(); |
生产者和消费者可以控制到一定数量后使用交换器进行交换。 |
| 5 | CyclicBarrier | 栅栏锁 | 定义一个最后执行的线程类:
class DoFinalThread implements Runnable { public void run() { … } } |
在同一个点同步任务。 在执行过程中,需要其他已知数量的N个线程执行完毕,最后再执行指定的一个线程。 |
| 6 | locks.LockSupport | 阻塞锁 | LockSupport.park(); //使当前线程安全阻塞
LockSupport.unpark(threadA); //解锁:唤醒阻塞的指定线程 |
当需要额外线程中的数据参与执行当前线程时。 |
| 7 | Phaser | 阶段同步锁 |
Phaser phaser = new Phaser(3); //new一个阶段锁,表示将会有3个线程并发参与这些分阶段执行的任务。 |
适用于并发任务,且需要将任务分解成多个步骤分阶段同步完成业务。 |
| 8 | ReentrantLock | lock同步锁 |
ReentrantLock lock = new ReentrantLock(true); //true表示先到的线程先获得锁,锁获得的公平机制 |
只允许单个线程执行某个代码块 |
| 9 | ReadWriteLock | 读写锁 | ReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock().lock(); //写锁为独占锁,只能允许单个线程进入临界区(之后的代码块),并且排斥读锁 |
在多个线程间需要同步值,并且读写互斥 |
| 10 | Condition | 条件锁 |
ReentrantLock lock = new ReentrantLock(true); //lock同步锁 |
使线程有条件地进入睡眠状态,有条件的唤醒 |
java.util.concurrent包下并发锁的特点与适用场景的更多相关文章
- java.util.concurrent包下集合类的特点与适用场景
java.util.concurrent包,此包下的集合都不允许添加null元素 序号 接口 类 特性 适用场景 1 Queue.Collection ArrayBlockingQueue 有界.阻塞 ...
- Java并发编程之java.util.concurrent包下常见类的使用
一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public class Co ...
- Java中java.util.concurrent包下的4中线程池代码示例
先来看下ThreadPool的类结构 其中红色框住的是常用的接口和类(图片来自:https://blog.csdn.net/panweiwei1994/article/details/78617117 ...
- 高并发编程基础(java.util.concurrent包常见类基础)
JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...
- 线程并发线程安全介绍及java.util.concurrent包下类介绍
线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...
- 【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构
本文从JDK源码包中截取出concurrent包的所有类,对该包整体结构进行一个概述. 在JDK1.5之前,Java中要进行并发编程时,通常需要由程序员独立完成代码实现.当然也有一些开源的框架提供了这 ...
- 深入理解java:2.3. 并发编程 java.util.concurrent包
JUC java.util.concurrent包, 这个包是从JDK1.5开始引入的,在此之前,这个包独立存在着,它是由Doug Lea开发的,名字叫backport-util-concurrent ...
- java.util.concurrent包
在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Exec ...
- java.util.concurrent包API学习笔记
newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...
随机推荐
- Centos7_64环境搭建
smb搭建参考 https://www.cnblogs.com/areyouready/p/10369917.html activeMq搭建参考 https://blog.csdn.net/u0122 ...
- KMP算法详细分解
1. 引言 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的 ...
- C语言---指针变量详解2
指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法.减法.比较等,请看下面的代码: #include <stdio.h> int main(){ int a = 10, * ...
- 使用docker部署springboot应用
1.构造Dockerfile打包文件 # from base image centos FROM centos #MAINTAINER lirenqing #Java Version #ENV JAV ...
- expdp用户10迁移到新环境11之正式实施
expdp迁移源端数据库:cu 源端IP: 源端schema: xxx目标数据库:ora 目标IP:xxx操作流程:31日凌晨应用停,随后使用数据泵迁移,两套库迁移,迁移一套,迁移完毕应用确 ...
- Convolutional Neural Network Architectures for Matching Natural Language Sentences
interaction n. 互动;一起活动;合作;互相影响 capture vt.俘获;夺取;夺得;引起(注意.想像.兴趣)n.捕获;占领;捕获物;[计算机]捕捉 hence adv. 从此;因 ...
- python 测试登录接口只返回response200的问题
但是使用postman测试是有json串的 后来发现postman传参是用的raw格式,raw的格式相当于json 而这里的data其实是form-data格式,需要用json的格式
- Python全栈之路----常用模块----xml处理模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的 ...
- 转发: 探秘Java中的String、StringBuilder以及StringBuffer
原文地址 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家 ...
- python接口测试-将运行结果写入Excel表格
公司工作是促进学习的第一生产力!! 一个get请求的接口,我想清楚的在Excel中看到所有的数据! 带着学过H5,php觉得所有代码都很简单的自信,在公司开发的[鼓励]下开始了一上午的斗争 一个小时. ...