juc
文章平均质量分 90
学习才能变得强大
这个作者很懒,什么都没留下…
展开
-
Java(八)FutureTask源码
任务发起线程可以调用get()方法来获取任务执行结果,如果此时任务已经执行完毕则会直接返回任务结果,如果任务还没执行完毕,则调用方会阻塞直到任务执行结束返回结果为止。发起任务线程跟执行任务线程通常情况下都不会是同一个线程,在任务执行线程执行任务的时候,任务发起线程可以查看任务执行状态、获取任务执行结果、取消任务等等操作,接下来分析下这些操作。 1 .判断任务当前执行状态,如果任务状态不为NEW,则说明任务或者已经执行完成,或者执行异常,不能被取消,直接返回false表示执行失败。原创 2023-10-15 20:24:19 · 221 阅读 · 0 评论 -
Java-JUC(七)
3、ArrayBlockingQueue,一个有界缓存等待队列,可以指定缓存队列的大小,当正在执行的线程数等于corePoolSize时,多余的元素缓存在ArrayBlockingQueue队列中等待有空闲的线程时继续执行,当ArrayBlockingQueue已满时,加入ArrayBlockingQueue失败,会开启新的线程去执行,当线程数已经达到最大的maximumPoolSizes时,再有新的元素尝试加入ArrayBlockingQueue时会报错。但是当请求没有的时候,允许核心线程也终止。原创 2023-08-06 21:07:49 · 196 阅读 · 0 评论 -
Java - Synchronized(六)
在Java中,“synchronized” 是一个关键字,用于实现多线程的同步机制,其含义是“同步”的意思。在多线程编程中,当多个线程同时访问共享资源时,可能会导致竞态条件(Race Condition)和数据不一致的问题。为了避免这些问题,可以使用 synchronized 关键字来标记一个代码块或方法,使得同一时间只有一个线程可以进入该代码块或方法,从而保证了对共享资源的互斥访问。原创 2023-07-30 15:48:17 · 252 阅读 · 0 评论 -
JAVA-ReentrantLock(五)
非公平锁的特点是,当有多个线程同时请求锁时,不会按照线程的请求顺序来获取锁,而是直接尝试获取锁,如果能获取成功,则立即获得锁,即使其他线程在等待。说明: 跟踪lock方法的源码可知,当资源空闲时,它总是会先判断sync队列(AbstractQueuedSynchronizer中的数据结构)是否有等待时间更长的线程,如果存在,则将该线程加入到等待队列的尾部,实现了公平获取原则。当有多个线程等待锁时,锁会选择最早等待的线程来获取锁。如果锁的计数归零,说明锁可以完全释放,此时清空锁的持有者,并返回。原创 2023-07-23 12:48:11 · 841 阅读 · 0 评论 -
Java-LockSupport(四)
LockSupport提供了更灵活、直接的线程阻塞和唤醒机制,不需要依赖于特定的对象实例。它可以直接操作线程本身,无需和特定对象关联,更容易控制和管理线程的阻塞和唤醒操作。无需锁对象:LockSupport不需要和特定的锁对象关联,避免了在等待和唤醒过程中对锁的获取和释放,减少了可能的死锁和竞争条件。先唤醒后阻塞:LockSupport的park()方法可以先于unpark()方法调用,这意味着可以提前唤醒线程,而不会导致线程永久阻塞。原创 2023-07-09 13:20:15 · 189 阅读 · 0 评论 -
Java-CAS(三)
CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。原创 2023-06-04 20:11:37 · 636 阅读 · 0 评论 -
Java - AQS-CountDownLatch实现类(二)
CountDownLatch是Java中的一个同步辅助类,用于实现线程间的等待和通知机制。它通过一个计数器来实现,该计数器被初始化为一个正整数,并且只能递减。线程在等待阶段通过调用await()方法等待计数器变为0,而其他线程在完成自己的任务后通过调用countDown()方法来减少计数器的值。当计数器的值变为0时,所有等待的线程都将被唤醒继续执行。原创 2023-05-28 19:06:05 · 1005 阅读 · 0 评论 -
Java - AQS(一)
在Java中,AQS代表AbstractQueuedSynchronizer(抽象队列同步器)。AQS是Java并发包中用于构建同步器的基础框架。它提供了一种实现同步状态管理、线程等待和通知的机制。AQS主要通过一个int类型的状态值来表示同步状态,并提供了一些方法来操作和管理这个状态。它使用一个FIFO(先进先出)的等待队列来管理等待线程,并通过内部的一些算法和机制来确保线程的安全等待和唤醒。AQS的核心思想是通过继承和重写来实现具体的同步器。它提供了几个关键的方法供子类实现,包括(获取当前状态值)、(设原创 2023-05-21 18:31:04 · 534 阅读 · 0 评论 -
JUC-线程Callable使用与FutureTask源码阅读
带返回值的线程(实现implements Callable),使用示例为了定义这样一个事物“有返回结果”,暂且称之为RunnableFuture。它集合了Runnable和Future两种事物(其中Future接口 表示了一个任务的生命周期,是一个可取消的异步运算,可以把它看作是一个异步操作的结果的占位符,它将在未来的某个时刻完成,并提供对其结果的访问。在并发包中许多异步任务类都继承自Future)其中Future接口主要使用get()方法获取线程任务返回值。原创 2023-05-12 17:56:59 · 606 阅读 · 0 评论