From e9c62cae7a22f2995faa904fe9b86c129a058ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=82=85=E5=93=A5?= <184172133@qq.com> Date: Tue, 6 Jul 2021 15:47:57 +0800 Subject: [PATCH] Update README.md --- .../README.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/notes/\350\257\273\350\200\205\346\217\220\351\227\256/README.md" "b/notes/\350\257\273\350\200\205\346\217\220\351\227\256/README.md" index 7c927a4..0632063 100644 --- "a/notes/\350\257\273\350\200\205\346\217\220\351\227\256/README.md" +++ "b/notes/\350\257\273\350\200\205\346\217\220\351\227\256/README.md" @@ -63,3 +63,45 @@ 3. 关于全链路监控的学习,可以参考以下内容: 3.1 pinpoint:https://github.com/pinpoint-apm/pinpoint 3.2 bee-apm:https://github.com/itstack-org/bee-apm + +--- + +傅哥 您好 想问一下MESA管程模型设计成两个队列的用意是什么 如果只有一个入口队列不行吗?这个模型套在AQS上好像也一样。AQS也是两个队列 同步队列还是可以理解的 但是AQS多设计一个等待队列的意义是什么也不太懂 + +AQS: + + * +------+ prev +-----+ +-----+ + * head | | <---- | | <---- | | tail + * +------+ +-----+ +-----+ + +1. AbstractQueuedSynchronizer 从名字上就可看出本质是一个队列(Queue),其内部维护着 FIFO 的双向队列,也就是变体 CLH 队列的实现。 +2. 所有的 Lock 都是基于 AQS 来实现了。AQS 和 Condition 各自维护了不同的队列,在使用 lock 和 conditio n的时候,其实就是两个队列的互相移动。那么你说的两个队列,只的是 Condition 队列吗? + +管程(新了解内容,以前没注意过): + +1. 管程就是指管理共享变量,以及对共享变量的相关操作。具体到 Java 语言中,管程就是管理类的成员变量和方法,让这个类是线程安全的。管程的发展史中,先后出现过三种管程模型,Hasen 模型、Hoare 模型和 MESA 模型,Java 使用的是 MESA 模型。 +2. 使用管程模型主要是解决并发编程中的两个核心问题,互斥和同步。互斥是指同一时刻只允许一个线程访问共享资源,同步则是指线程之间如何通信、写作。 +3. 解决互斥:将共享变量及对共享变量的操作统一封装起来 +4. 解决同步:管程模型与上厕所排队的流程类似,管程入口处有一个等待队列。当多个线程试图进入管程内部的时候,只允许一个线程进入,其他线程在等待队列中等待。就和上厕所的时候排队一样。 + +综上:一般此类实现除了消费队列,还需有等待队列,以便于实现 Lock 相关内容。推荐阅读:《Java并发编程实践》 不确定以上是否为你需要的,可以回复讨论。 + +--- + +微服务应用之间调用接口,如何控制权限? + +1. 通过在微服务 RPC 接口或者网关层接口,配置权限校验组件,这类组件一般是自研的。通过校验组件设置接口调用权限码,调用时需要传一个固定的分配值。 +2. 指定服务器名称、服务器IP,进行调用,非此信息以外的服务不能被链接调用。 +3. 通过开发接口间非对称加密传输安全校验的,一般用在双方为安全级别较高的接口调用上。 +4. 接口自由度较高的申请获取字段查询,申请时候会分配一个有效签约期的授权码,拿到授权码后,可以调用指定接口。 + +--- + +小傅哥,这是我按你昨天说的整理的目前项目的技术栈和想要学的技术栈。期待你的建议。 + +从目前你的技术使用上来看,其实广度是有的,只是缺少一些深度的学习和使用。建议: +第一阶段:学习下数据结构、算法逻辑(仅Jdk自身的即可,HashMap、ArrayList、AQS等来夯实java能力)、设计模式,这些技术是后续的学习其他技术的基础。 +第二阶段:学习 MyBatis 源码,至少要能搞懂“为什么,不写具体的DAO实现类,就能通过配置文件或者注解执行对数据库的增删改查操作”,这个知识会让你把Spring常用接口和类串联起来,也可以把代理、反射、解析xml、连接池使用上。 +第三阶段:学习 Spring 源码,学习完成后尝试结合 Spring 写一些中间件,比如数据库路由组件、ES查询引擎组件,这些在我写的《SpringBoot中间件设计和开发》中都有例子。 +第四阶段:补充对 MQ、SpringCloud、ES 等框架类的深入学习,要学习它的设计架构、核心源码、技术目的、使用场景。 +第五阶段:完成较难度项目的开发,比如实现一个分布式架构下的活动抽奖系统,如何设计其中的秒杀、抽奖算法、奖品发放,这个项目可以模拟小程序中一些抽奖的设计去实现。 -- GitLab