最近工作其实挺忙的,不过自己摸了几天鱼,主要还是没有较好的解决思路,自己也设计了一版,基本功能和较复杂能在构想和一步步的落地中实现,可忽略了可能存在网络延迟的问题,在几番商量和琢磨折腾后最后不得不妥协,当然更多的也是一种偷懒了吧,一开始不是自己设计的改起来或者嵌入起来,确实挺费脑子的,索性就笨重做法就笨重着做了。也不愿有自己的想法了,完成是首要目标。
由于前期有看过一段时间关于Java高并发JUC块的源码,有些解读得耗上不少脑细胞,但又惊叹于如此精巧之设计、堪称编程界的艺术,我把编程当作艺术来看,好看的展现和结构是让人愿意继续读下去的欲望,否则我选择敬而远之。
构思过要开一专栏,一步步去解读JUC源码,刚好先写点简单的,头一篇太损脑了,现在都还没跳脱出来。此刻应该来六个核桃。
JUC最最简单也是最顶层的设计是如下两个类,面试经常大家被问得晕头转向,就是我们似熟又陌生,被虐千千万的AOS、Lock,还有在后续会写的AQS、自旋锁、公平锁、非公平锁、读写锁、可重入锁、排它锁等。
今后所解读订单版本是来自于JDK1.8下的源码解读,JDK14等更高版本有较大实现转变,但万变不离其宗,我们得抓住事物的本质,剩下的就是享受了。
AOS是最简单的一个抽象类了,除了实现序列化接口,只拥有一个属性,而这个属性被后面用在多线程竞争资源情况下,申明当前资源持有的线程,主要用在排它锁的辅助设计上。
package java.util.concurrent.locks;
public abstract class AbstractOwnableSynchronizer implements java.io.Serializable {
private static final long serialVersionUID = 3737899427754241961L;
protected AbstractOwnableSynchronizer() { }
private transient Thread exclusiveOwnerThread;//排它锁下持有资源的线程
protected final void setExclusiveOwnerThread(Thread thread) {
exclusiveOwnerThread = thread;
}
protected final Thread getExclusiveOwnerThread() {
return exclusiveOwnerThread;
}
}
Lock是JUC的基石,它定义了不同于在JVM级别的同步语义关键字synchronized,synchronized关键字所修饰的块内容在字节码层面分别对应monitorenter、monitorexit两组语义。在较低版本中经常被冠以重型锁的名号,但由于其并发安全性,在高版本JDK中,官方不断的对此进行改进,以期其轻量化。
package java.util.concurrent.locks;
import java.util.concurrent.TimeUnit;
public interface Lock {
void lock();//申请锁资源
void lockInterruptibly() throws InterruptedException;//可中断式申请锁资源
boolean tryLock();//尝试性申请锁资源
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;//在给定时间内尝试申请锁资源,可中断式
void unlock();//持有线程释放锁资源
Condition newCondition();//用于条件等待唤醒,其类似于Java基类中的wait、notify、notifyAll等的扩展实现
}