Java – 可重入锁ReentrantLock实现原理

注:不同版本的JDK,此部分源码存在差异,当下17版本与本文1.8版本差异较大 在实现层面除了依赖于CAS(compareAndSet)方法之外,同时依赖于类LockSupport中的一些方法。 一、LockSupport 类 LockSupport 位于包 java.util.concurrent.locks ,其基本方法有 public static void park()public static void parkNanos(long nanos)public static void parkUntil(long deadline)public static void unpark(Thread thread) 其中park方法会使得当前线程放弃CPU,进入等待(WAITING)状态,操作系统不会再对其进行调度。直到其他线程对它调用了unpark方法,其中unpark方法使得参数指定的线程恢复可运行状态: public class LockSupportTest {   public static void main(String[] args) throws InterruptedException {       Thread t = new Thread (){           public void run(){ […]

从单机架构到异地多活

转自 在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。 异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的? 这些疑问,想必是每个程序看到异地多活这个名词时,都想要搞明白的问题。 有幸,我曾经深度参与过一个中等互联网公司,建设异地多活系统的设计与实施过程。所以今天,我就来和你聊一聊异地多活背后的的实现原理。 认真读完这篇文章,我相信你会对异地多活架构,有更加深刻的理解。 这篇文章干货很多,希望你可以耐心读完。 01 系统可用性 要想理解异地多活,我们需要从架构设计的原则说起。 现如今,我们开发一个软件系统,对其要求越来越高,如果你了解一些「架构设计」的要求,就知道一个好的软件架构应该遵循以下 3 个原则: 高性能 高可用 易扩展 其中,高性能意味着系统拥有更大流量的处理能力,更低的响应延迟。例如 1 秒可处理 10W 并发请求,接口响应时间 5 ms 等等。 易扩展表示系统在迭代新功能时,能以最小的代价去扩展,系统遇到流量压力时,可以在不改动代码的前提下,去扩容系统。 而「高可用」这个概念,看起来很抽象,怎么理解它呢?通常用 2 个指标来衡量: 平均故障间隔 MTBF(Mean Time Between Failure):表示两次故障的间隔时间,也就是系统「正常运行」的平均时间,这个时间越长,说明系统稳定性越高 故障恢复时间 MTTR(Mean Time To Repair):表示系统发生故障后「恢复的时间」,这个值越小,故障对用户的影响越小 可用性与这两者的关系: 可用性(Availability)= MTBF / (MTBF + MTTR) * 100% 这个公式得出的结果是一个「比例」,通常我们会用「N 个 9」来描述一个系统的可用性。 从这张图你可以看到,要想达到 4 个 9 以上的可用性,平均每天故障时间必须控制在 […]

lWoHvYe 无悔,专一