自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 并发编程(12):ReentrantReadWriteLock 与 StampLock的基本使用与实现原理以及二者的区别。

1、ReentrantReadWriteLock (可重入读写锁) 1.1、在前面我们剖析了ReentrantLock(可重入锁),其实现是使用了AQS同步器来实现的,我们知道ReentrantLock是以独占的方式来实现锁互斥的,也就是说,当去获取锁的时候,如果获取成功就会将当前锁的独占线程设置为当前线程,在锁被占有阶段当其他线程来申请锁的时候,就会被加入到AQS的同步队列中进行等待,当持有锁的线程释放锁,就会去唤醒同步队列中的head节点的next节点的线程,让当前线程重新去申请锁,如果...

2020-06-28 16:41:15 987 2

原创 并发编程(11):Exchanger的基本使用与实现原理

1、什么是Exchanger? Exchanger 顾名思义它是交互器,交换什么呢?怎么交换?是不是一堆小问号,下面一 一来解答,交换的是线程之间的数据,调用Exchanger.exchange(V x)方法就能交互。2、使用案例:public class ExchangerDemo { static Exchanger<String> exchanger = new Exchanger <>(); public static vo...

2020-06-28 11:10:57 414

原创 并发编程(10):Semaphore(信号量)的基本使用与实现原理

1、什么是信号量? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。2、信号量的作用是什么? Semaphore(信号量)就是用来做流量控制的,表示同事允运行的线程数量=信号量定义的数量。3、使用案例:我们定义一个线程数量为5的信号量,5也叫信号量的令牌数量。也就是说线程会只有获取到一个令牌才能执行,执行完成后将令牌归还,方便其他线程使用。public class SemaPhoreDem...

2020-06-22 22:51:53 493

原创 并发编程(9):CyclicBarrier的基本使用与实现原理

1、什么是CyclicBarrier? CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一 组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会 开门,所有被屏障拦截的线程才会继续运行。2、CyclicBarrier的使用场景? 1、我么可以使用CyclicBarrier来模拟并发。其他的场景自己脑补。3、CyclicBarrier的构造函数: ...

2020-06-22 22:25:41 196

原创 spring基本使用(10)-Spring是如何解决bean之间的循环依赖的

1、在之前我们说过,spring之间是允许bean之间相互依赖的,但是不能在构造函数执行期间相互依赖,因此当时给出的解决办法 是使用setter 的方式来依赖注入,那么在spring底层的实现里面是如何解决循环依赖的问题呢?今天我们针对这个问题,做一个详细的实现原理分析。2、演示案例说明:我们有一个用户服务UserService 、RoleService, 我们假设它两相互依赖,其代码如下: UserService:@Service@Order(1)public class ...

2020-06-22 16:18:53 298

原创 并发编程(8):CountDownLatch的基本使用与实现原理

1、CountDownLatch的作用:允许一个或多个线程等待其他线程完成操作。 意思就是使用CountDownLatch来阻塞一条或多条线程,当CountDownLatch的计数被线程减到0后,就唤醒阻塞的一条或多条线程。2、CountDownLatch的使用案例: 案例一:使用一个计数为3的CountDownLatch 实例阻塞两条线程T1、T2,随机创建3条线程,每条线程去将计数-1,当3变成0的时候,就会唤醒阻塞的T1、T2线程。public class C...

2020-06-19 22:05:42 285

原创 并发编程(7):阻塞队列BlockingQueue的基本使用与实现原理

1、队列Queue是一种数据结构,满足FIFO即先进先出的原则,Java中Queue 和 List 、Set 一样都继承自 Collection 接口,其中我们经常用到的 LinkedList 实现了 Queue 接口。2、而在并发队列上, JDK 提供了两套实现:一个就是以ConcurrentLinkedQueue 为代表的高性能的非阻塞队列,一个是以BlockingQueue 为代表的阻塞队列。’例如:ArrayBlockingQueue、LinkedBlockingQueue、Priority..

2020-06-16 22:23:45 262

原创 并发编程(6):Condition的实现者ConditionObject的实现原理

1、什么是Condition? 任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、 wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以 实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等 待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。(并发编程艺术的概念)2、Obj...

2020-06-13 23:31:21 263

原创 并发编程(5):ReentrantLock基本使用与实现原理

1、什么是ReentrantLock? ReentrantLock 是Java 中的一个锁机制的实现,用来保证并发场景下的线程安全问题,类似于synchronized,但是比synchronized性能要好。2、ReentrantLock的基本使用 使用方式1:lock() \ unlock()方法/** * Java ReentrantLock 基本使用 ---》使用1000条线程让一个数加从0加增到1000,每条线程增加1。 */public class...

2020-06-11 00:06:54 322

原创 并发编程(4):死锁、Thread.join()原理、ThreadLocal原理

1、死锁,什么是死锁? 死锁就是存在多个共享资源的时候,存在多线程环境对共享资源的访问的时候,出现了线程之前彼此等待对方释放各自所需要的锁,这就是死锁的概念。 1.1、案例: 我们使用转账来说明死锁,定义两个账户,使用两条线程来进行相互转账。 a 线程由acountW------>acountZ b 线程反过来acountZ------->acountW...

2020-06-05 23:14:47 553 1

原创 并发编程(3):volatile关键字原理、happens-before模型

1、volatile关键字的作用就是解决了线程间的可见性问题。2、什么是线程可见性问题? 在单线程的环境下,如果向一个变量先写入一个值,然后在没有写干涉的情况下读取这个变量的值,那这个时候读取到的这个变量的值应该是之前写入的那个值。这本来是一个很正常的事情。但是在多线程 环境下,读和写发生在不同的线程中的时候,可能会出现:读线程不能及时的读取到其他线程写入的最 新的值。这就是所谓的可见性。3、volatile关键字的基本用法 public class VolatileDem...

2020-06-01 00:12:51 442 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除