应用开始启动正常,然后应用卡死。
ps -ef | grep java
进程还在,应用的 dubbo 端口还是活着的。
流程
查看应用 PID
ps -ef | grep java
应用开始启动正常,然后应用卡死。
ps -ef | grep java
进程还在,应用的 dubbo 端口还是活着的。
ps -ef | grep java
现在聊的 topic 是分布式系统,面试官跟你聊完了 dubbo 相关的一些问题之后,已经确认你对分布式服务框架/RPC 框架基本都有一些认知了。
那么他可能开始要跟你聊分布式相关的其它问题了。
分布式锁这个东西,很常用的,你做 Java 系统开发,分布式系统,可能会有一些场景会用到。最常用的分布式锁就是基于 zookeeper 来实现的。
其实说实话,问这个问题,一般就是看看你是否了解 zookeeper,因为 zookeeper 是分布式系统中很常见的一个基础系统。
而且问的话常问的就是说 zookeeper 的使用场景是什么?
向量时钟(Vector Clock)是一种在分布式环境中为各种操作或事件产生偏序值的技术,它可以检测操作或事件的并行冲突,用来保持系统的一致性。
向量时钟方法在分布式系统中用于保证操作的有序性和数据的一致性。
向量时钟通常可以被认为是一组来自不同节点的时钟值Vi[1]、Vi[2]、…、Vi[n]。
在分布式环境中,第i个节点维护某一数据的时钟时,根据这些值可以知道其他节点或副本的状态,例如Vi[0]是第i个节点所了解的第0个节点上的时钟值,而Vi[n]是第i个节点所了解的第n个节点上的时钟值。
时钟值代表了节点上数据的版本信息,该值可以是来自节点本地时间的时间戳或者是根据某一规则生成有序数字。
Lock 接口和 Condition 接口作为锁最核心的两个接口,这里做一下简单介绍,为后续的源码阅读提供基础。
>java -version
java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
点赞再看,已成习惯。
介绍 ReentrantLock 的文章很多,今天我们来一起看一下 ReentrantLock 的源码,理解一下实现原理。
点赞再看,已成习惯。
本文出自论文《Can Seqlocks Get Along With Programming Language Memory Models?》,由老马啸西风翻译整理。
这篇论文李大狗在 StampedLock 的算法笔记中提及,好奇心驱使着我将论文找出来,拜读一下。
在某些情况下,Seqlock是一种重要的同步机制,它表示对常规读写器锁的重大改进。
它们避免了在读取器关键部分期间更新同步变量的需要,从而通过避免在锁对象本身上丢失缓存一致性而提高了性能。
点赞再看,已成习惯。
提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)。
/*
* @since 1.5
* @author Doug Lea
*/
public abstract class AbstractQueuedSynchronizer
extends AbstractOwnableSynchronizer
implements java.io.Serializable {
private static final long serialVersionUID = 7373984972572414691L;
/**
* Creates a new {@code AbstractQueuedSynchronizer} instance
* with initial synchronization state of zero.
*/
protected AbstractQueuedSynchronizer() { }
}
点赞再看,已成习惯。
我们在前面的文章中详细介绍了 jdk 自带的可重入锁使用及其源码。
本节就让我们一起来实现一个可重入锁。
点赞再看,已成习惯。
我们在前面的文章中详细介绍了 jdk 自带的可重入读写锁使用及其源码。
本节就让我们一起来实现一个读写锁。
我们先实现一个最基础版本的读写锁,便于大家理接最核心的部分。
后续将在这个基础上持续优化。
为了后续拓展,我们统一定义基础的接口,一共 4 个方法:
package com.github.houbb.lock.api.core;
/**
* 读写锁定义接口
* @author binbin.hou
* @since 0.0.2
*/
public interface IReadWriteLock {
/**
* 获取读锁
* @since 0.0.2
*/
void lockRead();
/**
* 释放读锁
*/
void unlockRead();
/**
* 获取写锁
* @since 0.0.2
*/
void lockWrite();
/**
* 释放写锁
*/
void unlockWrite();
}