
并发编程
云哥Y
技术源于实践,技术改变世界!
展开
-
CyclicBarrier用法
CountDownLatch和CyclicBarrierCyclicBarrier在用法上其实跟CountDownLatch十分相似,但是前者功能更加强大。CountDownLatch举例:CountDownLatch countDownLatch=new CountDownLatch(n); 当程序多次执行countDownLatch.countDown();导致计数器n=0时,阻塞的...原创 2019-12-27 15:11:51 · 13020 阅读 · 2 评论 -
并发学习(六)Condition的使用及原理
wait和notify实现生产者消费者模式讲Condition之前,有必要再熟悉下wait和notify结合synchronized实现线程的通信,比如实现生产者和消费者模式。案例代码如下。public class ProductConsumer { private int queueSize = 10; private PriorityQueue<Integer>...原创 2019-12-26 22:18:08 · 352 阅读 · 0 评论 -
并发学习(五)从ReentrantLock走进AQS
通过前面几章的学习,我的脑海里回顾最多的一句话就是:多个线程争抢一把锁,抢到锁的线程执行下面的逻辑,没抢到锁的线程则阻塞。下面来看一段ReentrantLock的简单代码:private Lock lock = new ReentrantLock();private void sayHello() { lock.lock(); System.out.println("hell...原创 2019-12-22 21:53:50 · 167 阅读 · 0 评论 -
并发学习(四)ReentrantReadWriteLock读写锁
诞生背景前面提到的synchronized加锁基本都是排他锁,也就是说只要是多线程竞争情况下,就只能有一个线程获得锁,其余线程阻塞。虽然已经对synchronized进行性能优化了,但是这是从技术层面的优化,它的本质还是排他锁。我们也可以从业务的角度出发,比如存在这种情况:多线程访问同步代码块时,大部分情况下都是读操作,少部分才是写操作。这样的话,如果还是将没获得锁的线程都阻塞起来,太影响性能...原创 2019-12-19 20:16:02 · 168 阅读 · 0 评论 -
并发学习(三)ReentrantLock可重入锁
前面提到了Lock,但它只是一个接口,真正的实现代表类是ReentrantLock。什么是ReentrantLock字面意思就很容易理解:可重入锁。例如有一个线程A调用了lock方法获得锁后,再次调用lock,也能直接获得锁而不需要去阻塞,只需要增加重入次数即可。synchronized和ReentrantLock都是属于可重入锁,下面来看一个经典案例。public class Reentr...原创 2019-12-18 21:32:58 · 165 阅读 · 0 评论 -
并发学习(二)Lock简介
有了synchronized怎么还需要Lock并发书上是这么介绍的锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与...原创 2019-12-17 21:07:19 · 163 阅读 · 0 评论 -
并发学习(一)终于明白了synchronized的实现原理
前提大家应该都了解synchronized是能够保证线程间的可见性以及原子性的吧,如果不了解,赶紧去看下我之前的文章。线程间的可见性synchronized的几种用法再来总结下synchronized的几种用法,无外乎加锁。...原创 2019-12-15 19:29:47 · 218 阅读 · 0 评论 -
线程的起源
早期的计算机(单指令模式)早期的计算机类似我们使用的计算器,你输入指令1+1,它会返回结果2。你不输入指令,它就是闲着不干活的。这样的话,大部分情况下计算机都是处于等待工作的状态,资源得不到合理的利用。批处理模式(多指令模式)单指令情况下,大部分时间里计算机都是闲着的,得想个办法让计算机有效的工作起来。如果我们把一个个指令先汇集起来,然后再交给计算机一次性的去执行,这样不就节省了我们输入指令...原创 2019-01-17 22:54:08 · 888 阅读 · 0 评论 -
CountDownLatch案例
介绍CountDownLatch被new出来的时候会指定调用次数n,如: final CountDownLatch countDownLatch=new CountDownLatch(n); 线程最开始会调用countDownLatch.await();陷入阻塞状态,当n次调用 countDownLatch.countDown();之后,线程从阻塞状态中恢复过来,继续执行下面的操作。...原创 2018-08-09 20:42:02 · 299 阅读 · 0 评论 -
多线程常用方法
1、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。例如有 两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有 Sleep()方法,只有高优先级的线程执...转载 2018-03-01 16:39:51 · 224 阅读 · 0 评论 -
线程间的可见性
概念层面的可见性什么是线程间的可见性? 一个线程对共享变量值的修改,能够及时的被其他线程看到。什么是共享变量? 如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。什么是java内存模型?(Java Memory Model,简称JMM) JMM描述了java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变...原创 2018-04-02 21:06:50 · 10631 阅读 · 3 评论