项目笔记
未读课程相关资料课程主页
课程安排
课程视频
GitBook
GO 语言学习拉取实验代码1git clone git://g.csail.mit.edu/6.824-golabs-2022 6.824
通过命令行跑一遍提供的非并行版 mrsequential.go :123456789cd 6.824cd src/main# 将wc.go编译成插件形式,生成wc.sogo build -race -buildmode=plugin ../mrapps/wc.gorm mr-out*# 进行并发检测,并将编译后生成的wc.so插件,以参数形式加入mrsequential.go,并运行go run -race mrsequential.go wc.so pg*.txt# 查看生成的文件more mr-out-0
如果跑通的话会在命令行输出文本单词的出现次数。
配置 GoLand 运行/调试环境
先在src/main 底下创建脚本sh文件:wc-build.sh
1234# 将wc.go编译成插件形式,生成wc.sogo build -race -buildmode=plugin ../mr ...
粘包与半包粘包现象服务端代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546public class HelloWorldServer { static final Logger log = LoggerFactory.getLogger(HelloWorldServer.class); void start() { NioEventLoopGroup boss = new NioEventLoopGroup(1); NioEventLoopGroup worker = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.channel(NioServerSocketChannel.cla ...
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端
Netty 的地位Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位
以下的框架都使用了 Netty,因为它们有网络通信需求!
Cassandra - nosql 数据库
Spark - 大数据分布式计算框架
Hadoop - 大数据分布式存储框架
RocketMQ - ali 开源的消息队列
ElasticSearch - 搜索引擎
gRPC - rpc 框架
Dubbo - rpc 框架
Spring 5.x - flux api 完全抛弃了 tomcat ,使用 netty 作为服务器端
Zookeeper - 分布式协调框架
Netty 的优势
Netty vs NIO,
NIO 工作量大,bug 多
需要自己构建协议
解决 TCP 传输问题,如粘包、半包
epoll 空轮询导致 CPU 100%
对 API 进行增强,使之更易用,如 FastThreadLocal => ThreadLocal,ByteBuf ...
在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共存;分别是BIO、NIO和AIO。
Java BIO[Blocking I/O] | 同步阻塞I/O模式
BIO 全称 Block-IO ,是一种同步且阻塞的通信模式。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。
Java AIO[Asynchronous I/O] | 异步非阻塞I/O模型
Java AIO,全称 Asynchronous IO,是异步非阻塞的IO。是一种非阻塞异步的通信模式。在NIO的基础上引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。
Java NIO[Non Blocking I/O] | 同步非阻塞模式
Java NIO,全称 Non-Block IO ,是Java SE 1.4版以后,针对网络传输效能优化的新功能。是一种非阻塞同步的通信模式。
NIO 与原来的 I ...
每日温度leetcode题目链接
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
思路草稿
题解1234567891011121314151617181920class Solution { public int[] dailyTemperatures(int[] temperatures) { int[] res = new int[temperatures.length]; Stack<Integer> stack = new Stack<>(); stack.push(0); for(int i = 1;i<temperatures.length;i++){ if(temperatures[i]<=temperatures[stack.peek()]){ ...
斐波拉契数leetcode题目链接
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 n ,请计算 F(n) 。
思路草稿
题解123456789101112131415class Solution { public int fib(int n) { if(n<=1){ return n; } int[] dp = new int[n+1]; dp[0] = 0; dp[1] = 1; for(int i = 2;i<=n;i++){ dp[i] = dp[i-2] + dp[i-1]; } return dp[n]; }} ...
分发饼干leetcode题目链接
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
思路草稿
题解12345678910111213141516class Solution { public int findContentChildren(int[] g, int[] s) { Arrays.sort(g); Arrays.sort(s); int count = 0; for(int i = 0,j = 0;i < s.length && j < g.length;i++){ if(s[i]>=g[j]){ ...
组合leetcode题目链接
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]
思路草稿
题解1234567891011121314151617181920212223class Solution { List<Integer> path = new ArrayList<>(); List<List<Integer>> result = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { backTracking(n,k,1); return result; } private void backTracking(int n,int k,int s ...
二叉树深度优先遍历(前中后序遍历)递归123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = ...
232.用栈实现队列leetcode题目链接
使用栈实现队列的下列操作:
push(x) — 将一个元素放入队列的尾部。
pop() — 从队列首部移除元素。
peek() — 返回队列首部的元素。
empty() — 返回队列是否为空。
思路草稿
题解12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class MyQueue { Stack<Integer> stackIn; Stack<Integer> stackOut; public MyQueue() { stackIn = new Stack<>(); stackOut = new Stack<>(); } public void push(int x) { stackIn.push(x); } p ...