
并发编程
文章平均质量分 75
阿弥陀佛僧
知幻即离,不假方便;离幻即觉,亦无渐次。
展开
-
JUC锁——互斥锁之非公平锁
获取非公平锁 非公平锁和公平锁在获取锁的方法上,流程是一样的。它们的区别主要表现在“尝试获取锁的机制不同”。简单点说,“公平锁”在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排队等待);而“非公平锁”在每次尝试获取锁时,都是采用的非公平策略(无视等待队列,直接尝试获取锁,如果锁是空闲的,即可获取状态,则获取锁)。下面,通过代码分析一下获取非公平锁的流程:1、lock()非公平锁的l...原创 2019-10-09 23:36:30 · 126 阅读 · 0 评论 -
JUC锁——Condition条件
Condition介绍 Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object中的wait()方法,Condition中的signal()方法相当于Object中的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。不同的是,Object中的wait()、notify()、noti...原创 2019-10-09 23:38:36 · 170 阅读 · 0 评论 -
JUC锁——可重入互斥锁ReentrantLock
ReentrantLock介绍ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。顾名思义,ReentrantLock锁在同一个时间点只能被一个线程所持有;而可重入的意思是,ReentrantLock锁可以被单个线程多次获取。ReentrantLock分为“公平锁”和“非公平锁”,它们的区别体现在获取锁的机制上是否公平。“锁”是为了保护竞争资源,防止多个线程同时操作同一个资源而出...原创 2019-10-09 23:37:06 · 285 阅读 · 0 评论 -
JUC锁——LockSupport
LockSupport介绍 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到Thread.suspend 和 Thread.resume所可能引发的死锁问题。因为park() 和 unpark()有许可的存在,调用 park() 的线程和...原创 2019-10-09 23:37:39 · 196 阅读 · 0 评论 -
JUC锁——共享锁和可重入读写锁
概要 JUC中的共享锁有CountDownLatch、CyclicBarrier、Semaphore、ReentrantReadWriteLock等,本章会以ReentrantReadWriteLock为蓝本对共享锁进行说明。ReadWriteLock 和 ReentrantReadWriteLock介绍 ReadWriteLock,顾名思义,是读写锁。它维护了一对相关的锁——“读取锁”...原创 2019-10-09 23:36:48 · 498 阅读 · 0 评论 -
JUC锁——互斥锁之公平锁的获取
基本概念1、AQS——指AbstractQueuedSynchronizer类,AQS是java中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现的。AQS是独占锁(如ReentrantLock)和共享锁(如Semaphore)的公共父类2、 AQS锁的类别——分为“独占锁”和“共享锁”两种 独占锁——锁在一个时间点只能被一个线程所持有。根据锁的获取机制,它又划分为“公平锁”和“非公...原创 2019-10-09 23:35:47 · 327 阅读 · 0 评论 -
JUC锁——互斥锁之公平锁的释放
h原创 2019-10-09 23:36:01 · 190 阅读 · 0 评论 -
JUC锁——CountDownLatch
概要 和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁"。CountDownLatch简介 CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别:①CountDownLatch的作用是允许1或N个线程等待其...原创 2019-10-09 23:37:50 · 147 阅读 · 0 评论 -
JUC锁——CyclicBarrier
CyclicBarrier简介 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CountDownLatch和CyclicBarrier的对比:①CountDownLatch的作用是允许1或N个线程等待其他线程完成执行...原创 2019-10-09 23:38:01 · 188 阅读 · 0 评论 -
JUC锁——Semaphore(信号量)
Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设置的 S...原创 2019-10-09 23:38:13 · 269 阅读 · 0 评论 -
JUC锁——框架
锁的分类根据锁添加到Java中的时间,将Java中的锁分为"同步锁"和"JUC包中的锁"同步锁即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁,Java 1.0版本中就已经支持同步锁了。**同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。**这样原创 2019-10-09 23:34:56 · 196 阅读 · 0 评论 -
JUC原子类——类成员修改类型的原子类
概要AtomicIntegerFieldUpdater,AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员属性的原子类的原理和用法相似,以原子方式将此更新器所管理的给定对象的字段值进行更新。AtomicLongFieldUpdater介绍和方法列表AtomicLongFieldUpdater可以对指定类的"volatile ...原创 2019-10-09 23:34:25 · 126 阅读 · 0 评论 -
开启线程时start()方法和run方法的调用
1、Thread类中start()的定义:public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); starte...原创 2019-10-09 23:33:02 · 406 阅读 · 0 评论 -
线程让步——Thread.yield()
1、yield()的作用是让步,它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权。但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权,也有可能是当前线程又进入到“运行状态”继续运行,因为线程让步之后和其他线程一样都处于就绪状态,获取执行权的几率是相同的。示例:public class YieldThre...原创 2019-10-09 23:31:39 · 306 阅读 · 0 评论 -
线程休眠——Thread.sleep()
1、sleep介绍sleep() 定义在Thread.java中,sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该指定休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行2、示例:public class YieldThread extends...原创 2019-10-09 23:32:00 · 1516 阅读 · 0 评论 -
线程加入——join()
1、join()介绍join() 定义在Thread.java中,join() 的作用是让“父线程”等待“子线程”结束之后再继续运行,示例:public class FatherThread extends Thread { public FatherThread(String name) { super(name); } @Override public void ru...原创 2019-10-09 23:32:09 · 173 阅读 · 0 评论 -
wait()、notify()和notifyAll()
在Object.java中,定义了wait()、notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程——notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。Object类中关于等待/唤醒的API详细信息如下...原创 2019-10-09 23:31:15 · 214 阅读 · 0 评论 -
JUC原子类——基本类型
一、原子类根据修改的数据类型,可以将JUC包中的原子操作类分为四类:这些类存在的目的是对相应的数据进行原子操作1、基本类型:AtomicInteger、AtomicLong、AtomicBoolean2、数组类型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray3、引用类型:AtomicReference、AtomicSt...原创 2019-10-09 23:33:43 · 197 阅读 · 0 评论 -
JUC原子类——数组类型
数组类型原创 2019-10-09 23:34:00 · 170 阅读 · 0 评论 -
线程中断——interrupt()
1、interrupt()说明:根据api的说明,在线程处于中断状态时调用大部分的阻塞方法可能会抛异常Interrupts this thread.Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is inv...原创 2019-10-09 23:32:21 · 248 阅读 · 0 评论 -
线程优先级和守护线程
1、线程优先级java中的线程优先级的范围是1~10,默认的优先级是5。高优先级线程会优先于低优先级线程执行(数字越大优先级越高)。在一个线程内新建一个线程对象,则新建线程的优先级默认和父线程一样。示例:public class PriorityThread extends Thread { public PriorityThread(String name) { super(n...原创 2019-10-09 23:32:38 · 212 阅读 · 0 评论 -
JUC原子类——引用类型
AtomicReference介绍和方法列表AtomicReference是作用是对"对象"进行原子操作,方法列表:// 使用 null 初始值创建新的 AtomicReferenceAtomicReference()// 使用给定的初始值创建新的 AtomicReferenceAtomicReference(V initialValue)// 如果当前值 == 预期值,则以原子方式...原创 2019-10-09 23:34:12 · 158 阅读 · 0 评论 -
线程安全的类
可将类的所有方法进行同步(使用synchronized)构建线程安全的类:public class SynchronizedInteger { private Integer value; public synchronized Integer getValue() { return this.value; } public synchronized void setVal...原创 2019-10-09 23:30:36 · 166 阅读 · 0 评论