自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 Java内存模型和Volatile关键字

一、什么是Java内存模型  Java内存模型(Java Memory Model,简称JMM)。在了解Java内存模型之前我们要先知道计算机的内存机制,现在大多数计算机都是多核CPU,每个CPU上都可以执行线程,而线程使用的数据都是储存在内存中,所以我们就需要从内存中去读取数据,但是这个过程对计算机来说是一个很慢很慢的的过程,而CPU处理指令的速度却是很快的,所以为了解决这两者之间速度的问题,就引入了高速缓存的概念,高速缓存分为L1、L2、L3多级,详细的看下图。其中越靠近CPU的结构读取速度就越快,但是

2022-06-20 21:12:00 237 1

原创 源码角度了解Skywalking之Skywalking是如何进行JVM监控的

大家都知道Skywalking可以监控Java的JVM情况,包括垃圾回收情况等等,那么它是怎么实现的呢?今天就带大家一探究竟。通过前几篇的文章我们知道,Skywalking启动的时候,会加载各种BootService实现类,而有关JVM的BootService实现类就是JVMServiceJVMService可以看做一个定时器,它收集JVM cpu、内存、内存池和gc 信息等等参数,并将收集到的信息通过GRPCChannelManager提供的通道发送给Collector,GRPCChannelManage

2022-06-20 21:10:14 1232

原创 基于机器学习和深度学习,华为大神手写AIoT系统学习小册

学习完本小册后你可以在简历上写:应用不同的人工智能技术,包括机器学习和基于TensorFlow和Keras的深度学习。访问和处理来自各种分布式数据源的数据。对AIoT数据执行有监督和无监督机器学习。基于MLlib和H2O.ai平台,在Apache Spark框架上实现对IoT数据的分布式处理。基于深度学习方法对时间序列数据进行预测。从可穿戴设备和智能设备得到的数据中获取独到的洞察。小册目录​ ​ ​ ​ ​ 部分内容截图大多数数据库都是采用关系型数据库的组织方式。一个关系型数据库由一个或多个相

2022-06-20 21:07:21 293

原创 双管齐下,JDK源码+HotSpot源码一次性学完

JDK源码手册除了第一章节的内容外,我们会从第二章开始自下而上,从简单到复杂的有顺序的深度学习整个Concurrent包!​ Semaphore(Semaphore也就是信号量,提供了资源数量的并发访问控制)​ ​ HotSpot源码手册 这份手册主要讲述的就是HotSpot基础功能模块的源码,这份手册对于你基础地基将会是一个很好的补充,同时手册将会结合大量的实例进行讲解,这样对于受众来说将会更加容易接受以及吸收。​ ​ HandleArea、Area与Chunk​ klassVta

2022-06-20 21:05:21 581

原创 短期内跳槽的Java程序员必看的八项知识点+两大项目实战

1:多线程高并发2:JVM虚拟机3:设计模式4:redis5: zookeeper6: mysql调优课程7:netty(网游后端项目)8:spring源码分析2大项目:网约车+亿级流量多级缓存架构平台一、多线程与高并发基础概念JUC同步工具同步容器线程池高频面试加分项JMH = Java Microbenchmark Harness应用类型Disruptor​二、JVM虚拟机JVM调优案例式实战化指导见1:虚拟机基础概念2: class文件结构3:内存加载过程4:运行时内存结构5: JVM常用指令6: G

2022-06-20 21:01:17 151

原创 Javac 源码调试教程

一直有读者问我 javac 源码怎么调试,自己也在写 JVM 掘金小册的过程中阅读了大量的 javac 的源码,网上这方面的文章也比较少,那就来写一篇 javac 源码调试的文章吧,作为 javac 系列文章的开篇。javac 源码调试的过程是比较简单的,它本身就是一个用 Java 语言写的,对我们理解内部逻辑比较友好。环境备注:Intellij、JDK81、第一步下载导入 javac 的源码如果不想从 openjdk 下载折腾,可以跳过第 1 步直接从我的 github 下载:github.com/art

2022-06-18 14:25:40 662

原创 更多发作品811收藏分享引人入胜,实战讲解“Java性能调优六大工具”之linux命令行工具

Linux平台是使用最为广泛的服务器平台之一,不少Java端程序都运行在类Linux平台(如AIX、Solaris等)上。不同的类Linux操作系统的很多命令都非常相似,不少命令仅有一些细节上的差异。本节主要介绍用于Linux平台的性能收集和统计工具。top命令的输出结果可以分为两个部分: 前半部分是系统统计信息, 后半部分是进程信息。在统计信息中, 第1行是任务队列信息, 它的结果等同于uptime命令。 从左到右依次表示: 系统当前时间、 系统运行时间、 当前登录用户数及系统的平均负载(使用lo

2022-06-18 14:21:38 388

原创 【无标题】

FutureTask用法介绍FutureTask是JDK并发包为Future接口提供的一个实现,代表一个支持取消操作(cancel)的异步计算任务。它实现了Future接口和Runnable接口,所以既是计算任务对象也是结果对象。它可以提交到线程池中去执行,并且结果直接放在自身这个FutureTask中,不是放在另外一个Future中。我们把FutureTask提交到线程池运行的方法一般是先实现一个Callable或Runnable,然后再把它传给FutureTask的对应构造函数从而创建一个FutureT

2022-06-17 19:36:20 207

原创 Java并发工具AbstractQueuedSynchronizer实现详解

AbstractQueuedSynchronizer(以下简称AQS或AQS锁)是ReentrantLock的底层实现,它提供了自旋、FIFO线程等待队列和阻塞等功能。Java常见并发同步工具如Semaphore、CountDownLatch、ReentrantLock等都是基于AQS实现的。AQS的实现要点总结如下:1. 用一个原子int变量代表同步状态AQS内部有一个原子int变量(命名为state),它是AQS的核心状态,也是唯一跟同步有关的变量。例如,ReentrantLock中state≠0表示锁

2022-06-17 19:33:52 221

原创 【无标题】Java线程池ThreadPoolExecutor的实现原理详解,让面试官仰望

本文将分析Java线程池ThreadPoolExecutor的实现原理,掌握了实现原理能帮助你更好的优化程序的性能,避免很多错误用法。本文的代码量较少,主要讲原理,等你把原理完全弄明白了代码随便一写一大堆。1. 线程池的状态首先,线程池是一个有状态的对象。状态有以下几种:· RUNNING: 运行中。此时线程池能接受任务,并且会处理队列中的任务;· SHUTDOWN: 关闭中。此时,线程池不接受新任务,但是会处理队列中的任务;· STOP: 停止。此时线程池不接受新任务,也不会处理队列中的任务,还会中断wo

2022-06-17 19:28:08 205

原创 公司是一个线程池,员工在池子里工作,看来真理无论到哪都通用啊

之前我们严肃而认真的研究了Java线程池(ThreadPoolExecutor类)的用法,还深入解析了实现原理,当时我们的学习姿态是这样的。不知道身为程序员的你有没有认真阅读前面的文章。如果你认真学习的话,那么一定会知道Java线程池管理线程的方法:当线程数小于corePoolSize的时候,来一个任务就创建一个线程;当线程数大于corePoolSize然而阻塞队列有容纳空间的时候,任务放进队列;当线程数大于corePoolSize并且队列也满了后,再次创建线程,直到线程数达到maximumPoolSize

2022-06-17 19:27:11 166

原创 下一次面试就会问——Java并发工具Semaphore的用法及实现原理

Semaphore这个英文单词的意思是信号灯,即发送信号的那种灯。Java并发工具包中的Semaphore类则是线程之间互相发送信号的工具。我们可以把Semaphore看作一个包含多个许可(permit)的集合,例如一个代表5个许可的Semaphore、6个许可的Semaphore等等(为便于表达,后文用字母P表示许可)。Semaphore上的acuqire操作申请P,而release操作则产生P,Semaphore可用于追踪可用资源的个数。1. 在代码中的某个地方创建Semaphore(第2个构造参数是公

2022-06-17 19:25:47 212

原创 redis 数据类型,string底层结构,穿透,击穿,雪崩,数据一致性

一,redis的数据类型 string Hash List Set zset,string的存储结构是什么?String:数据结构是简单动态字符串(simple dynamic string),简称sds;sds的结构如下: "nihao" 单词最终是这样存储的 free记录的是当前可用的空间,len记录的当前数据的长度,buf记录的是当前的数据,它是一个字符数据结构,因为是用C写的所以后面有"\0"。这种结构的优点:防止数据溢出:假如不是这种sds结构存储,redis是用C写的,所以我们每次存储数据的时候

2022-06-16 13:36:51 191

原创 java中==和equals的区别,重写equals时要重写hashcode

先写一个Student类后面会用到==和equals是要分情况的==分两种情况: 如果作用于引用类型的变量,则比较的是所指向的对象的地址,比如我们又Student类equals也分两种情况:比如我们又Student类 ,这个和==号比较对象或者引用类型是一样的效果重写equals需要重写hashcode上面的例子我们也看到了用equals去比较Student返回的false,因为它比较的是内存地址。如果我们想比较的话就需要在Student类里面重写equals方法和ha

2022-06-16 13:34:56 173

原创 MySQL数据库外键导致死锁

问题是,针对同一张表的两条数据事务1先开启执行step-1, 对id=1这条数据加排他锁(X锁),事务2开启 执行step-2,对id=2这条纪录加排他锁(X锁)事务1执行step-3,此时事务2已经持有id=2的排他锁,所以step-3处于等待状态事务2 执行step-4,发现事务1已经持有id=1的锁,导致互相等待报死锁 B表为主表,A表持有B表主键,存在外键关联的情况,如果数据发生变化:增删改情况,mysql都会默认的先去主表查询数据并且增加共享锁,防止当前修改的数据发生出现死锁的过程:事务1执行st

2022-06-16 13:33:47 1528 1

原创 HashMap 初始容量设置为9,真的就是9吗

HashMap 初始容量设置为9,真的就是9吗?答案是否定的。我们一般不需要设置HashMap的容量,默认容量16,负载因子为0.75,也就是说内容超过16*0.75=12,就会进行rehash扩容,但是扩容这个过程是比较费时间的。所以如果我们预估的内容超过12(不是16)的时候,我们最好指定下长度。那这个长度如何计算呢?遵循公式: (int) ((float) expectedSize / 0.75F + 1.0F),比如我们要放20个元素,那就是 20/0.75+1=27,这里的加1,是因为20/0.7

2022-06-16 13:32:16 297

原创 spring配置正确,但是事务还是失效?

最近有同学给我说他的spring配置是正确的,但是发现有的事务生效,有的事务不生效,我第一直觉就是他的写法可能有问题。后来我总结一些事务不生效的场景。spring事务分两种,一种注解事务,另一种编程式事务。我们一般使用注解事务@Transactional。注解实现原理是基于AOP,而AOP基于代理拦截做的,另外事务的传递是利用ThreadLocal,所以必须满足三个条件事务才能生效:我用代码说明下:1,被调用的方法不能在同一个类中:因为事务注解基于代理实现,如果调用方法和被调用的方法在同一个类中,是平

2022-06-16 13:27:47 126

原创 一文就懂Java虚拟机的CMS收集器原理及使用

CMS收集器的设计目标是优先降低GC停顿时间(相对地降低吞吐量),并且适合于有足够CPU资源提供给GC线程使用的那些应用程序。所以,如果你需要较短的GC停顿时间并且CPU数量充足,那么建议使用CMS收集器。例如,如果应用程序有较多长期存活的对象,那么老年代就会很大,导致GC暂停时间很长,并且有至少2个以上cpu核,那么适合使用CMS收集器。-XX:+UseConcMarkSweepGCCMS收集器针对新生代和老年代分别独立回收(新生代minor gc,老年代major gc)。因为新生代空间较小,老

2022-06-15 22:10:51 754

原创 Semaphore的概念及基本用法

Semaphore这个英文单词的意思是信号灯,即发送信号的那种灯。Java并发工具包中的Semaphore类则是线程之间互相发送信号的工具。我们可以把Semaphore看作一个包含多个许可(permit)的集合,例如一个代表5个许可的Semaphore、6个许可的Semaphore等等(为便于表达,后文用字母P表示许可)。Semaphore上的acuqire操作申请P,而release操作则产生P,Semaphore可用于追踪可用资源的个数。 1. 在代码中的某个地方创建Semaphore(第2个构造参数

2022-06-15 22:08:45 8053

原创 基于JDK 7,我们如何实现一个多线程计数器?

基于JDK 7,我们如何实现一个多线程计数器?一般做法是定义一个volatile long或定义一个AtomicLong(底层也是volatile long),然后在每个线程中用CAS操作对它进行add操作。这两种做法都是没问题的,功能是正确的、性能也还好,我们继续按照原来的方式使用即可。不过,如果你的项目升级到了JDK 8,还可以进一步提高多线程计数器的性能,让它比传统的volatile long方式更高效。JDK 8新增的LongAdder类(父类是Striped64,包含一些公用方法)就是用来完成这个

2022-06-15 22:05:02 178

原创 几个id就生成调用链拓扑图,微服务全链路监控系统5分钟弄懂

在微服务架构系统中,一个应用往往被拆分多个微服务,因此一次请求就需要调用多个微服务。这些微服务可能是由不同的开发团队维护、使用不同的编程语言实现、部署在不同的机房、每个微服务部署的服务器数量差异很大(几十台到几千台)、横跨多个数据中心等,归结成一点,就是部署情况和调用情况复杂。因此,需要一些可以帮助理解系统行为、进行性能分析的工具,以便在发生故障的时候,能够快速定位和解决问题。全链路监控就是为解决上面这些问题产生的,可参考谷歌论文(Google Dapper,https://bigbully.github

2022-06-15 22:03:13 1548

原创 Spring容器是怎么初始化的?

Spring容器是怎么初始化的原创声明文/吴潇(Java Senior)本文分析Spring容器初始化过程。在Spring Framework中,所有类型的容器都是由ApplicationContext接口表示的,而AbstractApplicationContext是这个接口的第一个实现,包含适用于各类容器的公共代码。所以我们分析容器初始化过程,主要是分析AbstractApplicationContext中跟初始化相关的代码。 如果从Web应用中常用的XmlWebApplicationContext容

2022-06-15 22:00:49 702

原创 工作三年还不懂facet?赶紧学一学IntelliJ IDEA如何管理java项目

入职三年,写了很多业务代码,做了无数个产品需求,却没有自己搭建过一个项目?从其他团队接手一个老项目,从git拉下来一大堆代码,要该怎么运行?代码写得好好的,IntelliJ IDEA突然退出,搞好以后重新打开项目,却发现本地运行不了了,怎么办?以上问题基本是因为我们不熟悉Intellij IDEA的项目结构导致的。Intellij IDEA 是现在java程序员最经常使用的IDE,它功能强大,集成多种框架插件,让java开发效率倍增。然而, 很多新手程序员依然不明白,在IntelliJ IDEA中,一个项目

2022-06-15 21:59:01 770

原创 MySQL中的redo log和undo log

MySQL日志系统中最重要的日志为 重做日志redo log 和 归档日志bin log ,后者为MySQL Server层的日志,前者为InnoDB存储引擎层的日志。1 重做日志redo log1.1 什么是redo logredo log用于保证事务的持久性,即ACID中的D。持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。redo log有两种类型,分别为物理重做日志和逻辑重做日志。 在InnoDB中redo log大多数情况下是一个物

2022-06-14 20:01:55 821

原创 ZooKeeper 核心设计的理解与实战

想起很久以前在某个客户现场,微服务 B 突然无法调用到微服务 A,为了使服务尽快正常恢复,重启了微服务 B 。但客户不依不饶询问这个问题出现的原因,于是我还大老远从杭州飞到深圳,现场排查问题。最后的结论是,zk 在某时刻出现主备切换,此时微服务 A(基于 dubbo)需要重新往 zk上注册,但是端口号变了。但是微服务 B 本地有微服务 A rpc 接口的缓存,缓存里面还是旧的端口,所以调用不到。解决方法就是,把微服务的 rpc 端口号改成固定的。虽说原因找到了,但对于 Zookeeper 的理解还是不够深刻

2022-06-14 19:59:33 147

原创 细节炸裂!阿里大佬深入探究G1源码之YoungGC技术

首先G1的GC过程分为4个阶段或者说策略:1.youngGC2.老年代并发GC(又叫并发模式gc,本文都先称之为老年代并发gc)3.混合GC4.FullGC每个阶段GC的内容都比较多,在这里由于篇幅原因,我们先讲解下g1中youngGc(源码中也叫增量gc) 的源码,话不多说,直接来看:一、youngGC触发的时机关于GC笔者不建议直接去看GC的方法,最好是从GC触发的时机去看,从入口去看,这样才能更全面的学习GC的源码,更深层次的学习GC的相关流程。youngGC的触发时机是在创建对象时若申请不到内存,则

2022-06-14 19:45:28 698

原创 消息中间件中的王者:Kafka!应付Kafka面试,看这篇就够了

为什么要使用 kafka?kafka的数据可靠性怎么保证Kafka的数据是放在磁盘上还是内存上,为什么速度会快?副本数据同步策略故障处理kafka事务是怎么实现的Kafka为什么不支持读写分离?Kafka的数据是放在磁盘上还是内存上,为什么速度会快?总结为什么要使用 kafka?缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。解耦和扩展性:项目开始的时候,并不能确

2022-06-14 19:35:54 96

原创 竟然有5种微服务框架可以替代Spring Boot

在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。名称版本发布时间开发商GitHubHelidon SE1.4.12019年甲骨文链接Ktor1.3.02018年JetBrains链接Micronaut1.2.92018年Object Computing链接Quarkus1.2.02019年Red Hat链接Spring Boot2.2.42014年Pivotal链接本文,基于这些微服务框架,创建了五个服务,并使用Consul的服务发现模式实现服务间的

2022-06-14 19:25:45 1671

原创 锁的使用与死锁的避免

我在写 《并发场景下数据写入功能的实现》 时提过,在并发场景下,如果存在数据竞争,则需要用锁来保证线程安全。锁会增加编码的复杂度,也会降低代码的执行效率,还潜在死锁、活锁等隐患。活锁,通常加个随机的等待时间,做几次重试就可以避免,故本对“锁的使用”和“死锁的避免”做近一步说明。锁的使用套路是:对代码上锁,可以使用java 关键字 或java并发包中的 ,如:private Object lock = new Object();public void visitShareResWithLock()

2022-06-13 21:47:28 467

原创 阿里第二代微服务Spring Cloud Alibaba成为主流,但要如何掌握Alibaba微服务?Spring Cloud是前提

前言微服务,作目前最为流行的架构技术,相信作为开发人员多少都有些了解,因为采用微服务构建系统会带来更为清晰的业务划分和可扩展性。对于微服务,阿里肯定有话要说,现在阿里第二代微服务Spring Cloud Alibaba成为主流,但要完全掌握Alibaba微服务,Spring Cloud是前提,所以学习好Spring Cloud很有必要。今天分享的,则是阿里首席官珍藏数年的SpringCloud精通日记,十余年的开发血汗全记录在里面了,希望能够帮助到你,带你掌握SpringCloud微服务!​添加图片注释,不

2022-06-13 21:46:45 451

原创 方程就是二叉树森林?遗传算法从数据中直接发现未知控制方程和物理机理

机器之心编辑部偏微分方程是领域知识的一种简洁且易于理解的表示形式,对于加深人类对物理世界的认知以及预测未来变化至关重要。然而,现实世界的系统过于紊乱和无规律,控制方程往往具有复杂的结构,难以从机理模型中直接推导获得。研究者们希望通过机器学习方法,直接从高维非线性数据中自动挖掘最有价值和最重要的内在规律(即挖掘出问题背后以 PDE 为主的控制方程),实现自动知识发现。近日,东方理工、华盛顿大学、瑞莱智慧和北京大学等机构的研究团队提出了一种基于符号数学的遗传算法 SGA-PDE,构建了开放的候选集,可以从数据中

2022-06-13 21:43:02 161

原创 CPU测温软件怎么读出来的内核温度?有什么简单靠谱的读取

​编辑CoreTemp界面1MB多一点的size,可以提供足够多的信息了。界面和著名的CPU-Z有些类似,简单,但信息量丰富。比较重要的有TDP、Power、TjMax和各个内核的温度,包括最小值和最大值。这点比较重要,大家可以将它在后台开启一段时间,运行一些拷机程序,看看最高温度能达到多大。 下载安装后,在我过热的NUC上打开,是这样:​编辑添加图片注释,不超过 140 字(可选)这里需要注意我特别标出的两个值:我的主板BIOS设置的TjMax值是100度,也就是超过100度,PROCHOT#将被使能,就

2022-06-13 21:42:20 2714

原创 SpringBoot自动装配加载过程全梳理!你能get多少?

首先我们来看下@SpringBootApplication 这个注解的背后又有什么玄机呢,我们按下 ctrl + 鼠标左键,轻轻地点一下,此时见证奇迹的时刻..我们看到如下优雅的代码:这其中有两个比较容易引起我们注意的地方,一个是@SpringBootConfiguration注解,另一个是@EnableAutoConfiguration注解;之所以说这个两个注解比较吸引我们的眼球, 不是因为它们长大的好看,而是因为其他的注解太难看了(主要是因为其他的注解我们都是比较熟悉,即使不知道他们是干什么的,可以

2022-06-09 21:30:49 116

原创 Java中的枚举,这一篇全了,一些不为人知的干货

在编译或设计时,当我们知道所有变量的可能性时,尽量使用枚举类型。本篇文章就带大家全面系统地了解枚举的使用,以及会遇到的一些问题。枚举通常是一组相关的常量集合,其他编程语言很早就开始用枚举了,比如C++。从JDK1.5起,Java也开始支持枚举类型。枚举是一种特殊的数据类型,它既是一种类(class)类型却又比类类型多了些特殊的约束,这些约束也造就了枚举类型的简洁性、安全性以及便捷性。在Java中,通过enum来声明枚举类型,默认继承自java.lang.Enum。所以声明枚举类时无法再继承其他类。在生活中我

2022-06-09 21:29:45 258

原创 程序员必修课:阿里性能优化全解终开源!设计+代码+JVM三飞

性能优化可以说是我们程序员的必修课,如果你想要跳出CRUD的苦海,成为一个更“高级”的程序员的话,性能优化这一关你是无论无何都要去面对的。为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化。除了最常见的代码优化外,在软件架构上、JVM虚拟机层、数据库以及操作系统层面都可以通过各种手段进行调优,从而在整体上提升系统的性能。为了能让大家更好的入手性能优化,今天LZ为大家带来了一份阿里内部强推性能优化全栈小册,内容涵盖设计调优、代码调优、JVM调优。大家看了之后就知道,差距不止一点点!下面就为大家

2022-06-09 21:27:30 144

原创 ​CTO问我Pulsar到底能不能取代Kafka

Pulsar源自Yahoo,于2016年开源并捐献给Apache基金会,并在2018年9月升级成为Apache顶级项目。Kafka最初由Linkedin开发,并于2010年贡献给了Apache基金会,之后成为Apache顶级项目。Kafka架构由broker和zookeeper组成,如下图:[1]注意:Kafka2.8版本可以不依赖Zookeeper独立运行了Pulsar的架构如下:Pulsar Broker会在本地缓存消息,并且支持TTL,从上面的2个架构我们看到,Kafka和Pulsar有3点不同:Ka

2022-06-09 21:26:14 110

原创 盘点一下我用kafka两年以来踩过的一些非比寻常的坑

我的上家公司是做餐饮系统的,每天中午和晚上用餐高峰期,系统的并发量不容小觑。为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,防止出现线上问题时能够及时处理。我当时在后厨显示系统团队,该系统属于订单的下游业务。用户点完菜下单后,订单系统会通过发 kafka 消息给我们系统,系统读取消息后,做业务逻辑处理,持久化订单和菜品数据,然后展示到划菜客户端。这样厨师就知道哪个订单要做哪些菜,有些菜做好了,就可以通过该系统出菜。系统自动通知服务员上菜,如果服务员上完菜,修改菜品上菜状态,用户就知道哪些菜已经上了,哪

2022-06-09 21:25:16 188

原创 太卷了,某公司把自家运营多年的核心系统(智慧系统)完全开源了

推荐一款开源的智慧物业开源系统。实现了微信公众号、小程序、PC、H5、智能硬件多端打通,旨在提升物业公司效率、规范物业服务流程、提升物业服务满意度、加强小区智慧化建设、便捷业主服务。后端采用Koa + Typescript轻量级构建,支持分布式部署;前端使用vue + view-design开源协议使用 AGPL-3.0 开源许可协议产品展示web中台​编辑切换为居中添加图片注释,不超过 140 字(可选)​编辑切换为居中添加图片注释,不超过 140 字(可选)​编辑切换为居中添加图片注释,不超过 140

2022-06-08 20:55:54 102

原创 并发编程-看完这篇,所有Java并发编程的问题你都能应对自如

对象锁是用于对象实例方法,或者一个对象实例上的, 类锁 是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,类锁其实锁的是每个类的对应的class对象。类锁和对象锁之间也是互不干扰的。对象锁:/** * 对象锁 synchronized修饰普通方法 锁的是当前类实例对象 */ public s

2022-06-08 20:54:04 108

原创 网络知识大集合(最详细)与网络通信过程

​编辑切换为居中添加图片注释,不超过 140 字(可选)数据流转示意先需要了解一些基本的概念网络模型OSI七层协议模型OSI(Open System Interconnection)开放系统互连参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。​编辑切换为居中添加图片注释,不超过 140 字(可选)OSI七层协议模型应用层 DHCP · DNS · FTP · Gopher ·GTP · HTTP · IMAP4 · IRC · NNTP · NTP · POP3 · RPC

2022-06-08 20:51:58 290

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除