自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 Kotlin 协程到底运行在哪个线程里

与其说协程是一个轻量级线程,我更愿意把它当然一个个待执行/可执行的任务。这样就引申出一个问题——协程是运行在哪个线程上的?这就是本篇文章想要探讨的问题,同时我们也将学习如何让协程在特定的线程里执行。

2020-03-31 20:44:23 1220

原创 kotlin 协程上下文那点事

用线程做类比的话,协程的 context 可以认为是协程的“线程私有变量”,同时这个私有变量是不可变的。也就是说,我们在创建一个协程的时候,他的 context 携带的信息就已经确定了下来

2020-03-28 09:56:30 416

原创 如何使用 Java 和 double-check 实现支持多实例的单例

考虑这样一个需求,我们有两个业务 A 和 B,他们共同使用一个硬盘缓存 `DiskCache` 的实现。由于在单个业务内只需要一份缓存,这很容易让我们想到单例模式。在本篇文章中,我们从最简单的传统的单例模式的实现开始,一步步实现一个优雅高效的多实例的单例模式。

2019-05-26 21:13:27 328

原创 Android native 崩溃信息捕获实践

本篇是 bugly 一篇关于 native crash 捕获的文章的练习。由于他文章中已经给出了相关的大部分知识点,这里我就仅仅补充一些细节,并给出一个完整的 demo

2019-04-06 11:41:47 2669 9

原创 Android P 源码分析 5 - Low memory killer 之 lmkd 守护进程

lmkd 是在应用层实现的取代原有 lowmemorykiller 驱动的守护进程。通过监听 memory pressure 事件,lmkd 可以在内存 low、medium 和 critical 的时候得到通知,进而回收优先级比较低的进程

2019-03-23 12:15:49 2359

原创 Android P 源码分析 4 - logd 的初始化

为了跟老罗的书保持一个比较一致的步伐,这一篇开始我们来看 logd 的实现。当然,这个 logd 不是老罗书里讲的 log 驱动,而是在应用层实现的一个守护进程。

2019-03-20 20:26:02 1606

原创 Android P 源码分析 3 - SharedPreferences 源码分析

本来按顺序这一篇应该是 logd,但突然有点好奇 SP 在保存数据的时候是怎么同步的,就还是先看 SP 吧,当做在开始啃 logd 这个硬骨头前轻松一下(虽然这么说,SP 还是有很多值得我们学习的地方的)。

2019-03-19 10:29:29 377 1

原创 Android P 源码分析 2 - 强弱指针的实现

继上篇我们学习了 Android 轻量级指针的实现,是时候来看“重量级”指针的实现了。在 Android 里,“重量级”指针指的是 `RefBase` 和 `sp/wp` 配合使用的情况,它提供了完整的强、弱指针的支持。

2019-03-12 13:13:23 392

原创 Android P 源码分析 1 - 轻量级智能指针的实现

作为 Android 源码分析系列文章的第一篇,我们先看 LightRefBase 的源码,热热身。

2019-03-09 19:28:26 506

原创 Java 程序员眼里的 Linux 内核 —— wait_event 源码分析

看 Linux 的 wait_event 源码时,联想到我们平时经常用得比较多的 wait/notify、double-check 和 volatile,突然意识 wait_event 简简单单几行代码的背后,涉及的知识点其实非常丰富。本篇文章我们就一起了来探索它背后的知识,然后尝试着和我们的日常开发关联起来。wait_event这里使用 Linux-2.6.24 版本的源码背景在某些...

2018-12-16 17:30:17 477

原创 Linux 内核页表的创建

原文地址 jekton.github.io,未经允许,不得转载。源码使用 Linux 2.6.24,基于 x86 平台;参考书是《深入理解 LINUX 内核》第三版内核跟普通的应用一样,为了使用虚拟内存,也需要一个给 CPU 设置一个页表。在这篇文章中,我们就一起来了解 Linux 是如何为内核创建页表的。需要注意的是,这里我并不打算详细讲解页表的方方面面,硬件相关的基础知识,读者可以...

2018-11-25 11:34:03 1108 1

原创 Java - synchronized 那些事

由于功率墙的影响,现代 CPU 倾向于使用多个核心(core)来提高其整体性能。这意味着,软件开发人员不再能够像以前一样,把软件放两年,再拿出来,它的性能就变得足够好了。为了充分利用多核 CPU 的能力,我们也必须进入多线程编程的世界。对 Java 程序员来说,这不是一件太困难的事。我们的语言本来就内置了同步功能。其中最常用的,莫过于 synchronized 关键字。他一共有两种用法: a...

2018-03-20 20:19:39 483

原创 自己实现 SharedPtr(4)—— 一个代码洁癖的救赎

修改以使类接口和标准库的更一致

2016-07-20 19:57:13 495

原创 自己实现 SharedPtr(3)—— 进一步的转型(cast)支持

在上一篇文章中,虽然我们实现了一部分的类型转换支持,但是,他对转型的支持还是非常不完善,远不能满足实际应用的需求。在这一篇文章中,我们将继续探讨SharedPtr的实现,完善他的转型功能

2016-05-07 16:54:35 737

原创 自己实现 SharedPtr(2) —— 类型转换、copy/move 语义的实现

既然叫做“SharedPtr”,那么我们就应该可以期望他能够处理正常的指针转换(包括其他类型转换)。此外,“shared”也要求他必须提供 move/copy 语言。在本文,我们将继续完善SharedPtr,为他增加 类型转换、move/copy 语言

2016-05-05 11:20:29 619

原创 自己实现 SharedPtr(1) —— 管理 Deleter

为了能够使用简化 SharedPtr 的使用,我们只能对他定义一个 Reference 昨晚模板参数。与此同时,我们也想支持任意类型的 deleter,这就引入了一个矛盾——我们如何声明这个 deleter 呢?

2016-04-30 16:30:06 1001 1

原创 Widget&& w{} 究竟表示什么?这跟 std::forward 又有什么关系

rvalue reference, rvalue, lvalue 和 std::forward 之间的联系

2016-01-15 13:16:05 651

原创 分享一道伯克利 CS 61A 关于高阶函数的一道Python作业题(3)

关于高阶函数的一道Python作业题 pow_church(m, n)的实现与分析

2015-12-14 17:56:03 1543

原创 分享一道伯克利 CS 61A 关于高阶函数的一道Python作业题(2)

Python 高阶函数 Church numerals 问题的部分解答

2015-12-14 17:05:24 1459

转载 分享一道伯克利 CS 61A 关于高阶函数的一道Python作业题(1)

The logician Alonzo Church invented a system of representing non-negative integers entirely using functions. The purpose was to show that functions are sufficient to describe all of number theory: if we have fu

2015-12-14 15:44:31 1308

原创 Linux 2.6 schedule() 切换进程时没有释放rq->lock却又为何不会导致死锁?

Linux 的 schedule()函数主要完成现场切换任务。而切换进程前,他并没有将runqueue上的锁解开。以尝试判断,我们几乎会认定这终将导致死锁。然而,故事并没有我们相信中的那么单纯……

2015-11-28 16:31:32 1370

原创 为什么Linux内核无法保证动态定时器的执行时间

每每谈到Linux的软件定时器,我们都要说,内核无法保证其执行时间,一般会延迟几百毫秒。几百毫秒这个一个数,绝对不是空穴来风,万物总归有其缘由。文章主要就和大家谈谈这么一个几百毫秒,究竟是从哪里冒出来的呢?

2015-11-26 11:25:15 729

原创 Aliasing constructor of shared_ptr

Aliasing constructor of shared_ptr

2015-11-24 17:06:41 896

原创 Linux 内核信号量(semaphore) __down() 函数浅析

Linux 内核信号量(semaphore)中的 __down() 函数浅析

2015-11-24 10:34:09 1637 1

原创 hlist_head / hlist_node 设计浅析

Linux内核中的 hlist_node 为什么使用 pprev 而不是简单的 prev

2015-11-18 10:44:45 1552

原创 Linux task_struct parent 和 real_parent 的区别

Linux task_struct parent 和 real_parent 的区别

2015-11-09 11:22:51 4033

原创 Android AsyncTask 浅析(源代码取自 API level 23)

Android AsyncTask 浅析

2015-11-03 21:17:44 693

原创 Java 网络编程[Elliotte R.H.] 中对InputStream.markSupported()方法的误解

Java 网络编程[Elliotte R.H.] 中对InputStream.markSupported()方法的误解

2015-11-02 16:45:59 2913

原创 π秒就是一个纳世纪

π秒就是一个纳世纪

2015-09-29 11:30:36 1363

原创 【Java】byte 到 unsigned byte (int) 转换

Java将byte转换为unsigned byte

2015-09-26 19:17:01 3965

原创 Android Pitfall - 扒一扒RadioGroup 和 RadioButton

今天工作时,需要以编程方式对RadioGroup进行操作(包括清空、选中),结果却遇到了一个非常意外的结果—— radioButton.setChecked(true); 后,该按钮竟不会变为选中状态!在Android源码中一阵翻腾后(开源万岁啊),于是便有了这篇博文。

2015-08-07 21:27:39 1091

原创 Android Pitfall - Fragment.startActivityForResult(), requestCode == 65536

Android里,Fragment和Activity具有 startActivityForResult() 方法,但在支持库里,二者的表现却会有很大差异。

2015-08-06 20:52:04 1764

原创 编程珠玑第二版习题,4.6.2

使用二分查找给出数组中不小于 x 的最小索引

2015-04-26 13:37:35 779

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除