摘要:
前言 方法中的变量(即局部变量)是不存在数据竞争(Data Race)的,也是线程安全的。为了理解为什么,我们先来了一下方法是如何被执行的,然后再分析局部变量的安全性,最后再介绍利用局部变量不会共享的特点而产生的解决并发问题的一些技术。 方法是如何被执行的 以上代码转换成CPU指令执行,方法的调用过 阅读全文
摘要:
前言 线程是操作系统中的一个概念,支持多线程的语言都是对OS中的线程进行了封装。要学好线程,就要搞清除它的生命周期,也就是生命周期各个节点的状态转换机制。不同的开发语言对操作系统中的线程进行了不同的封装,但是对于线程的声明周期这部分基本是相同的。下面先介绍通用的线程生命周期模型,然后详细介绍Java 阅读全文
摘要:
前言 在Java 1.5之前,Java语言提供的唯一并发语言就是管程,Java 1.5之后提供的SDK并发包也是以管程为基础的。除了Java之外,C/C++、C 等高级语言也都是支持管程的。 那么什么是管程呢? 见名知意,是指管理共享变量以及对共享变量操作的过程,让它们支持并发。翻译成Java领域的 阅读全文
摘要:
前言 Java的多线程是一把双刃剑,使用好它可以使我们的程序更高效,但是出现并发问题时,我们的程序将会变得非常糟糕。并发编程中需要注意三方面的问题,分别是安全性、活跃性和性能问题。 安全性问题 我们经常说这个方法是线程安全的、这个类是线程安全的,那么到底该怎么理解线程安全呢? 要给线程安全性定一个非 阅读全文
摘要:
前言 在前篇介绍 "死锁" 的文章中,我们破坏等待占用且等待条件时,用了一个死循环来获取两个账本对象。 我们提到过,如果apply()操作耗时非常短,且并发冲突量也不大,这种方案还是可以。否则的话,就可能要循环上万次才可以获取锁,这样的话就太消耗CPU了! 于是我们给出另一个更好的解决方案, 等待 阅读全文
摘要:
前言 本篇博客先介绍在仿真过程中会使用到的一些关键概念,然后介绍便于调试仿真脚本的常用技术:日志、命令行参数。 关键概念 节点 在因特网术语中,主机(终端)是指任何一台连接到网络的计算设备。 ns 3并非一个专门的因特网模拟器,而是一个网络模拟器 。为此不采用术语“主机”,因为这个词太容易让人联想到 阅读全文
摘要:
前言 我们使用加锁机制来保证线程安全,但是如果过度地使用加锁,则可能会导致死锁。下面将介绍关于死锁的相关知识以及我们在编写程序时如何预防死锁。 什么是死锁 学习操作系统时,给出死锁的定义为两个或两个以上的线程在执行过程中,由于竞争资源而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。简化一 阅读全文
摘要:
前言 原子性指一个或多个操作在CPU执行的过程不被中断的特性。前面提到原子性问题产生的源头是线程切换,而线程切换依赖于CPU中断。于是得出,禁用CPU中断就可以禁止线程切换从而解决原子性问题。但是这种情况只适用于单核,多核时不适用。 以在 32 位 CPU 上执行 long 型变量的写操作为例来说明 阅读全文
摘要:
前言 解决并发编程中的可见性和有序性问题最直接的方法就是禁用CPU缓存和编译器的优化。但是,禁用这两者又会影响程序性能。于是我们要做的是 按需禁用CPU缓存和编译器的优化 。 如何按需禁用CPU缓存和编译器的优化就需要提到 Java内存模型 。Java内存模型是一个复杂的规范。其中最为重要的便是 规 阅读全文
摘要:
前言 CPU 、内存、I/O设备之间的速度差距十分大,为了提高CPU的利用率并且平衡它们的速度差异。计算机体系结构、操作系统和编译程序都做出了改进: CPU增加了 缓存 ,用于平衡和内存之间的速度差异。 操作系统增加了 进程、线程 ,以时分复用CPU,进而均衡CPU与I/O设备之间的速度差异。 编译 阅读全文