白嫖党最爱!非科班程序员求职经历分享,小白也能看明白_普通网友的博客-程序员秘密

技术标签: 程序员  经验分享  面试  java  

前言

当你准备跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是两个字——凉凉!而在如今的市场,什么多线程、高并发、分布式、负载均衡、集群、微服务等等等等,都可说是Java高级后端开发求职的必备技能。

image

2021的春招可以说也是完美收官,前段时间收到字节跳动的面试邀请,虽有点震惊,但却依旧保持平常心去对待,结果一不小心就吊打了面试官

什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。

普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个的顺序执行,否则会出现并发问题。

如何控制呢?就是设置一个各个线程都能看的见的标志。然后,每个线程想访问临界区域时,都要先查看标志,如果标志没有被占用,则说明目前没有线程在访问临界区域。如果标志被占用了,则说明目前有线程正在访问临界区域,则当前线程需要等待。

这个标志,就是锁。

在单机多线程的java程序中,我们可以使用堆内存中的变量作为标志,因为多线程是共享堆内存的,堆内存中的变量对于各个线程都是可见的。

讲明白了普通的锁,接下来,我们再看看分布式锁。

在分布式环境下,即多台计算机,每个计算机上会启动jvm执行程序的运行环境下,如果不同计算机上的线程想访问临界区域时,该怎么办呢?

前面普通锁的使用堆内存中的变量的方式肯定不适用了。因为在多机环境下,某台计算机上的堆内存中的变量对于其他计算机上的线程肯定是不可见的。那么,根据锁的本质和原理,我们就要找到另外的对于多机上的线程都可见的标志,以它来作为锁,就可以了。这样的锁,就是分布式锁。

当然,这里只是解释了什么是分布式锁,至于分布式锁该如何实现,其实有多重方式,关键在于要保证锁对多机上的程序是可见的即可。一些常用的实现方式是,使用redis,使用数据库等等。

为什么要使用分布式锁

我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!

注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!

分布式锁应该具备哪些条件

在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:

  • 1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;

  • 2、高可用的获取锁与释放锁;

  • 3、高性能的获取锁与释放锁;

  • 4、具备可重入特性;

  • 5、具备锁失效机制,防止死锁;

  • 6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

分布式锁的三种实现方式

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。

  • 基于数据库实现分布式锁;

  • 基于缓存(Redis等)实现分布式锁;

  • 基于Zookeeper实现分布式锁;

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

资料领取方式:蓝色传送门

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南
1623055390862)]

计算机网络基础专题

[外链图片转存中…(img-pdrZvoya-1623055390863)]

设计模式专题

[外链图片转存中…(img-Yzgkpsdu-1623055390864)]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_57285455/article/details/117666965

智能推荐

VC++实现TCP服务器_luanbin的博客-程序员秘密

(一)介绍:  本文主要采用Winsock API实现了一个Tcp服务器。对初学者而言,相当实用。 (二)准备工作:  1、使用VC6向导建立控制台工程(console application),并选择支持MFC。  2、在stdafx.h中加入头文件conio.h和winsock2.h。  3、在头文件中加入:#pragma comment(lib, "ws2_32.lib")。  (三)主

HIVE日期格式转换大全_Sunshine~L&H的博客-程序员秘密

1.日期函数UNIX时间戳转日期函数: from_unixtime语法:from_unixtime(bigint unixtime[, stringformat]) 返回值: string说明: 转化UNIX时间戳(从1970-01-0100:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive> select from_unixtime(1523308977,'...

模型评估_Kyrie_Irving的博客-程序员秘密

模型评估详细参考1.分类度量:sklearn.metrics模块实现了几种损失函数、评分函数和功能函数来测量分类性能。 某些指标可能需要正例,置信度值或二进制决策值的概率估计。 大多数指标应用的是:通过sample_weight参数,让每个样本为总分提供加权贡献。其中一些仅限于二进制分类案例:还有一些仅限于多分类情形:还有一些可用于多标签情形:而且许多是用于二分类和多标签问题的...

substring、substr、slice与splice的区别_AntonA的博客-程序员秘密

列举一道面试题目,例如:var a="get-element-by-id"让用函数转换为getElementById.根据这个面试题来说一下这几个的区别吧。1. 关于substring()substring(start,stop),表示截取字符串,从start开始到stop处之间的新字符串,长度是stop减start,新字符串包含start不包含stop,但是不修改原字符串,这一点...

Mosquitto常用命令_nuc_baixu的博客-程序员秘密_mosquitto 指令

1 mosquitto服务器的搭建 服务器这里使用了阿里云的服务器,mosquitto默认需要1883的TCP入端口。需要在安全策略里设置一下。端口当然也可以选其他端口进行配置。服务安装# 服务器终端安装mosquitto和mosquitto-clients,后者是一些客户端,方便我们测试用sudo apt install mosquitto mosquitto-clients服务状态查看sudo systemctl status mosquitto客户端监听# ...

利用c语言中printf输出图形_DMeursault的博客-程序员秘密_用printf输出图形

c语言中利用printf输出图形通过对c语言中printf的使用,我根据自己对*符号的排版利用dev c++编译出了一个菱形的图案。感受到了通过高级程序语言输出自己构建的内容的乐趣。在这个过程中,计算机通过对程序运行的及时反馈让我被深深吸引,对今后的编程学习充满了期待。...

随便推点

lwip TCP客户端 tcp_connect函数源码解析_郭忠伟-写录的博客-程序员秘密_lwip_connect

lwip TCP客户端 tcp_connect函数源码解析原型: struct tcp_pcb * tcp_new (void)原型: err_t tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)控制块连接 对于客户端程序来说,需要执行主动打开操作,就是向

openstack中Nova组件servers的所有python API 汇总_weixin_33883178的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

嘉明的C学习之Day4--混合运算scanf读取标准输入原理_Zcymatics的博客-程序员秘密_c 读取标准输入

字符串型常量字符串型常量是由一对双引号括起来的字符序列。例如,“How do you do.”、“CHINA”、 “a"和”$123.45"是合法的字符串型常量,我们可用语句 printf(“How do you do.”)输出 一个字符串。但要注意的是,'a’是字符型常量,而"a"是字符串型常量,二者是不同的。注意:1. 如果先用语句 char c 定义字符型变量 c,后令 c="a"或 c=“CHINA”,那么这样的 赋值都是非法的,原因是不可以将字符串型常量赋值给字符型变量。C 语言中没有定义

如何利用正则表达式限制输入0到100的数(js)_Cansluck的博客-程序员秘密_正则0到100的整数

之前做项目,在js里需要做一个判断,需要判断输入的数只能限制在0-100(包含)的百分比数。这个网上百度了很多的答案,结果很多都是1-99之类的,很蛋疼。现在做一个总结吧。var reg = new RegExp("^(\\d|[1-9]\\d|100)$");var testNum = 101;if(!reg.test(testNum)) { alert("请输入0

springboot集成微信支付_你是人间五月天的博客-程序员秘密_springboot微信支付

一、先去微信申请相应的appid等,然后在yml文件增加相应配置pay: wxpay: appID: ****** mchID: ***** key: ***** notifyUrl: ***** appSecret: *****建立配置类:@ConfigurationProperties(prefix = "pay.wxpay")pub...

Visual Studio2019安装步骤_weixin_30779691的博客-程序员秘密

学校使用的版本是2012版本,而现在讲的版本是2019版本,差别不大,个人认为2019更能胜任学习任务。另外VS2019是完全免费的,版本越高越好了!毕竟C++都出了C++20对吧。Step 1:访问网站:https://visualstudio.microsoft.com/zh-hans/downloads/?rr=https%3A%2F%2Fwww.baidu.com%...