- 博客(10)
- 收藏
- 关注
原创 JUC--010--locks6
前面已经说过了 ReentrantLock 的四种获取锁的方式,也说过了公平和非公平的区别。现在来看一下条件 Condition。 Condition 让锁的使用更加的灵活。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Condition 是一个接口, 有两个已知实现类:AbstractQueuedLongSynchronizer::ConditionObjectAbstractQu.
2021-03-04 16:34:46
177
1
原创 JUC--009--locks5
前面已经说了 ReentrantLock 使用 lock.lock() 方式获取锁,而且测试过这中获取锁的方式如果获取不到锁就会阻塞,而且无法通过线程中断的方式解除阻塞。如果使用线程中断试图解除阻塞,虽然不会成功,但是会把线程的状态改成已中断,这个可能会影响后续代码。同时也说了公平锁和非公平锁的区别。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~获取锁的四种方式: lock.lo.
2021-03-04 16:33:45
175
1
原创 JUC--008--locks4
上一篇:获取到锁的线程,在执行自己的代码, 没有获取锁的线程在使用 lock.lock() 获取锁的时候阻塞了。此时按照正常流程,获取锁的线程释放锁,看看会发生什么。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~lock.unlock(); public void unlock() { sync.release(1); } //AQ.
2021-03-04 16:32:31
173
1
原创 JUC--007--locks3
通过 CountDownLatch 来研究 AQS:前面已经说过 CountDownLatch 唤醒的两种方式:还有第三种:1: 正常唤醒, countDownLatch.countDown(); 让 倒计时的值达到02: interrupte, 通过线程打断的方式唤醒阻塞的线程。3: countDownLatch.await(timeout)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
2021-03-04 16:31:32
151
1
原创 JUC--006--locks2
接着上篇调用 countDownLatch.await(); 的线程,创建了 Node, 并添加到 双向链表中。而且将自己的前置节点的状态设置成 SINGAL 状态,接着自己就阻塞在 unsafe.park 上。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~countDownLatch.countDown(); 的执行: //CountDownLatch::countDown.
2021-03-04 16:30:31
2778
1
原创 JUC--005--locks1
JDK 1.8.0_152 java.util.concurrent.locks 包下有:AbstractOwnableSynchronizerAbstractQueuedLongSynchronizerAbstractQueuedSynchronizerConditionLockLockSupportReadWriteLockReentrantLockReentrantReadWriteLockStampedLock~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
2021-03-04 16:29:35
7517
1
原创 JUC--004--Atomic-4
DoubleAdder++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++前面说过了 LongAdder, 现在来看看 DoubleAdder。 因为也有浮点型累加的场景。看他定义:public class DoubleAdder extends Striped64 implements Serializable {...}立刻产生疑问了:Striped64 中没有 double 类型.
2021-03-04 16:27:21
6177
1
原创 JUC--003--Atomic-3
Striped64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++如果在多线程中原子的修改一个变量。 原子类使用的是自旋锁机制来保证修改成功的。比如在一个性能比较一般的机器上,开启20条线程使用原子类累加一个数据。机器性能一般所以cpu修改一个数据有点慢,结果就是 一个线程在修改数据,修改期间,其他19个线程在空转。原本机器性能就不好,现在更是雪上加霜。 都还不如使用同步代码块的方式累.
2021-03-04 16:25:42
245
1
原创 JUC--002--Atomic-2
AtomicReference++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++有一个对象变量,这个变量在多线程中频繁的被赋值。这个变量一会持有 A 的引用,一会又被改成持有 B 的引用。其实赋值操作原本就是原子的,一个变量的赋值总是最后一次赋值作为它的现值。那么这个类存在的意义又在哪里呢?个人感觉意义是 比较并赋值。 比如期望是 A 然后把它改成 B, 如果当前不是 A ,那么把他.
2021-03-04 16:24:09
211
1
原创 JUC--001--Atomic-1
AtomicBoolean++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++public class AtomicBoolean implements java.io.Serializable { private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOf.
2021-03-04 16:19:12
966
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人