
Java并发编程
文章平均质量分 69
学习Java并发编程相关的知识点
大后生大大大
加油!加油!加油!
展开
-
CAS - AtomicIntegerFieldUpdater和AtomicReferenceFieldUpdater
前面一篇我们学习,为了巩固CAS我们在进而学习下AtomicIntegerFieldUpdater和AtomicReferenceFieldUpdater。原创 2023-08-09 00:01:29 · 293 阅读 · 0 评论 -
CAS - CAS的缺点
我们看到,其中有一个do while方法,如果CAS失败,就会一直重试。那么如果CAS长时间一直不成功,可能给CPU带来很大的开销。原创 2023-08-07 22:29:14 · 286 阅读 · 0 评论 -
CAS - 自定义自旋锁
try {System.out.println(Thread.currentThread().getName() + " 做自己的任务");//保证A线程比B线程先获得锁try {System.out.println(Thread.currentThread().getName() + " 做自己的任务");A线程和B线程抢占我们自定义的自旋锁,为了让A线程先获得锁的控制权,我们在A线程start后暂停了100毫秒。A 获得了🔒资源A 做自己的任务B 正在尝试获取🔒。原创 2023-08-07 22:11:32 · 337 阅读 · 0 评论 -
CAS - 从AtomicInteger窥探CAS
Unsafe类是CAS的核心,由于Java方法无法直接访问底层,需要通过本地方法(native)来实现,Unsafe类相当于一个桥梁。基于Unsafe类,可以直接操作特定的内存数据。我们从上一篇说的时候,有说到一个“资源”被100个线程每个线程累加100次,最终得到10000,该“资源”我们使用AtomicInteger来模拟的。这篇我们就从AtomicInteger更加深入探究CAS。原创 2023-08-04 23:37:49 · 306 阅读 · 0 评论 -
CAS - 原理简介
CAS是JDK提供的非阻塞原子操作,它通过硬件保证了比较-更新的原子性。它是非阻塞的且自身具有原子性,也就是说CAS效率高、可靠。CAS是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题,Unsafe类提供的CAS方法(如:compareAndSwapXXX)底层实现就是CPU的cmpxchg指令。执行cmpxchg指令指令的时候,会判断当前系统是否为多核系统,如果是就给总线加锁,只有一个线程会对总线加锁成功,加锁成功之后会执行cas操作,原创 2023-08-02 23:14:00 · 262 阅读 · 0 评论 -
volatile和JMM
内存屏障(也称内存栅栏、屏障指令等,是一类同步屏障指令,是CPU或者编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作),避免代码重排序。重排序是指编译器和处理器为了优化程序新能而对指令序列进行重新排序的一种手段,有时候会改变程序语句执行的先后顺序,但是重排序后的指令绝对不能改变原有的串行语义。所以volatile的写内存语义是直接刷新回主内存,读的内存语义是直接从主内存中读取最新的值。都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)原创 2023-08-01 23:19:09 · 185 阅读 · 0 评论 -
Java内存模型(JMM)
JVM规范中定义了java内存模型(java Memory Model,简称JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,进而达到java程序在各平台下都能达到一致的内存访问效果。Java内存模型(Java Memory Model,JMM)本身是一种抽象的概念并不真实存在它描述的是一组约定或者规范,定义了Java程序在多线程环境下,对共享变量的读写操作的具体行为和规则。它确保了线程之间的可见性、有序性以及原子性。原创 2023-08-01 00:14:24 · 765 阅读 · 0 评论 -
线程等待唤醒机制
现在案例是我们先让t1获得objectLock,t1紧接着调用objectLock的wait()方法交出锁的控制权,等t2运行拿到objectLock的锁对象,在调用objectLock的notify()方法唤醒t1,也就是说t1和t2的等待和唤醒是有先后顺序的。那如果我们先调用t2的唤醒,在调用t1的等待,会有什么结果?结果就是t1永远不会被唤醒。原创 2023-07-30 23:16:59 · 150 阅读 · 0 评论 -
线程中断机制
如果线程处于正常活动状态,那么会将该线程的中断标志位设置为true,仅此而已。被设置中断标识的线程将继续正常运行,不受影响。所以interrupt()方法并不能真正的中断线程,需要被调用方的线程自己配合好才行。如果线程处于被阻塞状态(例如:sleep、wait、join等),在别的线程中调用interrupt方法,那么该线程将立即退出阻塞状态,并抛出一个InterruptedException异常,且会清除线程的中断状态。如果线程已经中断、不活动将不会有任何影响。原创 2023-07-30 22:17:16 · 306 阅读 · 0 评论 -
Java那些“锁”事 - 死锁及排查
死锁是两个或者两个以上的线程在执行过程中,因争夺资源而造成的一种互斥等待现象,若没有外界干涉那么它们将无法推进下去。如果系统资源不足,进程的资源请求都得到满足,死锁出现的可能性就很低,否则就会因为争夺有限的资源而陷入死锁。原创 2023-07-29 00:04:56 · 1765 阅读 · 0 评论 -
Java那些“锁”事 - 可重入锁(递归锁)
可重入锁是一种线程同步的机制,它允许线程多次获取同一个锁,而不会产生死锁。可重入锁的特点是在持有锁的情况下可以再次进入同步代码块或方法,而不会被阻塞。ReentrantLock和synchronized都是可重入锁。ReentrantLock属于显式可重入锁,synchronized属于隐式可重入锁。原创 2023-07-28 23:22:04 · 600 阅读 · 0 评论 -
Java那些“锁”事 - 公平锁和非公平锁
在Java中,锁可以分为公平锁(Fair Lock)和非公平锁(Nonfair Lock),它们的区别在于线程获取锁的顺序是否遵循公平性原则。原创 2023-07-26 23:35:42 · 1259 阅读 · 0 评论 -
Java那些“锁”事 - “八锁”案例
阿里巴巴规范手册中有提到:高并发时,同步调用应该去考量锁的性能消耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。原创 2023-07-26 00:15:30 · 219 阅读 · 0 评论 -
CompletableFuture
前面一个篇我们降到,从调用事例中说到了FutureTask的缺点,get()方法在计算完成之前一直处于阻塞状态,isDone()方法容易耗费CPU资源。对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动回调该函数,这样我们就不用等待结果。CompletableFuture提供了一种观察模式类似的机制,可以让任务执行完成后通知监听的一方。原创 2023-07-25 00:19:21 · 152 阅读 · 0 评论 -
FutureTask
Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务执行的结果、取消任务的执行、判断任务是否取消、判断任务执行是否完成等。它提供了一种并行异步计算的功能。比如主线程让子线程去执行任务,子线程比较耗时,启动子线程开始执行任务后,主线程就去做别的事情了,过一会才去获取子任务的执行结果。原创 2023-07-22 23:40:51 · 280 阅读 · 0 评论