“Java 的源代码学习”系列

(1)基本类型和对应的类

(2)HashMap 和 ConcurrentHashMap

(3)ConcurrentSkipListMap

(4)ReentrantLock 相关类(上)(本文)

经过前两篇与各种基础类库的 CAS 的“战斗”,大部分人估计已经晕了。在大多数情况,我们并不会直接参与 CAS 相关的实现细节,而是使用 JDK 提供的各种并发控制的类包。

例如我们常见的锁机制。这里老夫就要来研究一下 ReentrantLock 这个类相关的源代码实现。

老夫把此篇拆为上、下两篇,上篇(本文)是在看 ReentrantLock 相关代码前的一些知识准备(包括对 ThreadLocal 类的代码学习)。在下篇再开始读 ReentrantLock 相关的代码。

现在博客用的垃圾代码高亮插件貌似有问题,如果遇到下[……]

继续阅读

人工智能并不“智能”

相信大伙对霍金的担忧“耳熟能详”。除了他经常提到的寻找地外生命的入侵威胁以外,人工智能也存在着忧患:说不定哪天科幻片里描述的机器人揭竿而起消灭了人类还真能成为现实。

人工智能现在可以说是大热门。各类公司上到 Google、Microsoft,下到一些没听过的小公司,搞诸如“机器学习”、“Deep Learning”之类的东西可谓是如火如荼。然而我认为,弄这些东西【并不能】让机器像人脑一样进行思维。换句话说,以现有的技术和框架,想要机器像人脑(确切地说是高等生物的大脑)一样思考,是不太可能的事情。

当然我并不是说机器学习这个领域然并卵,我也并没有说机器人灭亡人类不可能, 我只是从“模仿”的角度来说。相比于人脑,计算机有着普通生物无可比拟的优势:

  • 超快的运算速度,并且能够进行集群计算:这个应该是没啥争议的。
  • 超多的存储空间。乃可能会说,人脑也可以存储很多东西啊。实际[……]

继续阅读

生活小记——未定标题(131)

(1)

度过了“欢乐”的新年,回到工地搬砖也有两个多月的时间了。然而在这两个多月里,本屌“扬言”了很久(貌似说了有三年了?)的换工作计划…… 并未开始投递简历。实际上并不是说没有行动,而是在准备了一段时间后,发现自己并没有完全准备好,所以还在继续准备中(老夫并没有歇菜,一直在准备好吧?)。

为了打消某些人觉得老夫的换工作计划又搁置了的这种“念头”,老夫要罗列一下大体上都要进行哪些准备:

  • 算法——老夫最近在 LeetCode 上刷题,大概刷了一百多题了。
  • Java 的源代码学习(主要是并发访问的集合类型以及 NIO 等方面的设计)和多线程编程练习。
  • MySQL、Redis、HBase 的基本原理和代码。
  • Java 开发全家桶的原理和代码(比如 Spring Boot、Netflix 等一大堆东西)。
  • 分布式和流式事物处理的相关内容。
  • 吹逼内[……]

继续阅读

生活小记(130)/歌曲收藏(29)——歌曲大放送

貌似很久(?)没有“收藏”自己喜欢的歌曲了,“恰逢”本屌丝【即将】“诞辰” 27 周年,所以这里来一个歌曲大放送,一次性收藏本屌超级喜爱的【5】首歌曲(^…^)。

实际上本屌这个月的事情超多,所以基本上没啥心思“关注”自己的“诞辰日”。不过众多(女性)好友最近一直在念叨我就快过生日,搞得我自己不想记得也得记得。在这里提前收藏一下就当作是自己给自己的生日礼物吧(乃们看我有多穷)。至于为啥要【提前】,那是因为本屌丝的这次“诞辰日”“恰逢”周末,而我在这个周末要为了一些“私人事件”跑到外地去一趟……

 

今天要收藏的五首歌曲,有两首是《伊苏 8》里的背景音乐,两首是“初音未来”的歌曲,还有一首是我非常喜欢玩的音游 Dynamix 里的一首歌曲。收藏的同时顺便发表一下我的“诞辰感想”(^_^)。

 

一、NEXT STEP TOWARD THE UNK[……]

继续阅读

Java 的源代码学习(3)——ConcurrentSkipListMap

“Java 的源代码学习”系列

(1)基本类型和对应的类

(2)HashMap 和 ConcurrentHashMap

(3)ConcurrentSkipListMap

乃可能会说:“乃为了准备面试也是拼了,看了这么多 JDK 的源代码!”实际上以老夫以前面试的经验(以及别人面试的反馈),老夫在研究的 JDK 源代码基本上不会有任何可能被问到。比如上次研究的 ConcurrentHashMap,面试官问了 HashMap 以及 Hashtable 的实现细节,当时我就很好奇如果要它实现高并发的哈希表会怎么去做,于是试探性地提了一下,结果他除了想到分段锁其他毛都没有了解!这样看来要他想一个办法去实现低延迟的扩容也是太难为他了!(乃会说乃面试的时候还问面试官问题?实际上老夫会提一个和官方实现相近的方案,然后试探性地问他有没有更好的方法。)

而实际上写 JDK 源代码的[……]

继续阅读

递推和 DP 问题精选(1)

上一篇博客喷了现在很多公司面试的题目,现在来复习一下稍微高级一点的算法,这些题目都是老夫曾经做过的,拿出来“温故而【不】知新”。

 

弱智版放鱼缸

问题描述

刀之魂最近准备在公司放一个“小”鱼缸,市场上买的鱼缸都不够大,于是刀之魂找了一家厂商定制。但是生产鱼缸的厂家很脑残,只能做出底面为正方形的。

众所周知,公司有很多工位和其他物品,所以能放置这个鱼缸的区域有限。但是由于刀之魂想尽可能地霸占公司已有的空地,因此想找到一块面积最大的地方来放置鱼缸。再次注意,鱼缸的底面是正方形的。

现在请乃帮刀之魂找一块面积最大的正方形空地,以便刀之魂找厂家定制合适大小的鱼缸。

 

输入:

输入的内容是一个二维数组(int[][]),其中每一个元素都为 0 或 1。其中 0 表示空地,1 表示位置被占用而不能放置鱼缸。

输出:

一[……]

继续阅读

N-Sum 问题

最近在准备面试,所以一直在刷算法题。然后越准备越发现不论是哪个公司,面试问的算法问题基本上都很水。我这里说的“很水”并不是所有的题我都能做出来,有些问题没见过类似的还是不太好想的。而是这些问题基本上都围绕着二分查找、链表、递归之类的在转圈圈。例如下面一些“水题”:

  1. 有一个有序数组,但是数组有可能被“右移”或者“左移”过,比如 [3, 5, 6, 7, 1, 2] 之类,要你写算法查找某个元素或者给出插入的下标。
  2. 有一个有序数组,除了某个元素外每个元素都恰好有 2 个,要你找出这个元素(要求 log n)。
  3. 有一个有序数组,里面元素有些有重复,给定一个元素,要你查找这个元素在这个数组里的范围(要求 log n,所以不要想着找到后前后遍历)。
  4. 有一个有序数组,里面大量元素是重复的,要你写一个算法,求出这个数组里一共有多少个不同的元素(要求 log n)。

诸如[……]

继续阅读

昨晚睡觉前拿着板子看以前写的博客,主要回顾了一下我的大学生活。结果后半夜开始做梦,梦到了不少高中同学。

要说做梦这个大脑活动也是相当奇怪,有时候会“日有所思夜有所梦”,但有时候会完全相反。比如这次梦见的高中同学,全都是高中时期和我关系很好但是超过一个月没有联系的。而最近一直联系或经常见面的那些高中同学,在梦中完全不见踪影。

因此我醒来后第一感觉就是这些高中同学似乎在宣告他们的不满:你看你睡前都在想大学同学,而高中同学你就不想念了,赶紧来联系我们呀!而那些最近一直联系或者见面的同学完全没有在梦境出现,更加“论证”了这种“可能性”。不过,这只是出现在我自己的梦境中,所以是反映的是我自己的想法(用某位正在学习“解梦”的同事的话来说就是潜意识)。虽然从高维空间或者是量子效应上看,对方的思维还是有可能反映在你的梦境上,但从目前的经验来看,并不是那么地“正相关”。

在梦里,我貌似来到[……]

继续阅读

 

其实人类(准确地说是绝大多数)是一种短视而且自私的动物。

首先说自私吧。很多人都认为自己的道德水平高,小到乐于助人、建设家园,大到兼济天下之类的,实际上核心还是围着自己在打转转。

就比如说最近大家都喜欢谈论的房价问题吧(当然老夫并不是也没有能力分析房价走势,因为这个问题太复杂了,就连最近美联储加息 0.25% 都会有很多影响),很多城市这几年房价都在暴涨(帝都的某小区在 5 年时间从 22000 元/平米涨到将近 10 万元/平米),于是广大老百姓大概就被分成有房和无房两大阵营,而对于有房一族,大约可以分成以下几类:

  1. 炒房客——这类人当然是自私的,没啥好说的。
  2. 已经购房并没有改善计划的人(或者由于各种政策导致无法改善)——这类人多半会感到庆幸自己在价格能承受的时候买下了。但是对于那些买不起房的人,只能是“爱莫能助”,而且从自己“庆幸”这个心理[……]

继续阅读

Java 源代码学习系列歇菜了一年多了,实在是太离谱了,那么现在继续这个系列。

“Java 的源代码学习”系列

(1)基本类型和对应的类

(2)HashMap 和 ConcurrentHashMap (本文)

HashMap 这个数据结构在教科书上已经被讲烂了,而且我们在大学期间也写过无数次它的实现。不过“魔鬼藏在细节之中”,作为一个通用的类库,要考虑的东西远远不止在学校学的如何去实现其基本功能。有很多需要考虑的因素,为了更好地积(zhun)累(bei)经(mian)验(shi),还是要仔细读一下它的代码。

但是还是要先唠叨一下(因为各语言中容器类型是在是太多,而且有些取名都很奇葩)。在 Java 中,HashMap 是基于桶的散列器,并且不是线程安全的(而 Hashtable 是线程安全的),并且其允许 null 类型作为 key。

首先来看一下它的常量定义以[……]

继续阅读