首先给各位股东报告个好消息,原本上个月发布的版本0.0.4-SNAPSHOT延误了一个月,今天终于完工了,正式开启0.0.5-SNAPSHOT。
espipe-core有三大目标:
1. 解决数据同步格式问题
2. 解决数据同步性能问题
3. 解决多环境维护不方便问题
像同步数据这种长时间的任务,使用多线程来做性能优化,可以说是首选。
多线程的中心思想就是分工,协作,互斥。
分工:采用Thread per message模式, 一个index的init或者sync作为一个线程,采用线程池管理Thread的生命周期。
协作:目前各线程之前不需要同步信息。
互斥:同一个index在同一时间内只能有一个init或者sync线程,不允许重复;否则index mapping可能会错误的设置为默认字段类型,
采用ConcurrentHashMap来管理每个线程,自带分段锁。
异常处理:ThreadPoolExecutor execute 子线程内抛出的异常无法在主线程内捕获,采用Thread.UncaughtExceptionHandler,以log的形式暂时先保存错误信息。
ThreadPoolExecutor submit 可以通过Future.get()直接在主线程内try catch异常。
优雅退出:直接在stop方法上加上@PreDestroy
其他补充:
异常处理:继承ThreadPoolExecutor,重写afterExecute方法来处理异常。
优雅退出:
// 方法1
SpringApplication application =
new SpringApplication(Application.class);
application.addListeners((ApplicationListener) event -> {
log.info("Graceful Shutdown");
});
application.run(args);
// 方法2
Thread hook = new Thread(() ->
System.out.println("Graceful shutdown"));
Runtime.getRuntime().addShutdownHook(hook);
并发编程不是java的特性,并发模型可以通过管程或者信号量来实现。
管程是一种解决并发问题的通用模型,能解决线程协作,互斥问题。
在1974年和1977年,Hore和Hansen提出了管程。
在1965年,荷兰学者Dijkstra提出的信号量(Semaphores)机制。
Java中管程的实现就是synchronized,javap反编译后你就可以看到synchronized关键字被编译成为monitorenter和monitorexit,这个monitor经常被翻译成为监视器或者管程。
所谓分工指的是如何高效地拆解任务并分配给线程,
而同步指的是线程之间如何协作,
互斥则是保证同一时刻只允许一个线程访问共享资源。
按照这三个类别来看Java并发包就简单了。
分工:
线程池Executor, Fork/Join, Future
同步,协作:
sychronized, lock & condition
CountDownLatch, CyclicBarrier, Semaphore
互斥:
无锁: Immutable, ThreadLocal. CAS, CopyOnWrite, AtomicInteger
有锁: synchronized, Lock, ReadWriteLock
同步和互斥大佬都已经在JDK里包办了,就剩个分工可以玩出点花样:
Guarded Syspension模式,Balking模式,Thread-Per-Message模式,生产者消费者模式,Work-Thread模式,两阶段终止模式。
看书写demo,只能浅尝一下,实战还得来真实相中,下载espipe,来次真实的体验。
关注公众号nooshhub,看最新的更新。