本文翻译自 Kotlin DSL: from Theory to Practice[https://www.cuba-platform.com/blog/kotlin-dsl...
本文翻译自 Kotlin DSL: from Theory to Practice[https://www.cuba-platform.com/blog/kotlin-dsl...
在 aar 的源码中不论使用 implementation 或者 api,打成 aar 包之后,当我们通过 gradle 脚本上传到服务器时,我们可以通过 pom.proje...
1. 使用迭代器 如果想要在循环的同时能够修改 vector,那么可以使用 iterator 代替 const_iterator。 2. 使用 auto (C++11) / ...
CMake 中 function 和 macro 的区别 通过代码直观地来看看区别。 上面的例子来自 function-vs-macro-in-cmake[https://s...
这一章我们将从一个通用常规工程的角度来看一个 CMake 工程的常用阻止结构。先来看看工程目录结构: 我们有 4 个文件夹,1 个 CMakeLists.txt 文件。 bu...
CMake 使用惯例 在项目根目录建一个 build 目录:mkdir build && cd build 在 build 目录下执行 cmake .. 同样在 build ...
16.1 什么是内存模型,为什么需要它 假设一个线程为变量 aVariable 赋值: 内存模型需要解决这个问题:“在什么条件下,读取 aVariable 的线程将看到这个值...
在 java.util.concurrent 包的许多类中,例如 Semaphore 和 ConcurrentLinkedQueue,都提供了比 synchronized 机...
1. 传参是一个指针 输出:22 当我们把一个指针作为参数传给一个方法时,其实是把指针的副本传给了方法,也就是指针的值传递。因此,如果我们在方法的内部修改指针本身的值,那么我...
如果类库没有提供你需要的功能,那么还可以使用 Java 语言和类库提供的底层机制来构造自己的同步机制,包括内置的条件队列、显式的 Condition 对象以及 Abstrac...
在 Java 5.0 之前,在协调对共享对象的访问时可以使用的机制只有 synchronized 和 volatile。Java 5.0 增加了一种新的机制:Reentran...
11.3 线程引入的开销 11.3.1 上下文切换 切换上下文需要一定的开销,而在线程调度过程中需要访问由操作系统和 JVM 共享的数据结构。应用程序、操作系统以及 JVM ...
在安全性与活跃性之间通常存在着某种制衡。我们使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致锁顺序死锁(Lock-Ording Deadlock)。同样,我们使用...
8.3 配置 ThreadPoolExecutor ThreadPoolExecutor 为一些 Executor 提供了基本的实现,这些 Executor 是由 Execu...
7.1 任务取消 如果外部代码能在某个操作正常完成之前将其置入 “完成” 状态,那么这个操作就可以成为可取消的(Cancellable)。取消某个操作的原因很多: 用户请求取...
6.2 Executor 框架 在 Java 类库中,任务执行的主要抽象不是 Thread,而是 Executor。 虽然 Executor 是个简单的接口,但它却为灵活且强...
5.1 同步容器类 同步容器类包括 Vector 和 Hashtable,二者是早期 JDK 的一部分,此外还包括在 JDK 1.2 中添加的一些功能相似的类,这些同步的封装...
4.2 实例封闭 4.2.2 示例:车辆追踪 程序清单 4-4 给出了一个基于 Java 监视器模式实现的“车辆追踪器”,其中使用了程序清单 4-5 中的 MutablePo...
3.1 可见性 3.1.3 加锁与可见性 内置锁可以用于确保某个线程以一种可预测的方法来查看另一个线程的执行结果。当线程 A 执行某个同步代码块时,线程 B 随后进入由同一个...
用法 ThreadLocal<T> 是带了一个泛型 T 的,意思就是不同线程从同一个 ThreadLocal 实例中会取出属于自己的 T 类型的实例(这些实例在不同线程中是不...