编程,又被称作“写代码”。这个说法有可能会带来一点点误解,让人觉得如何“写”是学习编程要解决的主要问题。但事实并非如此。...尽管最终代码要在键盘上敲出来,但这个过程在开发中的实际时间占比可能要远远小于你的预期。编写之前的设计,编写之后的调试,以及阅读他人的代码,这些会花费比“写”更多的时间。...否则没有标杆,仅凭自己闷头写,往往事倍功半。 2. 提高 debug 能力。对代码的阅读,本身就是一种能力,是需要练习积累的。只有能看懂代码,你才能快速准确地定位代码中的问题。 3. 良好的代码风格。...更进一步,你甚至可以通过阅读代码参与到一些开源项目,与高手交流。 如何读代码 既然读代码是有益且必要的,那么该如何读代码呢?这里给几点建议: 1. 有目的的阅读。...很多同学跟我说过,代码能看懂,就是自己写不出来。实际上,我觉得就是没看懂:你只是看懂了每一行代码的意思,但并没有理解整个代码的设计。从简单的代码做起,重复这样的过程。
来源:https://blog.csdn.net/qq_38306425/article/details/109332045 面试官:你好,你先做个自我介绍吧 某人:面试官你好,我叫开局一张嘴面试全靠吹...面试官微微一笑,捋了捋稀疏的头发:看你简历,你精通多线程?那你手写过堵塞队列吗? 某人心里出现一万个问号,堵塞队列是啥玩意?平时基本都是crud,顶多用多线程跑数据 ? 某人:没有手写过。...面试官:哦,那你说下堵塞队列吧 某人支支吾吾:这个有点忘了 面试官:没事,那我们下一个。 此处省略一万字。 面试官扭了扭严重负荷的颈椎:先到这里吧,你先回去等通知。 某人:好的。...3.DelayQueue:DelayQueue是基于优先级的一个无界队列,队列元素必须实现Delayed接口,支持延迟获取,元素按照时间排序,只有元素到期后,消费者才能从队列中取出。...5.手写堵塞队列 我是参照了ArrayBlockingQueue的源码写的,欢迎大家斧正。
非公平下的读锁应该插队吗? 首先读写锁也是可以设置公平非公平的。具体可以这样设置:「公平锁在构造传入 true,否则传 false。啥也不传,默认的是非公平锁」。...现在狗哥和小钊两个读线程同时读取,写线程 1 想要写入,但是由于已经有两个读线程持有锁了,只能去队列等待。这时,小民这个读线程想插队获取读锁。...「PS:由于写锁是独占锁,当前线程获取写锁之后,其它线程就既不能获取写锁也不能获取读锁了,但是当前已经获取写锁的线程仍然可以获取读锁」。 为什么需要锁的降级? 你可能会说,写锁既能修改、又能读取。...非公平策略下: 为了防止 “饥饿”,在等待队列的头结点是尝试获取写锁的线程的时候,不允许读锁插队。...5、升降级策略 升降级策略:只能从写锁降级为读锁,不能从读锁升级为写锁。 巨人的肩膀 https://kaiwu.lagou.com/course/courseInfo.htm?
微软历史 微软这个公司的编年史小编在这里不想多说了,想必大家应该都听说过很多故事:它诞生于70年代,从90年代末全胜时期一统江湖的霸主,到今天这个拥有10万+员工的全球化公司,不得不说,还是一个非常伟大的公司...大家有兴趣可以读一读吴军博士的「浪潮之巅」,微软也是其中浓墨的一笔。...或者由于某些原因来了微软之后,整天唉声叹气,觉得「a big fish falls into a small pond」, 真的是这样的吗?...你懂了c#再去看java只会觉得java很简单,是个c#的真子集;你懂了CLR看JVM基本差不多;你熟悉了typescript再去看coffeescript, es6;你弄了一堆powershell再去看各种...小编也不知道,也许把胡子剃干净了,装嫩混入年轻人队伍就好啦 :-D 权力的游戏 当然,你以为微软大家都在做技术吗?工程师码农就是写代码搬砖吗?至少在小编看来微软不是的。
可以,队列就是:你可以指定这个环形缓冲区里每一个元素多大,有多少个元素。...假设读到了一个数据,头、尾就是这样的: 这时候如果我再写一个数据,头和尾就是这样的: 对于队列操作,我们一般来说是往尾部上写数据, 但是你也可以说:我这个数据比较着急处理,我可以写到头部去。...我们再来看看任务1,任务2读不到数据就休息了,任务1写数据后发生了什么事? task1写队列,会去队列的这个链表:xTasksWaitingToReceive,挑出一个任务把它唤醒?...问: 写队列,如果这个任务的优先级最高,会立即唤醒吗? 答: 假设task2读队列,因为没有数据正在休眠, task1写队列, task2优先级比task1高, task2会立刻被唤醒、立刻执行。...问: 一个任务想去读队列,但是队列里没有数据,就休眠,这个休眠的时间可以选择吗? 答: 可以选择。 0:没有数据我就返回一个错误,即刻返回。
如果你的业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库即可,这时你的架构模型是这样的: 但随着业务量的增长,你的项目请求量越来越大,这时如果每次都从数据库中读数据,那肯定会有性能问题...之后的读请求读到的都是旧数据,只有当缓存「失效」后,才能从数据库中得到正确的值。 这时用户会发现,自己刚刚修改了数据,但却看不到变更,一段时间过后,数据才变更过来,对业务也会有影响。...可见,先删除缓存,后更新数据库,当发生「读+写」并发时,还是存在数据不一致的情况。...到这里你可能会问,写消息队列也有可能会失败啊?而且,引入消息队列,这又增加了更多的维护成本,这样做值得吗?...(符合我们重试的场景) 至于写队列失败和消息队列的维护成本问题: 写队列失败:操作缓存和写消息队列,「同时失败」的概率其实是很小的 维护成本:我们项目中一般都会用到消息队列,维护成本并没有新增很多 所以
并发写到加锁队列后由一个线程处理 于是在gateway层,多个用户线程同时写消息时,会去争抢某个socket_fd对应的队列,抢到锁之后就写数据到队列。...读TCP Socket是线程安全的吗? 在前面有了写socket是线程安全的结论,我们稍微翻一下源码就能发现,读socket其实也是加锁了的,所以并发多线程读socket这件事是线程安全的。...单线程读socket_fd后写入加锁队列 读写UDP Socket是线程安全的吗? 聊完TCP,我们很自然就能想到另外一个传输层协议UDP,那么它是线程安全的吗?...会有一样的问题吗? 我们跟TCP对比下,大家就知道了。 TCP不能用多线程同时读和同时写,是因为它是基于数据流的协议。 那UDP呢?它是基于数据报的协议。...虽然线程安全,但依然不建议你这么做,因为TCP本身是基于数据流的协议,一份完整的消息数据可能会分开多次去写/读,内核的锁只保证单次读/写socket是线程安全,锁的粒度并不覆盖整个完整消息。
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。...就只是让你简单的说说事务的基本概念吗?基本概念相信是个学过数据库的小学生都会,面试官为什么会问你这个问题呢?此时,你需要揣测面试官的心理。...此时的面试官其实想问你的不久是事务的基本概念,而且他也想让你说出事务的特性,也就是四大属性。这才是这个问题的核心所在! 对于第二个问题:并发事务会带来哪些问题呢?就只是想问一下会带来哪些问题吗?...以下四种不同的隔离级别限制由低到高,性能从高到底。 读未提交 读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。...这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。 可避免 脏读、不可重复读, 不可避免 虚读。MySQL采用可重复读。
那么,socket是并发安全的吗?能让这多个线程同时并发写吗? 并发读写socket 写TCP Socket是线程安全的吗? 对于 TCP,我们一般使用下面的方式创建 socket。...读TCP Socket是线程安全的吗? 在前面有了写 socket 是线程安全的结论,我们稍微翻一下源码就能发现,读socket其实也是加锁了的,所以并发多线程读 socket 这件事是线程安全的。...单线程读 socket_fd 后写入加锁队列 读写UDP Socket是线程安全的吗? 聊完 TCP,我们很自然就能想到另外一个传输层协议 UDP,那么它是线程安全的吗?...会有一样的问题吗? 我们跟TCP对比下,大家就知道了。 TCP不能用多线程同时读和同时写,是因为它是基于数据流的协议。 那UDP呢?它是基于数据报的协议。...虽然线程安全,但依然不建议你这么做,因为TCP本身是基于数据流的协议,一份完整的消息数据可能会分开多次去写/读,内核的锁只保证单次读/写socket是线程安全,锁的粒度并不覆盖整个完整消息。
分为两类: 第一类:启动、停止、设置定时器: 在上图里面,左边的各种函数:实质都是写一个队列 右边的任务,去读这队列,根据队列的数据:来启动、停止、设置定时器 第二类: 怎么判断定时器是否超时?...: 1.其他任务调用xTimerStart,实际上是写队列 2.定时器任务:读队列 3.根据队列数据,把定时器放入链表 定时器的函数什么时候被调用?...问: 调用"start"函数 执行"start"函数写队列 唤醒定时器任务 处理"start命令"启动定时器吗? 还是说执行"start"函数定时器立即启动? 答: 1.什么叫做启动定时器?...你没有理解到多任务的实质:你仍然以轮询的方式来思考 1.读队列:读、等待、有数据就返回,或者超时返回 2.读链表?...老师我可以这样理解吗 答: 管理定时器的函数是任务:比如xTimerStart只是函数,不是任务 xTimerStart进行写队列操作,它只是写队列。
实际就是消息队列如何保证幂等性 数据库中出现脏数据 ( 1)比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update一下好吧 (2)比如你是写redis,那没问题了...线程池阻塞队列有哪几种? LinkedBlockingQueue SynchronousQueue DelayedWorkQueue 优先队列了解吗?优先队列底层实现机制?...而读写锁(ReadWriteLock)在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。 AQS里的setState()是什么时候调用? 讲一下锁的升级策略?...提交读,未提交读,可重复读,串行读 隔离级别的话是体现事务的隔离性和会出现的问题 幻读是什么?RR隔离级别能解决幻读吗?那RR隔离级别是怎么解决幻读的?...当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。 不能,Repeatable Read 你知道间隙锁吗?间隙锁的作用是什么?是怎么解决幻读的?
面试官:能简单聊聊进程间的通信方式吗? 派大星:可以的,主要方式为:管道、命名管道、消息队列、共享内存。 面试官:可以简单介绍一下这些通信方式吗? 派大星:好的。...但是如果管道满了,那么写管道的操作就阻塞了,直到别人读了管道的数据;反之如果管道是空的,那么读操作的管道就阻塞了。...管道是半双工的,就是数据只能流向一个方向,就比如说你架设一个管道,只能一个进程写,一个进程读。...其它的和管道一样:一个进程写,一个进程读。也是半双工。数据只能单向滚动 然后聊聊: 消息队列 Linux的消息队列可以认为是一个链表结构。...面试官:不错,你知道线程见如何切换吗?简单聊聊? 派大星:这个了解一些。简单的讲就是一个进程的多个线程间切换的时候就涉及到了上下文切换。
库存这一块,写数据库的时候,直接更新redis缓存吗?实际上不是,因为没有这么简单。这里,其实就涉及到了一个问题,数据库与缓存双写,数据不一致的问题。...不就是还没更新数据库的就查数据库读到旧数据吗?不就是因为读在更新前面了吗?那我就让你排队执行呗。...如果一个内存队列可能积压的更新操作特别多,那么你就要加机器,让每个机器上部署的服务实例处理更少的数据,那么每个内存队列中积压的更新操作就会越少。...对于单机器,如果有20个内存队列,每个内存队列,可能就积压5个写操作,每个写操作性能测试后,一般在20ms左右就完成。...三、总结 一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,那最好不要上述的串行化的这个方案,因为读请求和写请求串行化,串到一个内存队列里去,这样是可以保证一定不会出现不一致的情况
; – 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令; 完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。...Kafka 那么快吗?...简单聊了下 读未提交、读已提交、重复读、序列化几种情况。...最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。...面试官提问 9:JVM 的垃圾回收机制了解吗? 标记-清楚算法、复制算法、标记-压缩算法、分代收集算法的实现原理。 一、 技术背景你要了解吧 [二、 哪些内存需要回收?]
那还用得着构造函数吗? 经常看到一些初学者在类的下面直接写这样代码. ? 但是又有人会说了.诶, 那么为什么在声明类的字段的时候可以赋值呢?赋值表达式也是1个执行代码啊?为什么这样就不报错呢?...给你看看下面的代码 你就会知道其中的真相了. ? 当我们使用C#编译器将这段代码编译为程序集的时候,看看微软为我们生成的代码吧. ? 展开构造函数,看看这里面有什么蹊跷吧!...关于构造函数当然还不仅仅如此.我们知道在类的构造函数中我们可以写一些任意的代码(前提是符合C#语法啦),在结构体的构造函数中虽然也可以写任意的代码.但是C#语法规定在结构体的构造函数中,必须要为结构体的所有字段赋值...我们完全可以在属性的set块里面什么都不写,如果什么都不写,那么属性还是在操作字段吗?...结构体不能从另外1个结构或者类继承,但是可以实现接口.特殊的是.虽然结构不能从别的类或者结构继承,但是所有的结构都默认从ValueType类继承,ValueType类再从Object类继承.所以结构体对象仍然拥有超类
知乎上有一个热门问题:你的编程能力从什么时候开始突飞猛进? 初看到这个问题,我的嘴角微微上扬。记忆闪回到了2013年,那一年,命运给我了一点点正反馈,我有点喜欢编程了。...这次生产环境事故之后,内心一直有一个声音折磨着我:“ 遇到技术问题的时候,能不能从容一点,不慌乱。其他人可以做到的事,为什么我做不到。”...算奖服务是非常核心的服务,算奖服务包含若干子服务,其中竞彩算奖是用 C# 版本开发的系统。...领导也没有给我指导建议,于是我突发奇想:"生产环境不是有一两年的订单算奖历史数据吗 ?重构版本计算的结果和生产环境计算的结果做个对比,不就可以验证正确率吗?"。...于是,我将代码做了一些微调,将最后对数据的写操作去掉,对比重构版本计算的金额和 c# 版本计算的金额,若金额有差异,订单数据写入到文本中,发送邮件告警。
读和写的时候,都是使用memcpy,那么复制多长的数据呢? 创建队列的时候就指定有每一个元素有多长。 二:队列的休眠和唤醒 下面我们来看看休眠和唤醒的操作。 写队列、读队列的操作是很类似的。...: 图片 这函数就是覆盖的写:要注意,你能使用这个函数,前提是队列的长度只有1。...我们看到了覆盖:写的时候比较特殊, 还有一个操作:读的时候比较特殊。...图片 读的时候,本来应该是这样的,先移动读位置,读到数据: 图片 对于xQueuePeek,他是这样的: 图片 这两个特殊的写操作、读操作,组合起来就可以得到一个“邮箱”。...我们假设在中断里面写队列: 1.写入了数据 2.导致一个优先级非常高的任务从阻塞变为了就绪 3.会马上调度吗? 4.不会,我的中断都还没执行完呢 5.怎么做?
多写一读 再来考虑复杂些的多写一读的场景。...内存模型 看似完美了,真的吗?其实不然。以上还没有考虑内存模型。因为编译器的优化,实际代码执行顺序不一定是你写的顺序。...万一出现共享内存冲突,被别的程序写坏了,就会出现莫名其妙的情况。所以使用mmap指定模块相关的文件路径,就不用太担心了。 需要多读吗?...如果再进一步实现多写多读,需要对read_index也考虑原子操作,加上稍显复杂的block检查跳跃逻辑,实现难度较高。但我们首先该问一个问题,真的需要多读吗?...不要以为你写的代码顺序就是真正的执行顺序,需要考虑内存模型。
a.在结构体中可以声明字段,但是声明字段的时候是不能给初始值的.所以当我们试图这样写代码的时候,C#编译器在将源代码编译成程序集的是会提示语法错误. ?...那还用得着构造函数吗? 经常看到一些初学者在类的下面直接写这样代码. ? 但是又有人会说了.诶, 那么为什么在声明类的字段的时候可以赋值呢?赋值表达式也是1个执行代码啊?为什么这样就不报错呢?...给你看看下面的代码 你就会知道其中的真相了. ? 当我们使用C#编译器将这段代码编译为程序集的时候,看看微软为我们生成的代码吧. ? 展开构造函数,看看这里面有什么蹊跷吧!...关于构造函数当然还不仅仅如此.我们知道在类的构造函数中我们可以写一些任意的代码(前提是符合C#语法啦),在结构体的构造函数中虽然也可以写任意的代码.但是C#语法规定在结构体的构造函数中,必须要为结构体的所有字段赋值...我们完全可以在属性的set块里面什么都不写,如果什么都不写,那么属性还是在操作字段吗?
能举几个例子吗?还有其他的吗? 你觉得自定义控件的方法主要是哪些?...能大致描述下吗? 答:根据对Qt事件机制的分析, 我们可以得到5种级别的事件过滤,处理办法. 以功能从弱到强, 排列如下: 1)重载特定事件处理函数....而不再局限于信号函数和槽函数) *参数可以是 typedef 的或使用不同的namespace specifier *可以允许一些自动的类型转换(即信号和槽参数类型不必完全匹配) 信号槽机制: 能说下你的理解吗...QReadWriteLock类 》一个线程试图对一个加了读锁的互斥量进行上读锁,允许; 》一个线程试图对一个加了读锁的互斥量进行上写锁,阻塞; 》一个线程试图对一个加了写锁的互斥量进行上读锁,阻塞;、...》一个线程试图对一个加了写锁的互斥量进行上写锁,阻塞。
领取专属 10元无门槛券
手把手带您无忧上云