JUC
文章平均质量分 76
YellowStar007
每天学习一点点,每天提升一点点
展开
-
JUC学习笔记 -- (1)Volatile和内存可见性
一、内存可见性可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。Java内存模型(JMM)Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。所有的线...原创 2018-10-19 17:03:52 · 347 阅读 · 0 评论 -
JUC学习笔记 -- (11) CyclicBarrier介绍及其与CountDownLatch的区别
CyclicBarrier是多线程中一个常用的辅助类,主要用于线程组内部之间的线程的相互等待问题。 CyclicBarrier根据英文拆分翻译可翻译为:可循环利用的屏障。顾名思义,首先,便是可重复利用,说明该类创建的对象可以复用;其次,屏障则体现了该类的原理:每个线程执行时,都会碰到一个屏障,直到所有线程执行结束,然后屏障便会打开,使所有线程继续往下执行。大致功效可以理解为:等待集合继续执行。...原创 2018-11-12 16:15:19 · 388 阅读 · 0 评论 -
JUC学习笔记 -- (9) ReadWriteLock读写锁的使用
说到Java并发编程,很多开发第一个想到同时也是经常常用的肯定是Synchronized,但是Synchronized存在明显的一个性能问题就是读与读之间互斥,简言之就是,我们编程想要实现的最好效果是,可以做到读和读互不影响,读和写互斥,写和写互斥,提高读写的效率,这就要用到本章的重点ReadWriteLock读写锁。之前文章已经介绍了Lock的一种实现ReentrantLock的使用,其...原创 2018-10-24 19:33:54 · 727 阅读 · 0 评论 -
JUC学习笔记 -- (8) 多线程并发之生产者消费者模式的两种实现
生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。 真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满...原创 2018-10-23 17:49:17 · 411 阅读 · 0 评论 -
JUC学习笔记 -- (7) Condition-线程通信
关于线程通信,使用synchronized时使用wait、notify和notifyAll来实行线程通信。而使用Lock如何处理线程通信呢?答案就是本片的主角:Condition.Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-s...原创 2018-10-23 17:14:26 · 200 阅读 · 0 评论 -
JUC学习笔记 -- (2)并发编程的3个概念 ,原子性,可见性,有序性!
并发编程中的三条性质:原子性,可见性,有序性1.原子性原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。即整体不可分割。在Java中,对基本数据类型(例外就是long和double的非原子协定)的变量的读取和赋值操作是原子性操作。X=10; //原子性(简单的读取、将数字赋值给变量)Y = x; //变量之间的相互赋值,不是原子操...原创 2018-10-21 12:22:38 · 340 阅读 · 0 评论 -
JUC学习笔记 -- (10) 线程池
为什么用线程池 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 例如: 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3 如果T1+T3>T2,那么是不是说开启一个线程来执行这个任务太不划算了! 正好,线程池缓存线程,可用已有的闲置线程来执行新任务,避免了T1+T3带来的系统开销 线程并发数量过多,抢...原创 2018-10-25 16:52:38 · 327 阅读 · 0 评论 -
JUC学习笔记 -- (6) Lock锁初探
首先我们来回忆一下上一节讲过的synchronized关键字,该关键字用于给代码段或方法加锁,使得某一时刻它修饰的方法或代码段只能被一个线程访问。那么试想,当我们遇到这样的情况:当synchronized修饰的方法或代码段因为某种原因(IO异常或是sleep方法)被阻塞了,但是锁有没有被释放,那么其他线程除了等待以外什么事都做不了。当我们遇到这种情况该怎么办呢?我们今天讲到的Lock锁将有机会为此...原创 2018-10-22 12:05:06 · 2959 阅读 · 0 评论 -
JUC学习笔记 -- (5) 线程创建的第三种方式Callable
创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就产生了第三种方式:实现Callable接口的方式,可以获取到线程执行的返回值。Callable和Future介绍...原创 2018-10-22 11:44:37 · 177 阅读 · 0 评论 -
JUC学习笔记 -- (4) CountDownLatch闭锁
CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch类只提供了一个构造器:public CountDownLatch(int count) { }; //参数count为计数值...原创 2018-10-22 11:22:50 · 171 阅读 · 0 评论 -
JUC学习笔记 -- (3)同步容器类和并发容器类
一、同步容器类包括Vector(实现了一个动态数组,和ArrayList相似,但两者是不同的)和Hashtable。同步容器类的问题:例如:Vector的getLast方法,和deleteLast方法,都会执行“先检查,后执行”操作,每个方法首先都获得数组的大小,然后通过结果来获取或删除最后一个元素。如果线程A调用getLast,线程B调用deleteLast,在线程A调用size和g...原创 2018-10-22 10:55:24 · 194 阅读 · 0 评论 -
JUC学习笔记 -- (12) Semaphore的用法
在并发编程中,Semaphore也是常用的一个辅助类。Semaphore翻译成字面意思为 信号量,Semaphore可以控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。 Semaphore类位于java.util.concurrent包下,它提供了2个构造器://参数permits表示许可数目,即同时可以允许多少...原创 2018-11-12 16:35:34 · 179 阅读 · 0 评论