面试经历(代码片段)

linyukun linyukun     2023-01-13     464

关键词:

今天算是第一次技术面,真是一塌糊涂,各种问题答不上来,没有条理,我都感觉在浪费人家面试官的时间,然而面试官真是非常nice啊,还给了我一些建议。记录下今天面试碰到的一些问题,面试过不过是一方面,主要是不能接受自己这么菜啊。

面试的第一个问题是说说java.util下用过的类或者包,面试完后我想当时应该说的是集合相关的,然而当时不知道怎么说了concurrent这个并发包,关键平时没怎么用过对它也并不了解啊,唉!!也好,系统地了解一下java.util包下相关的类和子包吧。

java.util是Java的一个实用工具类库包,包中包含集合框架,collection类,事件模型,日期和时间,国际化和各种实用工具类。查了一下JDK的API文档,列举了一些java.util下常用的类、接口、子包:

技术分享图片 内容比较多,有些是已经了解过了,有些等以后再做详细了解吧。

第二个问题是数据库的锁机制,关于数据库的锁机制只是零零散散地知道一些,没有系统地了解,面试的时候也说不出个所以然啊。那就系统地了解一下数据库的锁。

先说说为什么数据库需要锁?数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性(脏读,不可重复读,幻读等),可能产生死锁。为了解决这些,就需要通过加锁对数据库实现并发控制。举个加锁的例子,当一个执行sql语句的事务想要操作表记录之前,先向数据库发出请求,对你访问的记录集加锁,在这个事务释放这个锁之前,其他事务不能对这些数据进行更新操作。

数据库事务

上面还提到了事务,接着说锁机制之前还要介绍下数据库的事务。事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。举个例子:银行转账,A账户转给B账户10000元,这里存在两个操作,一个是A账户扣款10000元,两一个操作是B账户增加10000元,两者就构成了转账这个事务。要么两个操作都成功,A账户扣款1000元,B账户增加1000元,事务成功;要么两个操作都失败,A账户和B账户金额都没变,事务失败。事务拥有四个特性,即ACID(原子性,一致性,隔离性和一致性)。

上文还说到若不对事务进行并发控制就可能会读取和存储不正确的数据,来看看具体的例子,假设有一个order表,有个字段叫count,作为计数用,当前值为100,

第一类丢失更新(Update Lost):此种更新丢失是因为回滚的原因,所以也叫回滚丢失。此时两个事务同时更新count,两个事务都读取到100,事务一更新成功并提交,count=100+1=101,事务二出于某种原因更新失败了,然后回滚,事务二就把count还原为它一开始读到的100,此时事务一的更新就这样丢失了。

脏读(Dirty Read):此种异常时因为一个事务读取了另一个事务修改了但是未提交的数据。举个例子,事务一更新了count=101,但是没有提交,事务二此时读取count,值为101而不是100,然后事务一出于某种原因回滚了,然后第二个事务读取的这个值就是噩梦的开始。

不可重复读(Not Repeatable Read):此种异常是一个事务对同一行数据执行了两次或更多次查询,但是却得到了不同的结果,也就是在一个事务里面你不能重复(即多次)读取一行数据,如果你这么做了,不能保证每次读取的结果是一样的,有可能一样有可能不一样。造成这个结果是在两次查询之间有别的事务对该行数据做了更新操作。举个例子,事务一先查询了count,值为100,此时事务二更新了count=101,事务一再次读取count,值就会变成101,两次读取结果不一样。

第二类丢失更新(Second Update Lost):此种更新丢失是因为更新被其他事务给覆盖了,也可以叫覆盖丢失。举个例子,两个事务同时更新count,都读取100这个初始值,事务一先更新成功并提交,count=100+1=101,事务二后更新成功并提交,count=100+1=101,由于事务二count还是从100开始增加,事务一的更新就这样丢失了。

幻读(Phantom Read):幻读和不可重复读有点像,只是针对的不是数据的值而是数据的数量。此种异常是一个事务在两次查询的过程中数据的数量不同,让人以为发生幻觉,幻读大概就是这么得来的吧。举个例子,事务一查询order表有多少条记录,事务二新增了一条记录,然后事务一查了一下order表有多少记录,发现和第一次不一样,这就是幻读。

数据库事务隔离级别

数据库事务的并发操作既然会对数据的存取造成这么多影响,那该如何解决?上面各种异常情况都是多个事务之间相互影响造成的,这说明两个事务之间需要某种方式将他们从某种程度上分开,降低直至避免相互影响。这时候数据库事务隔离级别就粉墨登场了,而数据库的隔离级别实现一般是通过数据库锁实现的。

读未提交(Read Uncommitted):该隔离级别指即使一个事务的更新语句没有提交,但是别的事务可以读到这个改变,几种异常情况都可能出现。极易出错,没有安全性可言,基本不会使用。

读已提交(Read Committed):该隔离级别指一个事务只能看到其他事务的已经提交的更新,看不到未提交的更新,消除了脏读和第一类丢失更新,这是大多数数据库的默认隔离级别,如Oracle,Sqlserver。使用写锁(排他锁)来实现。加了写锁,就可以保证读的都是提交之后的数据,但是会造成不可重读,即读的时候不加锁,一个读的事务过程中,如果读取数据两次,在两次之间有写事务修改了数据,将会导致两次读取的结果不一致,从而导致逻辑错误。

可重复读(Repeatable Read):该隔离级别指一个事务中进行两次或多次同样的对于数据内容的查询,得到的结果是一样的,但不保证对于数据条数的查询是一样的,这也是MySql的默认事务隔离级别。在事务中加读锁来实现,在读的时候需要加锁并且保持。

串行化(Serializable):一个事务执行的时候不允许别的事务并发执行.完全串行化的读,只要存在读就禁止写,但可以同时读,消除了幻读。这是事务隔离的最高级别,虽然最安全最省心,但是效率太低,一般不会用。它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

终于说到锁了,上文提到数据库使用锁来实现对并发事务的控制,下面来说说锁的分类及其机理。

数据库锁一般可以分为两类,一个是悲观锁,一个是乐观锁

    乐观锁一般是指用户自己实现的一种锁机制,假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。乐观锁的实现方式一般包括使用版本号和时间戳。对于读操作远多于写操作的时候,大多数都是读取,这时候一个更新操作加锁会阻塞所有读取,降低了吞吐量。最后还要释放锁,锁是需要一些开销的,我们只要想办法解决极少量的更新操作的同步问题。可以使用update … where … and version=”old version”这样的语句,根据返回结果是0还是非0来得到通知,如果是0说明更新没有成功,因为version被改了,如果返回非0说明更新成功。

    悲观锁一般就是我们通常说的数据库锁机制,顾名思义,就是很悲观,它对于数据被外界修改持保守态度,认为数据随时会修改,所以整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系数据库提供的锁机制,事实上关系数据库中的行锁,表锁不论是读写锁都是悲观锁。

悲观锁按照使用性质划分:

共享锁(Share locks简记为S锁):也称读锁,事务A对对象T加s锁,其他事务也只能对T加S,多个事务可以同时读,但不能有写操作,直到A释放S锁。

排它锁(Exclusivelocks简记为X锁):也称写锁,事务A对对象T加X锁以后,其他事务不能对T加任何锁,只有事务A可以读写对象T直到A释放X锁。InnoDB引擎默认的修改数据语句,update,delete,insert 都会自动给涉及到的数据加上排他锁,select 语句默认不会加任何锁类型。如果加排他锁可以使用select ...for update 语句,加共享锁可以使用select ... lock in share mode语句。

更新锁(简记为U锁):用来预定要对此对象施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的对象将要被更新时,则升级为X锁,主要是用来防止死锁的。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个对象申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。

悲观锁按照作用范围划分:

行锁:锁的作用范围是行级别,数据库能够确定那些行需要锁的情况下使用行锁,如果不知道会影响哪些行的时候就会使用表锁。

表锁:锁的作用范围是整张表。

找了张图来表示数据库各种锁之间的关系:

技术分享图片

转载数据库面试经历(代码片段)

 一、MySQL1、mysql如何做分页mysql数据库做分页用limit关键字,它后面跟两个参数startIndex和pageSize2、mysql引擎有哪些,各自的特点是什么?http://www.cnblogs.com/ctztake/p/8453990.html3、数据库怎么建立索引createindexaccount_indexon`tablename`(`... 查看详情

一位小伙的奇葩经历:面试华为居然也能被pua(代码片段)

上一篇:当程序员们决定去考公分享一位秋招面试华为,结果遇到”垃圾“主管(计算产品部门)的同学的求职经历,估计有很多同学在面试的时候也经历过类似的情况。不过,需要声明的一点是:并... 查看详情

[20161108]校招面试题被虐经历总结(代码片段)

...拿到心意公司的offer……sad!今天还被虐了,不过面试失败没关系,重点学到了知识。现在就把不会的面试题总结一下。^^一、有两台服务器,一台在美国,一台在中国。中国是原数据,美国的是数据备份... 查看详情

面试现场亲身经历,直击58同城一面,面经分享(代码片段)

...c;大家好,这周参见了58同城的一二面在这里还原一下面试现场,顺便分享面试经验本期是一面点赞收藏准备好,都是干货投递简历一条是在Boss直聘上投的简历,一开始显示的是安居客,原因小伙伴们可以思考... 查看详情

上海大厂java面试经历:javajdk安装步骤(代码片段)

4步套路,解决动态规划问题1、确定问题状态提炼最后一步的问题转化2、转移方程,把问题方程化3、按照实际逻辑设置初始条件和边界情况4、确定计算顺序并求解结合实例感受下:你有三种硬币,分别面值2元... 查看详情

java九九乘法表编程,面试经历分享(代码片段)

锁种类Mysql中锁的分类按照不同类型的划分可以分成不同的锁,按照**「锁的粒度」划分可以分成:「表锁、页锁、行锁」;按照「使用的方式」划分可以分为:「共享锁」和「排它锁」;按照思想的划分:... 查看详情

面试必问|一个线程从创建到消亡要经历哪些阶段?(代码片段)

大家好,我是冰河~~在【精通高并发系列】中的《高并发之——线程与多线程》一文中,我们简单介绍了线程的生命周期和线程的几个重要状态,并以代码的形式实现了线程是如何进入各个状态的。今天,我们就... 查看详情

论一个app从启动到主页面显示经历的过程?(代码片段)

...进阶的一些知识总结,涉及到的知识点比较杂,不过都是面试中几乎常问的知识点,也是加分的点。关于这部分内容,可能需要有一些具体的项目实践。在面试的过程中,结合具体自身实践经历,才能更加深入透彻的描绘出来。... 查看详情

java培训班出来之后的面试经历,很难!!(代码片段)

...流群👇👇今天分享一位同学从培训班出来之后的面试经历。下面是正文。个人情况本人化工专业毕业,专科学历。经过某培新机构转行做java。刚培训出来,经过培训机构的推荐到一家公司就职三个月(转正... 查看详情

巨人网络面试经历(代码片段)

首先是简历面然后再就是笔试一个计算机系统的虚拟内存最大容量是由()确定的A:硬盘容量B:内容容量和硬盘容量之和C:计算机字节化D:内存容量#defineMOD(x,y)x%yinta=13,b=94;在空格处填写一个运算符,使得等式结果为TRUEMOD(b,a_2)=... 查看详情

2023秋招——快手数据研发一二面面经(代码片段)

🌼今天来总结一下快手数据研发的一、二面,在面试中进步,在总结中成长!对往期内容感兴趣的小伙伴可以参考下面👇:链接:2022暑期实习字节跳动数据研发面试经历-基础数仓.链接:2022百度大数据开发... 查看详情

2023秋招——快手数据研发一二面面经(代码片段)

🌼今天来总结一下快手数据研发的一、二面,在面试中进步,在总结中成长!对往期内容感兴趣的小伙伴可以参考下面👇:链接:2022暑期实习字节跳动数据研发面试经历-基础数仓.链接:2022百度大数据开发... 查看详情

2023秋招——大数据研发工程师提前批一面(代码片段)

🌻最近在准备秋招,又到了面试的环节,我将会对秋招面试的问题进行一系列的复盘,在面试中一点一点成长。对往期内容感兴趣的小伙伴可以参考下面👇:链接:2022暑期实习字节跳动数据研发面试经历-... 查看详情

2023秋招——大数据研发工程师提前批一面(代码片段)

🌻最近在准备秋招,又到了面试的环节,我将会对秋招面试的问题进行一系列的复盘,在面试中一点一点成长。对往期内容感兴趣的小伙伴可以参考下面👇:链接:2022暑期实习字节跳动数据研发面试经历-... 查看详情

2023秋招——大数据研发工程师提前批一面(代码片段)

🌻最近在准备秋招,又到了面试的环节,我将会对秋招面试的问题进行一系列的复盘,在面试中一点一点成长。对往期内容感兴趣的小伙伴可以参考下面👇:链接:2022暑期实习字节跳动数据研发面试经历-... 查看详情

我经历的字节跳动后台开发实习二面,面试官说叫我补补操作系统和算法(代码片段)

因为热爱所以坚持,因为热爱所以等待。熬过漫长无戏可演的日子,终于换来了人生的春天,共勉!!!在一面过了9天之后开始了,二面,这一次不同,是一个看起来就,嗯,看起来就... 查看详情

java面试题库(长期)(代码片段)

本文内容来自互联网各种面试实例,以及自己的面试经历,主要是中级开发的面试题初中级java面试主要分为几个部分:0、序1、java基础2、java多线程3、jvm知识4、spring等框架知识5、常用实践,如session同步6、其他知识,例如tomcat7... 查看详情

记一次hashmap面试(代码片段)

记一次HashMap面试从网上已经身边同事朋友的面试情况来看,面试HashMap几乎是必问的,网上也很多类似的文章,但是真面起来,发现还是有很多点可以深抠的。本篇就结合一次面试经历说一下之前没有注意的点吧。HashMap的底层结... 查看详情