
多线程并发
Goergiana Cavendish
青白随人怜阮眼,行藏由我养陶腰
展开
-
Volatile为什么能保证禁止重排序
上一篇提到了内存屏障,volatile通过插入读屏障和写屏障保证可见性,在volatile禁止重排序上,也是通过内存屏障实现的。因为内存屏障可以使一些指令按照特定顺序执行。volatile禁止指令重排序的规则: 1.当第二个操作是voaltile写时,无论第一个操作是什么,都不能进行重排序 2.当地一个操作是volatile读时,不管第二个操作是什么,都不能进行重排序 3.当第一个操作是...原创 2019-07-29 15:59:44 · 1895 阅读 · 6 评论 -
多线程的锁之悲观锁乐观锁的对比学习
悲观锁:读取数据之前,假设会发生并发冲突,所以从一开始就为了防止冲突,在获取数据的时候进行加锁,确保自己使用的过程中不会被修改,使用完成之后在进行锁的释放。典型的是Synchronized乐观锁:假定不会发生数据冲突,所以获取数据的时候不加锁,但是在提交数据的时候,会判断是否被修改过,如果被修改过则不进行数据更新,如果判断没被其他线程修改,则进行数据更新。乐观锁底层使用CAS无锁机制实现的CA...原创 2019-07-29 16:17:01 · 220 阅读 · 1 评论 -
多线程的锁之线程池核心参数
核心构造方法:ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlokingQueueworkQueue){}重要的参数:1, corePoolSize:核心线程数,2, maximumPoolSize:最大线程数3, keepAliveTime , 存活时间...原创 2019-07-29 17:00:44 · 251 阅读 · 1 评论 -
多线程之Callable和Future
Callable创建线程可以继承Thread类,重写run方法,也可以使用匿名内部类,也可实现Runnable接口,但是实现Runnable类,重写run方法并没有返回值。从JDK1.5之后,java提供Callable接口,里面只有一个call方法作为线程执行体。实现Callable接口,重写call方法就可以创建一个线程,与run方法相比,Call方法更强大。→ call方法可以有返回值...原创 2019-07-29 17:32:37 · 251 阅读 · 1 评论 -
多线程之sleep和wait的区别
sleep:使当前线程睡眠,但是并不释放锁sleep是Thread类的方法sleep可以用在任何地方sleep必须捕获异常wait:使当前进程等待,但是释放锁。wait是Object类的方法wait,包括notify和notifall只能在synchrnized修饰的方法或代码块中使用sleep不需要捕获异常关于释放锁的理解:你在人工售票口买票,sleep方法只是让你站在买票...原创 2019-07-29 17:40:52 · 258 阅读 · 0 评论 -
多线程的锁之ReentrantLock
ReentrantLock介绍:ReentrantLock是一个互斥锁,可重入锁。也被称为独占锁,即ReentrantLock在同一时间只能被一个线程持有实现了Lock接口的类,而且也是jdk中唯一实现了Lock接口的类,其中可重入的意思是,单个线程可以重复获取锁ReentrantLock分为公平锁和非公平锁。ReentrantLock是通过一个FIFO的等待队列管理获取该锁的所有线程的。...原创 2019-07-29 18:07:24 · 446 阅读 · 1 评论 -
多线程并发之CyclicBarrier
CyclicBarrier介绍:位于java.util.concurrent并发包下,是一个工具类。CyclicBarrier是循环栅栏的意思,它能阻塞一组线程直到某个事件发生。等到释放这些线程之后,CyclicBarrier还可以重复用,所以是循环栅栏比如我们一起包了车去游玩,有些人早早到了有些人准时到,有些人迟到。但是无论怎样都要等所有人都齐了,车才能开,这个车就是CyclicBarrie...原创 2019-07-29 18:32:25 · 388 阅读 · 1 评论 -
多线程之Semaphore信号量理解
Semaphore介绍:Semaphore是一个计数信号量,本质是一个共享锁。线程可以通过acquire()来获取信号量许可。举个例子,假设初始化时给定一个信号量值,比如是5,线程调用acquire()方法时,判断这个信号量是否大于0,如果大于0就把信号量的值减1,然后继续执行。如果不大于0,那么就会阻塞。知道其他线程调用releas()方法,释放一个信号量。其实就和PV操作一样...原创 2019-07-29 18:57:11 · 311 阅读 · 1 评论 -
多线程并发之wait()和await()区别
wai()是Object类提供的,一般与synchronized联合使用。调用wait之后会释放锁,导致线程等待。唤醒进程使用notify()或者notifyAll()await()Condition类是当中的,一般与Lock联合使用。举例:synchronized(obj){ obj.wait();//消费方没东西了,等待}synchronize(obj){ obj.no...原创 2019-07-29 21:04:44 · 16426 阅读 · 2 评论