Condition

Condition接口定义的几个方法如下:

image-20181029220107248

其中,await方法类似于Object的wait方法,而signal和signalAll则分别对应于notify和notifyAll方法。

Condition其实现类在AQS中以内部类ConditionObject的形式存在。condition由锁的方法Lock.newCondition()来获取,且一个Lock可获取多个Condition,而不像Object只能设置一个条件。

下面说一下ConditionObject的await和signal方法。

Read More

CAS

CAS,Compare and set。是Java中实现原子操作的重要手段,在Java并发工具中起着重要作用。

201703090001

CAS是什么

CAS是一种多线程同步中常用的原子操作。在CAS中,有三个重要的参数:内存值V、旧的预期值A、要更新成为的值B,当且仅当内存值V等于旧的预期值A时,才把内存值V更改成B。基于CAS操作,可以实现乐观锁机制,乐观锁的思想是认为数据一般情况下不会发生冲突,所以在数据提交更新的时候,才会对冲突进行检测。乐观锁是种思想,而CAS是这种思想的一种实现方式。注意,CAS是一种操作,CAS一般配合自旋来实现乐观锁机制。

让我们以AtomicInteger为例来看看CAS的应用。

1
2
3
4
5
6
7
private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe();

private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");

public final int addAndGet(int delta) {
return U.getAndAddInt(this, VALUE, delta) + delta;
}

Read More

AQS

AbstractQueuedSynchronizer是一个抽象类,为Java中各种Synchronizers(同步器)的实现提供了一个模版框架。

Synchronizers是什么?

Synchronizers是实现多线程通信、同步的工具和手段。如锁、Semaphore、阻塞队列、CyclicBarrier、CountDownLatch等。同步器通常包含如下几个部分来实现多线程同步

  • 状态(state)
  • 访问控制(access control)
Read More