周其仁:停止改革,我们将面临三大麻烦

抛开立场观点不谈,且看周小平写一句话能犯多少语病

罗马尼亚的声明:小事件隐藏着大趋势——黑暗中的风:坚持做对的事相信未来的结果

布林肯突访乌克兰,为何选择去吃麦当劳?

中国不再是美国第一大进口国,贸易战殃及纺织业? 美国进一步延长352项中国商品的关税豁免期

自由微信安卓APP发布,立即下载! | 提交文章网址

王有志

目录:Java面试都问啥?

大家好,我是王有志。这篇文章是《Java面试都问啥?》系列的目录,方便大家快速查看。阶段01:面试数据统计Java面试都问啥?阶段02:并发编程关于线程你必须知道的8个问题(上)关于线程你必须知道的8个问题(中)关于线程你必须知道的8个问题(下)深入理解JMM和Happens-Before一文看懂并发编程中的锁synchronized都问啥?从源码揭秘偏向锁的升级什么是synchronized的重量级锁?关于synchronized的一切,我都写在这里了硬核的volatile考点分析ThreadLocal的那点小秘密一文彻底了解线程池
2月16日 下午 8:17

一文彻底了解线程池

今天的主题是线程池。线程池是面试中必问的八股文,我将涉及到到的问题分为3大类:基础使用线程池是什么?为什么要使用线程池?Executor框架是什么?Java提供了哪些线程池?实现原理线程池的底层原理是如何实现的?创建线程池的参数有哪些?线程池中的线程是什么时间创建的?系统设计如何合理地设置线程池的大小?如果服务器宕机,怎么处理队列中的任务?希望今天的内容能够帮你解答以上的问题。Tips:本文使用Java
2月15日 上午 9:30

ThreadLocal的那点小秘密

大家好,我是王有志。关注王有志,一起聊技术,聊游戏,聊在外漂泊的生活。好久不见,不知道大家新年过得怎么样?有没有痛痛快快得放松?是不是还能收到很多压岁钱?好了,话不多说,我们开始今天的主题:ThreadLocal。我收集了4个面试中出现频率较高的关于ThreadLocal的问题:什么是ThreadLocal?什么场景下使用ThreadLocal?ThreadLocal的底层是如何实现的?ThreadLocal在什么情况下会出现内存泄漏?使用ThreadLocal要注意哪些内容?我们先从一个“谣言”开始,通过分析ThreadLocal的源码,尝试纠正“谣言”带来的误解,并解答上面的问题。流传已久的“谣言”很多文章都在说“ThreadLocal通过拷贝共享变量的方式解决并发安全问题”,例如:这种说法并不准确,很容易让人误解为ThreadLocal会拷贝共享变量。来看个例子:private
1月31日 上午 9:30

硬核的volatile考点分析

大家好,我是王有志。关注王有志,一起聊技术,聊游戏,聊在外漂泊的生活。今天我们学习并发编程中另一个重要的关键字volatile,虽然面试中它的占比低于synchronized,但依旧是不可忽略的内容。关于volatile,我收集到了8个常见考点[1],围绕应用,特点和实现原理。1.volatile有什么作用?2.为什么多线程环境中会出现可见性问题?3.synchronized和volatile有哪些区别?4.详细描述volatile的实现原理(涉及内存屏障)。5.volatile有哪些特性?它是如何保证这些特性的?6.volatile保证线程间变量的可见性,是否意味着volatile变量就是并发安全的?7.为什么方法中的变量不需要使用volatile?8.重排序是如何产生的?本文从volatile应用开始,接着从源码角度分析volatile的实现,通过对原理的剖析尝试解答以上问题。volatile是什么同synchronized一样,volatile是Java的提供的用于并发控制的关键字,不过它们之间也有比较明显的差异。首先是使用方式:synchronized能够修饰方法和代码块volatile只能修饰成员变量能力上volatile也更“弱”一些:保证被修饰变量的可见性禁止被修饰变量发生指令重排我们稍微修改关于线程你必须知道的8个问题(上)中可见性问题的代码,使用volatile修饰变量flag:private
1月30日 下午 4:18

关于synchronized的一切,我都写在这里了

大家好,我是王有志。关注王有志,一起聊技术,聊游戏,从北漂生活谈到国际风云。之前我们已经通过3篇文章由浅到深的分析了synchronized的用法和原理:synchronized的基础:synchronized都问啥?偏向锁升级到轻量级锁:从源码揭秘偏向锁的升级轻量级锁升级到重量级锁:什么是synchronized的重量级锁?还有一篇是关于并发控制中常用锁的设计《一文看懂并发编程中的锁》。可以说是从设计,到用法,再到实现原理,对synchronized进行了全方位的剖析。今天我们就用之前学习的内容解答一些热点题目,全量题解可以猛戳阅读原文。Tips:标题是“抄袭”《一年一度喜剧大赛》作品《梦幻丽莎发廊》[1]的台词。由仁科,茂涛,蒋龙,蒋诗萌和欧剑宇表演,爆笑推荐。synchronized基础篇基础篇的问题主要集中在synchronized用法上。例如:synchronized锁.class对象,代表着什么?synchronized什么情况下是对象锁?什么情况下是类锁?如果对象的多个方法添加了synchronized,那么对象有几把锁?很多小伙伴解答这类问题时喜欢背诸如“synchronized修饰静态方法,作用的范围是整个静态方法,作用对象是这个类的所有对象”这种,相当于直接背结论,忽略了原理。先来回顾下《synchronized都问啥?》中提到的原理:Java中每个对象都与一个监视器关联。synchronized锁定与对象关联的监视器(可以理解为锁定对象本身),锁定成功后才可以继续执行。举个例子:public
2022年12月29日

什么是synchronized的重量级锁?

大家好,我是王有志。关注王有志,一起聊技术,聊游戏,从北漂生活谈到国际风云。鸽了这么久是给自己找到了冠冕堂皇的理由--羊了。说实话发烧那几天真的很难受,根本不想下床,完成日常工作都已经用尽了全部的力气,根本没经历写文章。言归正传,今天我们继续学习synchronized的升级过程,目前只剩下最后一步了:轻量级锁->重量级锁。通过今天的内容,希望能帮助大家解答synchronized都问啥?中除锁粗化,锁消除以及Java
2022年12月23日

重量级锁源码分析

}Tips:Stack-locked状态和Neutral状态的锁膨胀,从原文中看似乎有些差别;偏向锁一口吃不成个“胖子”,无法直接升级成重量级锁。适应性自旋int
2022年12月23日

从源码揭秘偏向锁的升级

大家好,我是王有志。关注王有志,一起聊技术,聊游戏,从北漂生活谈到国际风云。今天开始,我会和大家一起深入学习synchronized的原理,原理部分会涉及到两篇:偏向锁升级到轻量级锁的过程轻量级锁升级到重量级锁的过程今天我们先来学习偏向锁升级到轻量级锁的过程。因为涉及到大量HotSpot源码,会有单独的一篇注释版源码的文章。通过本篇文章,你能解答synchronized都问啥?中统计到的如下问题:详细描述下synchronized的实现原理(67%)为什么说synchronized是可重入锁?(67%)详细描述下synchronized的锁升级(膨胀)过程(67%)偏向锁是什么?synchronized是怎样实现偏向锁的?(100%)Java
2022年12月10日

偏向锁源码分析

偏向锁macroAssembler_x86#biased_locking_enter[1]代码分析的注释版本://
2022年12月9日

synchronized都问啥?

大家好,我是王有志。关注王有志,一起聊技术,聊游戏,从北漂生活谈到国际风云。如果Java面试有什么是必问的,synchronized必定占据一席之地。初出茅庐时synchronized的用法,成长后synchronized的原理,可谓是Java工程师的“一生之敌”。synchronized都问啥?按照惯例,先来看synchronized的常见问题(在线Excel[1]同步更新中,关键词:面试题目):根据统计数据可以总结出synchronized的5大考点:synchronized的使用方式:synchronized是什么?synchronized怎么用?不同用法都有什么效果?synchronized的实现原理:synchronized的特性是如何实现的?synchronized锁升级的原理。今天我们先来看synchronized的基础部分。synchronized是什么?synchronized是Java中的关键字,提供了原生同步机制,实现互斥语义和可见性保证,通常称为互斥锁。互斥指的是,当线程获取到锁后,其它试图获取锁的线程只能阻塞;可见性指的是,synchronized修饰的语句内修改共享变量可以立即被其它线程获取。互斥就意味着,同一时间只有一个线程执行synchronized修饰的代码,那么:无论怎么重排序,都会遵循as-if-serial语义,因此synchronized中不存在有序性问题;不主动释放锁,其他线程无法执行synchronized中代码,无需考虑原子性问题。因此synchronized中互斥就代表了对有序性问题和原子性问题的保证。不过前提是JSR-133[2]中反复提到的correctly
2022年12月6日

一文看懂并发编程中的锁

大家好,我是王有志。关注王有志,一起聊技术,聊游戏,从北漂生活谈到国际风云。相信你经常会听到读锁/写锁,公平锁/非公平锁,乐观锁/悲观锁等五花八门的锁,那么每种锁有什么用呢?它们又有什么区别呢?今天我们就一起聊聊并发编程中的各种锁。关于锁的理论,他们都问什么?问题其实不多,基本上都是围绕着锁的设计理论提问。常见的问题如下:依旧使用图片代替Markdown的表格(在线Excel[1]同步更新中)。计算机中的锁,它到底是什么?引用维基百科中锁[2]的解释:“In
2022年11月27日

深入理解JMM和Happens-Before

大家好,我是王有志。关注王有志,回复Java面试PDF获取文章PDF版本,回复面试题目获取真实Java面试题(更新了JMM的内容)。JMM都问啥?最近沉迷P5R,所以写作的进度很不理想,但不得不说高卷杏[1]YYDS。话不多说,开始今天的主题,JMM和Happens-Before。关于它们的问题并不多,基本上只有两个:JMM是什么?详细描述下JMM。说说你对JMM的理解,为什么要这样设计?Tips:本文以JMM理论为主。JMM是什么?JMM即Java
2022年11月19日

关于线程你必须知道的8个问题(下)

大家好,我是王有志。关注王有志,回复Java面试PDF获取文章PDF版本,回复面试题合集获取Java面试题(同步更新中)。今天我们来学习线程中最后4个问题:线程的同步与互斥线程的本质与调度死锁的产生与解决多线程的是与非通过本篇文章,你可以了解到计算机中经典的同步机制--管程,Java线程的本质与调度方式,如何解决死锁问题,以及为什么要使用多线程。线程的同步与互斥首先来看线程同步[1]与线程互斥[2]的概念,这里引用百度百科中的定义:线程同步:“即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,
2022年11月10日

关于线程你必须知道的8个问题(中)

大家好,我是王有志。关注王有志,回复Java面试PDF获取文章PDF版本,回复面试题合集获取Java面试题(同步更新中)。原计划是今天结束线程的部分,但是写完后才发现,光Thread类的核心方法分析就写了5000多字了,所以不得不再拆出来一篇。在[[02.关于线程你必须知道的8个问题(上)]]我们一起学习了如何创建线程,以及Java中线程状态,那么今天就来学习Thread类的核心方法。Tips:Java及JVM源码基于Java
2022年11月5日

关于线程你必须知道的8个问题(上)

大家好,我是王有志,欢迎来到《Java面试都问啥?》的第一篇技术文章。这个系列会从Java部分开始,接着是MySQL和Redis的内容,同时会继续更新数据结构与算法的部分,这样在第一阶段,我们就完成了面试“三幻神”的挑战。Java的部分从并发编程开始,接着是Java虚拟机,最后是集合框架。至于Java基础,因为大部分只是API的使用,所以只提供整理好的题目,而涉及到反射,动态代理等内容,会在集合框架完成后补充。那么话不多说,我们直接开始吧。并发编程都问啥?每个模块开始时,我都会放出这一模块中知识点的统计数据,供大家参考。统计中,我将并发编程分为了5个知识点:线程基础:线程的基本概念,Thread类的使用等;线程池:线程池的原理,线程池的使用等;synchronized:原理,锁升级,优化等;volatile:原理,指令重排,JMM相关等;ThreadLocal:原理,使用方法,内存泄漏等;JUC:Lock接口,并发容器,CAS,AQS等。统计到并发编程关键词174次,线程出现37次,线程池出现22次,synchronized出现30次,volatile出现12次,ThreadLocal出现8次,JUC出现44次,剩余21次仅提到多线程/并发编程。从图中看,ThreadLocal和volatile出现概率较低,但个人建议面试准备中,并发编程的部分要全量准备。数据大家都看到了,接下来看看各大公司都会问哪些关于线程的问题。这部分题目主要收集自某准网面经,浅紫色底色的题目是我和小伙伴在面试过程遇到过的。MarkDown的表格实在太丑了,偷个懒使用图片代替了,文末附上整理后Excel的获取方式。关于线程你必须知道的8个问题涉及到概念性的题目就不过多赘述了,这些可以通过百度百科获取到答案。在这里我挑选了8道比较有代表性的问题,和大家分享我的理解。并发编程的3要素并发编程的3要素:原子性:操作不可分割,要么不间断的全部执行,要么全部不执行;有序性:指程序按照代码的顺序结构执行;可见性:当一个线程修改了共享变量后,其它线程也是立即可见的。概念很简单,我们写一些代码展示下有序性和可见性的问题(原子性实在没有想到很好的例子,有没有小伙伴提供示例呢)。有序性问题public
2022年11月4日

Java面试都问啥?

大家好,我是王有志。又是好久不见,不过这次没有休假,而是搞了个“大”工程,花了点时间自学Python,然后写了“玩具爬虫”,爬某准网的面经数据,为来年的“春暖花开”做准备。今天作为开篇,还是和大家随便聊聊:我为什么想换工作?做了哪些准备工作?Java面试到底问啥?最后,会和大家分享这个“玩具爬虫”,当然因为是半路出家,我写的Python很不Pythonic,大家简单的参考就好了。我为什么想换工作?今年是我在这家公司的第三个年头了,不过最近我打算出去看一看了。这家公司不好吗?965,很少加班;中等薪资水平,对得起工时了;小福利还算不错,该有的都有,还会不定时的发一些购物卡;工作也很稳定,如果不犯错的话,我应该可以在这退休。听起来是“梦中情司”了,那我为什么还要换工作?第一,保险这类业务导向的公司,谁是公司的“爸爸”?业务部门!因此,许多“奇思妙想”的需求会让你很心累,有时候你甚至需要解释“为什么APP的主题不能跟随手机壳改变”这种问题。第二,传统行业的“低并发”看不到太多技术层面的挑战,虽然leader已经努力的拥抱“新技术”了,但始终是畏手畏脚,可以理解他的顾虑,所以想去看看外面的世界。第三,个人规划的原因,我并不打算留在北京,或许是留不下来。我想回去,因此需要一段“叫得上名字”的互联网公司的工作经历为我背书,仅仅是保险行业内的名气并不会让我有太多议价权。第四,还有比跳槽涨薪更快的方式吗?做了哪些准备工作?相信很多长期不挪窝的小伙伴,看到别人跳槽涨薪内心都蠢蠢欲动,可是想到要面试,又不知道要准备哪些内容,于是在“挣扎”中慢慢的浪费着时间。其实我也是这样的,在自己的舒适圈内过得很安逸,想了很多次的跳槽,可总感觉自己没准备好。想想之前的三次面试都是“裸面”,每次结果都不是很理想,所以这一次,我要充分的准备,力求让我即便在“寒冬”也能得到不错的结果。那么这次我都做了哪些准备?首先是回顾了下数据结构与算法的知识,也就是《和王有志一起学习数据结构与算法》的内容,只不过最近为了学习Python,暂时中断了。接着是自学了Python,系统的学习了语法,因为有Java的基础,这部分学起来其实很快,只不过要一边工作一边学习,大概花了一周左右。然后找了一个简单的爬虫,抄抄改改的花了2天时间完成某准网的“玩具爬虫”,虽然有点坎坷,也算是满足了需求。第四步就是数据分析了,花了一点时间过滤掉无效信息,然后花了一顿小吊梨汤,找了朋友帮忙写了关键词统计和分析的程序,因为用了他们的二方库,程序就不放上来了。Java面试到底问啥?这次总共爬取了30家公司的面经,原始数据约4000条,从中选取了近两年(2021年开始)的社招面经数据约400条数据,我就从这400条数据进行“小”数据分析。数据统计说明下统计方法,程序统计关键词出现的频率,然后针对程序无法识别的内容进行人工统计,因此有些关键词出现的次数会大于400的。我将面经中出现的问题分为9大类:Java核心编程:Java基础,集合框架,并发编程,Java虚拟机等;计算机基础:数据结构与算法,计算机网络,操作系统等;软件工程:设计模式,系统设计等;应用框架:Spring,Spring
2022年11月3日

数据结构:栈和队列

大家好,我王有志又回来啦。关注王有志,回复DSA获取数据结构和算法学习资源。最近被全链路优化搞得焦头烂额,等抽出时间来和大家分享下我司正在做的“全面提速工程”。今天我们来学习线性表中最后两种数据结构:栈和队列。它们是两种比较特殊的线性表,相较于数组和链表而言,可以认为它们是“高级”的线性表。栈和队列的特点前几天和媳妇聊到大学校门口的美食广场,每到夜晚便人声鼎沸,撸肉串的,喝扎啤的.....Hold
2022年11月3日

编程技巧:“高端”的位运算

大家好,我是王有志。关注王有志,回复DSA获取数据结构和算法学习资源。原计划迭代作为预备知识的收尾,不过在解2的幂[1]和4的幂[2]时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。“征服”面试官当我还在校园的时候,听到过一个故事:某位学长去面试腾讯时,要求优化冒泡排序[3],学长“苦思冥想”后使用位运算交换变量,成功“征服”面试官拿下Offer。故事我们可以当做段子来看,不过提到的位运算交换变量却值得我们去探究。先来看下“普通”程序员是如何交换变量的:int
2022年11月3日

编程技巧:从斐波那契数列到递归

大家好,我是王有志。关注王有志,回复DSA获取数据结构和算法学习资源。今天我们通过经典数学问题斐波那契数列[1]来学习非常重要的编程技巧:递归。斐波那契数列关于斐波那契数列,我们直接引用百度百科中的定义:“斐波那契数列(Fibonacci
2022年11月3日

预备知识:算法的复杂度分析

大家好,我是王有志。关注王有志,回复DSA获取数据结构和算法学习资源。今天我们只有一个内容:算法的复杂度分析。算法的复杂度分析可以说是算法中的灵魂,有了它我们才能去评价一个算法优劣。算法的评价标准我们可以套用“多快好省”这个标准去衡量算法:多,适用场景多,适用于一个问题的算法没有太大的意义;快,运行速度快,过慢的算法没有太大的意义;好,代码质量好,优雅的实现和健壮的程序;省,占用资源省,用得越省算法越好。有了衡量算法的标准,我们还需要一套衡量算法的方法。算法的复杂度分析算法是解决一类问题思想,因此我们不必关注多的标准;好的标准虽然有一定的共识,如可读性,健壮性,但是无法量化。而快和省是通过执行时间和内存占用来体现的,可以进行量化分析。通常我们将算法的执行时间和内存占用统称为算法执行效率,而对算法执行效率的分析称为算法复杂度[1]分析。算法的执行效率,会受到问题规模和硬件环境的影响。在设计算法时,我们无法预测算法执行的硬件环境,因此我们需要一种能够忽略硬件环境,并能客观展示算法的执行效率随问题规模增长而改变的分析方法。渐进复杂度分析相信你一定听说过“大O记号”和“(渐进)时间复杂度”吧?实际上这就是通过渐进分析[2]得到的结果。我们先来看下邓俊峰老师的解释:“在评价算法运行效率时,我们往往可以忽略其处理小规模问题时的能力差异,转而关注其在处理更大规模问题时的表现。其中的原因不难理解,小规模问题所需的处理时间本来就相对更少,故此时不同算法的实际效率差异并不明显;而在处理更大规模的问题时,效率的些许差异都将对实际执行效果产生巨大的影响。这种着眼长远、更为注重时间复杂度的总体变化趋势和增长速度的策略与方法,即所谓的渐进分析(asymptotic
2022年11月3日