
并发
文章平均质量分 68
五道口纳什
wx公众号/B站:五道口纳什
展开
-
【线程安全】—— 单例类双重检查加锁(double-checked locking)
1. 三个版本单例类的实现 版本1:经典版public class Singleton { public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance;原创 2017-08-02 16:43:30 · 1431 阅读 · 0 评论 -
C++ 多线程与并发
1. 非原子操作 这些非原子操作在被编译为汇编代码后不止一条指令。自加、自减少; new 关键字; 申请内存; 调用构造函数;原创 2017-09-17 17:42:33 · 1444 阅读 · 0 评论 -
Java 并发 —— 读写锁(ReadWriteLock)
读写锁(ReadWriteLock),顾名思义,就是在读写某文件时,对该文件上锁。1. ReentrantReadWriteLock 三部曲: 加锁; 读写操作; 解锁;(为保证解锁操作一定执行,通常将其置于 finally 代码段内) 2. 将读写锁应用于集合类上使得集合线程安全。一个线程安全的字典(map)如下: class RWDictionary { private final Map原创 2017-09-12 23:55:31 · 958 阅读 · 0 评论 -
Java 并发 —— volatile 关键字
volatile 修饰变量等于向编译器传达如下两层含义: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 禁止进行指令重排序。 volatile 关键字定义了读写发生的次序: 对一个变量(被 volatile 修饰的变量)的写操作先行发生于(happens before)后面对这个变量的读操作 1. 修饰标记量//线程1 // boo原创 2017-10-14 22:30:48 · 810 阅读 · 0 评论 -
并发与计算机体系结构
多核 CPU,意味着多个 CPU,每一个核心对应着一个 CPU; 0. 主存与缓存计算机在执行程序时,每条指令都是在 CPU 中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内原创 2017-08-02 15:05:59 · 816 阅读 · 0 评论 -
Java 并发 —— Thread、Executor、线程池
1. Thread Thread.yield():静态方法,其实对线程调度器(Java 线程机制的一部分,可将 CPU 从一个线程转移到另一个线程),意在告诉编译器“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他嗷嗷待哺的任务执行一段时间的大好机会”。原创 2017-08-17 23:21:54 · 1375 阅读 · 0 评论 -
C++ 资源管理 —— RAII
RAII:在构造函数中申请资源,在析构函数中释放资源。 1. RAII 自动实现锁资源的释放 void bad() { m.lock(); f(); if (COND) return; m.unlock(); } 显然如果提前返回,会导致死锁。 class SafeMutex { public: SafeMutex(std::mutex& m) :原创 2018-01-29 23:29:28 · 757 阅读 · 0 评论 -
Java 并发 —— 从 BIO 到 NIO
BIO,同步阻塞;NIO:同步非阻塞; 在 NIO 技术之前,服务器侧使用多线程是 BIO 的一种伪阻塞的解决方法; BIO 的多线程机制存在的问题: 每一个 Socket 连接服务器,服务器侧都立刻开启(创建)一个线程处理, Socket socket = server.accept(); while (true) { new Thread(new ServerHandler(s...原创 2018-09-01 22:17:29 · 1029 阅读 · 1 评论