InterProcess Communication [TOC] 2.3.1 Race Conditions 2.3.2 Critical Regions 避免 race condition 的关键是防止多个进程同时读写共享资源。 换句话说,需要一个互斥锁 对共享资源进行访问的部分程序被称为临界区 ...
分类:
其他好文 时间:
2019-09-09 22:56:14
阅读次数:
144
为什么要加锁问题背景当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。要解决的问题多用户环境下保证数据库完整性和一致性锁是什么在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象
分类:
数据库 时间:
2019-09-09 14:42:09
阅读次数:
144
第二章 线程安全 2.1 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。我们通过一个案例,演示线程的安全问题:电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “葫芦娃 ...
分类:
编程语言 时间:
2019-09-08 18:25:00
阅读次数:
100
异步的使用场景: 1、不涉及共享资源,或对共享资源只读,即非互斥操作 2、没有时序上的严格关系 3、不需要原子操作,或可以通过其他方式控制原子性 4、常用于IO操作等耗时操作,因为比较影响客户体验和使用性能 5、不影响主线程逻辑 同步的使用场景:不使用异步的时候 同步的好处: 1、同步流程对结果处理 ...
分类:
其他好文 时间:
2019-09-06 16:01:14
阅读次数:
94
上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。 那么引入本篇的主角,Condition,Condition 将 ...
分类:
编程语言 时间:
2019-09-05 18:40:51
阅读次数:
96
互斥锁只能一次acquire 然后releae ,不能进行多次acquire容易出现死锁,递归锁就可以多次acquire 递归锁:递归锁可以多次进行acquire,每进行一次acquire,寄存器的基数就加1,一直等到基数变成0的时候才能被其他线程拿到 ...
分类:
其他好文 时间:
2019-09-05 13:18:01
阅读次数:
53
锁的内存语义 锁的释放 获取建立的happens before关系 锁是Java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送信息. 假设线程A执行writer()方法,随后线程B执行reader()方法.根据happens before规则,这个 ...
分类:
其他好文 时间:
2019-09-04 09:55:46
阅读次数:
76
在多线程编程中仅使用互斥锁来完成互斥是不够用的, 如以下情形: 假设有两个线程 t1 和 t2, 需要这个两个线程循环对一个共享变量 sum 进行自增操作,那么 t1 和 t2 只需要使用互斥量即可保证操作正确完成,线程执行代码如所示: 如果这时需要增加另一个线程 t3,需要 t3 在 count ...
分类:
系统相关 时间:
2019-09-03 13:27:11
阅读次数:
100
写在前面 上一篇文章 "这次走进并发的世界,请不要错过" 给大家带了并发编程的开胃菜,接下来我们逐步上正餐,在吃正餐之前,我还要引用那首诗词: 「横看成岭侧成峰,远近高低各不同」,远看看轮廓,近看看细节,不断切换思维或视角来学习 远看并发, 并发编程可以抽象成三个核心问题: 分工、同步/协作、互斥 ...
分类:
其他好文 时间:
2019-09-03 10:00:55
阅读次数:
117
使用CreateMutex函数创建互斥对象 利用Windows系统函数CreateMutex(),找出当前系统是否已经存在指定进程的实例,如果没有则创建一个互斥体。 CreateMutex函数原型如下: function CreateMutex(lpMutexAttributes: PSecurit ...