lifei6671

lifei6671 查看完整档案

青岛编辑中国海洋大学  |  计算机科学与技术 编辑青岛百洋健康药房连锁有限公司  |  PHP工程师 编辑 github.com/lifei6671 编辑
编辑

个人动态

lifei6671 回答了问题 · 2月18日

解决golang http server handler 里面协调会一直运行原因?

你的协程没有退出点也,肯定会一直执行,for语句本身就是无限循环了。

关注 2 回答 2

lifei6671 关注了用户 · 2月18日

北风之神 @borey_class

北风之神核潜战略专家

关注 17

lifei6671 赞了回答 · 2月18日

SIGPIPE 信号为什么不能杀死一个 golang 的进程?

图片.png
图片.png
【结论:go的编译器对SIGPIPE等部分中断信号做了一些屏蔽处理,下面是长篇大论的验证,如果你有兴趣可以看一看,go的编译器实现很骚,是我见过最骚最不单纯的语言】

如果你以前写过进程间通信【管理,匿名管道,文件,SOCKET等】可能遇到过此中断信号SIGPIPE
如果你以前亲自写过网络编程 可能对SIGPIPE中断信号非常熟悉

中断信号 简称软中断,它的处理机制跟硬件中断类似,有中断请求,中断处理【处理过程有的称为中断处理程序,中断处理函数,比如你写过网络编程就知道 网卡接收到数据时,会发起中断请求到CPU,CPU执行中断处理程序,就会把数据写入到对应的SOCKET 文件,比如EPOLL 文件,同时唤醒进程执行 SOCKET的读写操作】中断处理完以后,就会返回到原处,称为中断返回,整个过程就是中断的处理机制。

在LINUX 中可以通过kill命令列出所有的中断信号,每个信号都以SIG开头,后面就是中断的名字,前面的数值就是中断信号的编号。最常用的就是前面的32个。

图片.png

每个中断信号都有相应的中断处理程序【处理函数】默认有3种类型的【1是系统默认动作,2是忽略 3是用户编写的中断处理程序】

中断信号除了用于进程间的简单通信,还能让进程终止,停止,恢复执行【如进程作业控制】,有些信号进程可以忽略,捕获,有些信号进程不能忽略和捕获,主要用于安全的确保终止和停止如SIGKILL,SIGSTOP
同时有些中断信号还能产生ELF 文件即core 文件并终止。

给进程发送信号除了编程语言封装的如php posix_kill,c/c++则是kill,但都是用linux api的kill
而终端命令如kill就是用来发送中断信号的,并不是所谓的“杀死”

进程可以设置屏蔽字设置阻塞的中断信号,当中断信号产生请求时,会被阻塞,并存储在未决集里

中断信号还能影响到系统调用,如果你写过网络编程,或是你了解网络框架,了解网络通信协议如HTTP,WEBSOCKET等,你会发现一个东西叫 “中断系统调用”或是你掌握网络编程时,必须知道“中断系统调用” 和 “可重入函数” 如IO复用函数select,epoll都是中断系统调用。

中断信号的掌握是一个程序员掌握网络编程的一个关键知识点。

更多知识点请自行阅读LINUX API 手册 或是@ me

以上知识跟编程语言没有任何关系!!!

下面恢复测试你的程序
go文件补充【我不是学go语言的,因为这些知识跟语言没有任何关系】
图片.png
图片.png
文件类型,只是一个文本文件,你们称为go源码文件
图片.png

在控制终端进程下启动go程序
图片.png

图片.png
查看是何命令启动的:
图片.png
查看进程关联了哪个输入输出文件
图片.png
里里有epoll文件和2个管道文件【google闲的没事干了】
图片.png

图片.png
上面这些内容是什么意思?
图片.png
看完上面的图,你就知道go的实现机制很骚,并不是启动一个进程,而启动一堆进程和线程

图片.png
接下来我们用c程序测试SIGPIPE 中断信号
图片.png
图片.png

执行信号的默认动作 SIGPIPE
图片.png

关注 3 回答 2

lifei6671 回答了问题 · 2月18日

解决go语言框架中会出现静态语言如java的成员变量内存溢出的问题么?

你说的是spring框架吧,这个框架是使用依赖注入的,每个类都是单例,所以不能使用成员变量,这样在并发情况下会导致属性比多线程操作。
go里面也存在这种问题,比如,如果你的一个结构体是包级别变量,在多个请求中都操作了这个变量的属性,就会存在并发问题。
其实这个不是语言问题,是框架设计和使用问题。

关注 2 回答 1

lifei6671 关注了专栏 · 2020-10-19

Java知识点大全

Java3y原创技术文章

关注 2838

lifei6671 回答了问题 · 2020-06-10

解决关于 golang 的一个变量设计问题

golang语法中,首字母大小写就是导出不导出的语法。所以你要么换成小写开头,要么就导出函数。这是语法限制。

关注 4 回答 3

lifei6671 回答了问题 · 2020-06-10

解决for select 里使用return一直阻塞

因为return语法会跳出整个函数调用。

你的代码中,多次调用 NewCache() 只初始化了一个_cache,当你在monitor()使用了return语法,会让整个协程退出,导致c.ch 管道没有消费。所以会阻塞请求。

关注 3 回答 2

lifei6671 回答了问题 · 2020-06-04

问下 easyswoole gin springboot 学那个啊, 我看压测都差不多.

想快速入门且将来有所发展建议学go。
想入门且划水建议学swoole。
想长期从事且二三线城市都不是也建议学Java。

关注 4 回答 3

lifei6671 赞了文章 · 2020-05-08

Redis 到底是单线程还是多线程?我要吊打面试官!

最近在Java技术栈公众号发布的一篇文章,其中有一道题:

Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看)

好些粉丝在后台问我:为什么请回,Redis不是单线程吗?

大家注意审题:Redis是多线程还是单线程?

这个问题你要从多个方面回答,如果你仅仅只回答 "单线程" 肯定是说不过去的,为什么呢?

所以今天,栈长利用工作时间紧急把这个问题紧急梳理了下,希望对大家有帮助。

1、Redis 单线程到底指什么?

没错,大家所熟知的 Redis 确实是单线程模型,指的是执行 Redis 命令的核心模块是单线程的,而不是整个 Redis 实例就一个线程,Redis 其他模块还有各自模块的线程的。

下面这个解释比较好:

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。
因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。
参考:https://www.jianshu.com/p/626...

2、Redis 不仅仅是单线程

一般来说 Redis 的瓶颈并不在 CPU,而在内存和网络。如果要使用 CPU 多核,可以搭建多个 Redis 实例来解决。

其实,Redis 4.0 开始就有多线程的概念了,比如 Redis 通过多线程方式在后台删除对象、以及通过 Redis 模块实现的阻塞命令等。

来源官方的解释:

如果你能说到这里,对 Redis 单/多线程的理解也有你自己更多的认识了。

另外,前些天 Redis 6 正式发布了,其中有一个是被说了很久的多线程IO:

这个 Theaded IO 指的是在网络 IO 处理方面上了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。

所以,你要是再把 Redis 6.0 网络处理多线程这块回答上了,你也不至于 "请回" 了。

之前有的人在后台和我杠精说:Redis 6 不是还没发布吗?

Redis 6 Beta 版本多线程这个说了多久了,作为一个程序员,如果这个还不能 get 到的话,那就有点 OUT 了,如果确实没听说还好,如果听说了,还要和我杠精,我就无言以对了,对于新技术的发展和学习不就是我们和面试官的谈资吗?

3、为什么网络处理要引入多线程?

之前的段落说了,Redis 的瓶颈并不在 CPU,而在内存和网络。

内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络 IO 的读写在 Redis 整个执行期间占用了大部分的 CPU 时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。

网上也有对 Redis 单/多线程情况下的 get/set 操作性能做了对比:

参考:https://blog.csdn.net/weixin_...

从上面的性能测试图来看,多线程的性能几乎是单线程的两倍了,从该文章来看,这个只是简单的针对多线程性能的验证,并没有做很多严谨的测试,不能作为线上指标参考。

但可以知道的是,Redis 在网络处理方面上了多线程确实会让 Redis 性能上一个新台阶,不过 Redis 6.0 刚发布,不可能有企业马上上生产环境,可能还需要一段时间的优化和验证,我们再期待吧。

最后,目前最新的 6.0 版本中,IO 多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数,有兴趣的研究下吧。

总结

这篇文章只是对 Redis 单线程/多线程有个基本的认识和总结,吊打面试官可能还说不上,但是在面对面试官提问的时候,不要只是单纯的说单线程,你要回答的还要比这个更多。

对于这个问题,你还有什么见解呢?欢迎留言分享哦~

最后,关注微信公众号:Java技术栈,在后台回复:吊打,可以看往期吊打面试官系列,持续更新哦。

推荐去我的博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

觉得不错,别忘了点赞+转发哦!

查看原文

赞 6 收藏 2 评论 0

lifei6671 赞了文章 · 2020-04-30

StackOverflow 上面最流行的 7 个 Java 问题!

StackOverflow发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。

这篇文章是在我们审阅了StackOverflow上最流行的Java问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。

一、分支预测

问题链接:

https://stackoverflow.com/que...

StackOverflow上最多投票的一个Java问题是:为什么处理一个排序数组要比非排序数组快的多

为了回答这个问题,你需要使用分支预测(branch prediction)。分支预测是一种架构,旨在通过在真实的路径发生前猜测某一分支的下一步来提升处理过程。

分支在这里即一个if语句。这样的话,如果是一个排序数组,那么分支预测将会进行,否则不会进行。

StackOverflow上的一个回答者,链接:

http://stackoverflow.com/ques...

试图使用铁路和火车来简单介绍这个概念。假设你在铁轨连接处要决定火车要走哪条路,你会选择左边还是右边?

你可以拦住火车,然后问司机该往哪里,但是这样会让整个过程变慢。因此你只能去猜正确的方向,那么如何去猜呢?最好的办法就是通过观察目前这个火车每次经过时的路线,推测出正确的方向。

这就是分支预测:识别模式并使用它。

不幸的是,这个问题的提问者是分支预测失败的受害者。因为他的分支没有任何可以识别出的模式,所以预测出的行为是随机的。

二、Java中的安全

问题链接:

http://stackoverflow.com/ques...

另一个流行的Java问题是:为什么在Java中有关密码的地方更加喜欢使用char[]而不是String?其实原始的问题更加具体一些,就是问的在Swing中,password控件有一个getPassword方法(返回char[]而不是getText()返回的String)。

其实这里不用惊讶-这是一个安全问题。String是不可变的,意味着一旦它被创建了,那么你就不可能去修改它。

这也意味着在GC之前,你对这些数据不能做任何处理。因此,只要有人能够访问你的内存,那么String就有可能被他获取到。

这也就是为什么要使用char数组。你可以显示地清除数据或者覆盖它。这样密码这种敏感数据即使GC还没有进行也不会再在系统留下痕迹。另外,关注微信公众号:Java技术栈,在后台回复:Java,可以获取我整理的 N 篇 Java 教程,都是干货。

三、异常

问题链接:

http://blog.takipi.com/the-to...

即使很多开发者倾向于忽略对受检异常的处理,StackOverflow上仍然有很多关于异常的问题。

其中一个最流行的问题是:什么是NullPointerException,我该怎么处理它?对此,我们并没有感到惊讶,因为这个问题也是在生产环境的Java应用中排名第一的异常。

实际上,当NullPointerException(或者其他exception)在系统出现的时候,我们可以发出一个告警。因为这种异常一般情况下都是业务代码逻辑有问题造成(笔者注)。

四、为什么这段代码使用随机字符串打印出了”hello world”

问题链接:

http://stackoverflow.com/ques...

这个问题给出了下面的代码,并打印出了”hello world”:

public static String randomString(int i){
    Random ran = new Random(i);
    StringBuilder sb = new StringBuilder();
    while (true){
        int k = ran.nextInt(27);
        if (k == 0)
            break;
        sb.append((char)('`' + k));
    }
    return sb.toString();
}

其实,选择一组随机的整数并不是随机的。给定一个seed参数(在这个例子中是-229985452和-147909649), 那么每次随机,同样的seed则会产生同样的输出。

Random(-229985452).nextInt(27)产生的前六个数字:8, 5, 12, 12, 15, 0

Random(-147909649).nextInt(27)产生的前六个数字:23, 15, 18, 12, 4, 0

这样,最终输出的就是”hello world”。

五、为什么两个时间戳相减(in 1927)得出一个奇怪的结果?

问题链接:

http://stackoverflow.com/ques...
public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String str3 = "1927-12-31 23:54:07";
    String str4 = "1927-12-31 23:54:08";
    Date sDt3 = sf.parse(str3);
    Date sDt4 = sf.parse(str4);
    long ld3 = sDt3.getTime() /1000;
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

按说上面的代码最后的结果应该是1,但实际的输出却是353。其实,这是一个时区的问题。

1927年12月31号24:00,上海时间往回调整了5分钟52秒,因此”1927-12-31 23:54:08”发生了两次,Java将后面一次实例化成了本地的这个时间。因此和前一秒的差距成了353。

我们需要指出,如果你试着来运行这段代码,结果并不一定是353。Jon Skeet指出了这一点,链接:

http://stackoverflow.com/a/68...

在时区数据库项目2014版中,这个改变的时间点改到了1900-12-31,因此成了344秒的差距。另外,关注微信公众号:Java技术栈,在后台回复:Java,可以获取我整理的 N 篇 Java 教程,都是干货。

六、无法被捕获的ChuckNorrisException

问题链接:

http://stackoverflow.com/ques...

这里有一个很明显的问题:如果有exception被抛出,但是没有任何办法去catch,那么应用会崩溃吗?或者如这个问题所问:是否可以写一段Java代码让一个假设的java.lang.ChuckNorrisException无法被捕获。

答案是可以,但是这里有一个”但是”。你可以编译一段代码抛出一个ChuckNorrisException,但是在Runtime时动态生成一个并不继承于Throwable接口的ChuckNorrisException类。当然,为了让这个过程可以进行,你需要关闭掉字节码验证。jtahlborn给出了完整的解决办法。链接:

http://stackoverflow.com/a/13...

七、哈希表

哈希表是另外一个在StackOverflow上流行的问题系列。许多用户都想要知道所有集合类之间的区别,什么时候该使用哪种集合。

迭代顺序是主要考虑的因素。使用HashMap则忽略了所有的顺序信息,也就是获取元素的顺序和你插入元素的顺序是没有任何关系的;使用TreeMap则会得到一个排序好的迭代集合;使用LinkedHashMap则是一个FIFO的顺序。

如果你还是对这些感到困惑,这里有一个相关说明的图表可以参考(Rebel Labs制作。链接:

http://zeroturnaround.com/wp-...

八、总结

对于Java,其实关键的不在于你懂多少,而是在于你可以一直学到更多的东西。

StackOverflow不仅在code上的一些问题可以帮助我们,也有助于我们回过头来去深入地学习一些我们已经知道的知识。

原文:https://dwz.cn/Boy5tcHJ
译文:https://dwz.cn/j1hgReGd

推荐去我的博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

觉得不错,别忘了点赞+转发哦!

查看原文

赞 3 收藏 1 评论 0

认证与成就

  • 获得 150 次点赞
  • 获得 16 枚徽章 获得 1 枚金徽章, 获得 1 枚银徽章, 获得 14 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

  • Golang验证码生成类库

    Golang实现的图片验证码生成类库

  • SmartWiki

    SmartWiki是一款针对IT团队开发的简单好用的文档管理系统。 可以用来储存日常接口文档,数据库字典,手册说明等文档。内置项目管理,用户管理,权限管理等功能,能够满足大部分中小团队的文档管理需求。

  • MinDoc

    MinDoc 是一款针对IT团队开发的简单好用的文档管理系统。 可以用来储存日常接口文档,数据库字典,手册说明等文档。内置项目管理,用户管理,权限管理等功能,能够满足大部分中小团队的文档管理需求。

注册于 2016-01-04
个人主页被 1.8k 人浏览