JUC
文章平均质量分 62
Mudrock__
这个作者很懒,什么都没留下…
展开
-
JUC_自旋锁与互斥锁与可重入锁简述
若为非可重入锁,第二次获取该锁时,该锁由于线程任务未执行完成(尝试第二次获取该锁)而无法释放,导致无法第二次获取该锁,遂发生死锁。可重入锁表示线程获取锁后,在无需释放该锁的情况下可重复获取该锁,不会发生死锁。线程无法获取锁时不会被阻塞,而是一直处于忙等状态,不释放CPU资源。线程无法获取锁时将被阻塞,并释放CPU资源,CPU可运行其他线程。原创 2022-10-12 20:00:55 · 145 阅读 · 0 评论 -
JUC_CAS
在A对变量进行CAS之前,B将变量的值修改为了11,但又迅速地修改回了10,此时A对变量进行CAS将成功更新变量的值;换言之,带版本号的原子引用,实际上是。线程竞争有时会导致CAS失败,此时CAS失败的线程会进入自旋,直至CAS成功;从静态代码块中不难看出,valueOffset字段储存的内存地址偏移量,即为value字段的内存地址偏移量,显然可知在CAS操作中,Java无法直接访问底层操作系统,若想访问则需通过本地方法,Unsafe类中提供了许多本地方法,其中包含了CAS操作的本地方法。原创 2022-10-12 18:15:18 · 194 阅读 · 0 评论 -
JUC_单例模式
可以看到,LazyMan类仅被创建了一个实例(构造方法仅执行了一次)在类被加载进内存后就直接创建对象实例 可能会造成内存浪费。只有需要对象实例的时候才创建对象实例 不会造成内存浪费。可以看到,无法通过反射破坏枚举类型的单例。原创 2022-10-11 21:58:34 · 83 阅读 · 0 评论 -
JUC_Volatile详解(语义与可见性与禁止指令重排)
E 独占 Exclusive : 缓存行仅在当前核心中存在,或缓存行在多个核心中存在,但在该核心中被修改时,该缓存行被标记为E,其他核心中对应的缓存行被标记为I,并将该缓存行同步至主内存;其他核心读取主内存中的该变量时,该缓存行与做读取的核心中对应的缓存行一同被标记为S。5.总线接收到其他核心的副本变量已被置为失效状态的消息,会将此消息告知子线程,子线程会将共享变量上锁(lock),将对副本变量的修改同步至共享变量(store 与 write),同步完成后将解锁(unlock)共享变量,子线程执行完毕。原创 2022-10-10 22:42:00 · 312 阅读 · 0 评论 -
JUC_Volatile简述
Volatile关键字是JVM提供的轻量级同步机制,其特性为:1.保证可见性2.不保证原子性3.禁止指令重排。原创 2022-10-01 06:14:53 · 494 阅读 · 0 评论 -
JUC_Future异步回调
其中ForkJoinTask类及其子类RecursiveTask类,RecursiveAction类,CountedCompleter类属于Fork/Join框架,SwingWorker类属于Swing应用开发,故在此不做阐述,本文主要讲解FutureTask类与CompletableFuture类。原创 2022-09-29 03:01:34 · 284 阅读 · 0 评论 -
JUC_ForkJoin
Java1.7中提供的并行执行任务框架,具体模式为:将主任务逐级拆分为多级子任务并行执行,最终汇总所有子任务的执行结果作为主任务的执行结果。原创 2022-09-27 03:18:56 · 225 阅读 · 0 评论 -
JUC_CPU密集型与I/O密集型
CPU密集型也叫计算密集型,CPU的计算任务繁重;I/O操作在短时间内就可完成,而CPU的计算任务却不能,CPU占用率极高I/O 密集型。原创 2022-09-25 21:48:44 · 193 阅读 · 0 评论 -
JUC_线程池
线程过多会带来调度开销,进而影响缓存局部性和整体性能;而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,避免了在处理短时间任务时创建与销毁线程的代价;线程池不仅能够保证内核的充分利用,还能防止过分调度。原创 2022-09-25 02:31:02 · 305 阅读 · 0 评论 -
JUC_SynchronousQueue
SynchronousQueue实现了BlockingQueue接口,但与众不同的是,SynchronousQueue的容量恒为零,也就是说 put 操作无法直接返回,需要等待一个 take 操作才能返回,反之也成立。原创 2022-09-24 23:44:11 · 82 阅读 · 0 评论 -
JUC_BlockingQueue与BlockingDeque
BlockingDeque 接口继承了 BlockingQueue 接口,所以其实现类需要实现 BlockingQueue 接口的方法,换言之,BlockingDeque 接口的实现类的实例可调用上文中陈述的 BlockingQueue 接口的方法。原创 2022-09-24 20:32:08 · 388 阅读 · 0 评论 -
JUC_ReadWriteLock
也就是说,一个线程读取数据时,其他线程也可读取,但不能写入(避免读脏数据);一个线程写入时,其他线程不可读取(避免读脏数据),也不可写入(避免数据错误)可以看到,一个线程写入时,其他线程无法写入与读取,符合写锁要求;但一个线程读取时,其他线程也无法写入与读取,不符合读锁要求。可以看到,一个线程写入时,其他线程无法写入与读取;一个线程读取时,其他线程也可读取,但无法写入。读写操作分为三个情况:读-读,写-写,读-写,其中仅有读-读被读写锁允许。原创 2022-09-24 01:25:35 · 133 阅读 · 0 评论 -
JUC_辅助类_CountDownLatch_CyclicBarrier_Semaphore
对线程发布许可证,获得许可证的线程才可被执行,通常用于限流。通常用于确保一些任务必须先于另一些任务被完成。CountDownLatch 倒计时类。通常用于在所有线程都准备好后 一同执行。CyclicBarrier 栅栏类。Semaphore 信号量类。原创 2022-09-23 23:35:28 · 106 阅读 · 0 评论 -
JUC_CopyOnWrite
CopyOnWtire意为写入时复制1.准备写入前,将旧数据复制一份作为副本,在副本上进行写入2.写入完成后,用副本的引用替换旧数据的引用所以在整个写入过程中,读取到的数据都是不变的,只有在写入完成后,新的读取操作所读取到的数据才会发生改变,从而保证了数据的最终一致性(注意,不是实时一致性)以CopyOnWriteArrayList为例//volatile保证了数据的可见性//数据被任一线程修改 其余线程均可见(直接从内存中读取数据 而不是缓存中)//锁//上锁try {原创 2022-09-23 20:44:03 · 126 阅读 · 0 评论 -
JUC_Condition实现精准唤醒
Condition接口出现于Java1.5版本,用于取代Object类中的wait()方法与notify()方法,Condition接口相较于后者更为安全与高效Conditon接口的await()方法 对应 Object类的wait()方法Condition接口的signal()方法 对应 Object的类notify()方法Condition接口中的signalAll()方法 对应 Object的类notifyAll()方法。原创 2022-09-23 19:43:06 · 198 阅读 · 0 评论