互斥锁

Java容器的常见问题

为君一笑 提交于 2020-01-07 09:24:06
记录Java容器中的常见概念和原理 参考: https://github.com/wangzhiwubigdata/God-Of-BigData#%E4%B8%89Java%E5%B9%B6%E5%8F%91%E5%AE%B9%E5%99%A8 https://blog.csdn.net/justloveyou_/article/details/78653929 基础容器 ArrayList(动态数组)、LinkedList(带头结点的双向链表) ArrayList public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 默认初始容量为 10; 扩容机制:添加元素前,先检查是否需要扩容,一般扩为源数组的 1.5 倍 + 1; 边界检查(即检查 ArrayList 的 Size):涉及到 index 的操作; 调整数组容量(减少容量):将底层数组的容量调整为当前列表保存的实际元素的大小; 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理; LinkedList LinkedList 不但实现了List接口,还实现了Dequeue接口。因此

什么是互斥?

非 Y 不嫁゛ 提交于 2020-01-07 01:51:05
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 互斥体是一种经常用于解决多线程问题的编程概念。 我向社区提出的问题: 什么是互斥锁,你如何使用它? #1楼 要了解MUTEX,首先需要知道什么是“竞争条件”,然后才会理解为什么需要MUTEX。 假设您有一个多线程程序,并且您有两个线程。 现在,您在作业队列中有一个作业。 第一个线程将检查作业队列,在找到作业后,它将开始执行它。 第二个线程还将检查作业队列,并发现队列中有一个作业。 因此,它也将分配相同的作业指针。 所以,现在发生了什么,两个线程都在执行相同的工作。 这将导致分段错误。 这是竞争条件的一个例子。 这个问题的解决方案是MUTEX。 MUTEX是一种锁,它一次锁定一个线程。 如果另一个线程想要锁定它,线程就会被阻塞。 这个pdf文件 链接中的MUTEX主题非常值得一读。 #2楼 当您拥有多线程应用程序时,不同的线程有时会共享一个公共资源,例如变量或类似资源。 这个共享源通常无法同时访问,因此需要一个构造来确保一次只有一个线程正在使用该资源。 这个概念被称为“互斥”(短互斥),并且是一种确保在该区域内只允许一个线程,使用该资源等的方法。 如何使用它们是特定于语言的,但通常(如果不总是)基于操作系统互斥锁。 由于范例,有些语言不需要这种结构,例如函数式编程(Haskell,ML就是很好的例子)。 #3楼

Python进程、线程、协程之间的关系

微笑、不失礼 提交于 2020-01-04 04:45:31
一、从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 。 1.进程: 表示一个程序的执行活动 (打开程序、读写程序数据、关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 (执行功能1,执行功能2) 一个程序至少有一个进程 一个进程至少有一个线程 1.并行: 需要处理的任务数 == CPU核心数量 两个任务 两个核心 任务1:------------- 任务2:------------- 2.并发: 需要处理的任务数 > CPU核心数量 三个任务 一个核心 任务1: ----- ------ 任务2: ------ 任务3: ------ 二、从程序角度 多进程和多线程 表示:当前程序可以同时执行多个任务 进程和线程都是由 操作系统调度完成 1.进程:    每个进程都是有自己独立的内存空间,不同进程之间的内存空间是不能共享。 不同进程之间的通信是由操作系统来完成的。 不同进程之间的通信效率低切换开销也大。 2.线程:   一个进程下可以有多个线程,同一个进程内的线程可以共享内存空间. 不同线程之间的通信 有进程 管理。 不同线程之间的通信效率高,切换开销小。 3.互斥锁:   共享意味着多个线程的竞争 会导致不安全问题。 为了保护内存空间的数据不被多个线程同时读写, 导致数据隐患, 于是诞生了" 互斥锁 "。 "互斥锁":

缓存初涉

孤人 提交于 2020-01-01 09:12:22
Reference [1] 【转】https://blog.csdn.net/zeb_perfect/article/details/54135506 [2] https://blog.csdn.net/xlgen157387/article/details/79530877 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 解决方案 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 缓存雪崩/缓存失效 缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。 解决方案 缓存失效时的雪崩效应对底层系统的冲击非常可怕

并发技术、进程、线程和锁拾遗

点点圈 提交于 2020-01-01 00:48:07
并发技术、进程、线程和锁拾遗 Part1. 多任务 计算机发展起初,CPU 资源十分昂贵,如果让 CPU 只能运行一个程序那么当 CPU 空闲下来(例如等待 I/O 时),CPU 资源就会被浪费,为了使 CPU 资源得到更好的利用,先驱编写了一个监控程序,如果发现某个程序暂时无需使用 CPU 时,监控程序就把另外的正在等待 CPU 资源的程序启动起来,以充分利用 CPU资源。这种方法称为 - 多道程序(Multiprogramming) 对于多道程序,最大的弊端是各程序之间不区分轻重缓急,对于用户交互式的程序来说,对 CPU 计算时间的需求并不多,但是对于响应速度却有比较高的要求。而对于计算类程序来说则相反,对响应速度要求低,但需要长时间的 CPU 计算。想象一个场景:我在同时在浏览网页和听音乐,我们希望浏览器能够快速响应,同时也希望音乐不停,这时候 多道程序 就没法达到我们的要求了。 于是人们改进了 多道程序 ,使得每个程序运行一段时间之后,都主动让出 CPU 资源,这样每个程序在一段时间内都有机会运行一小段时间。这样像浏览器这样的交互式程序就能够快速地被处理,同时计算类程序也不会受到很大影响。这种程序协作方式被称为 分时系统(Time-Sharing System) 。 在分时系统的帮助下,我们可以边用浏览器边听歌了。 但是 如果某个程序出现了错误,导致了死循环

线程同步,条件变量pthread_cond_wait

混江龙づ霸主 提交于 2020-01-01 00:24:11
与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。条件变量使我们可以睡眠等待某种条件出现。 条件变量是利用线程间共享的全局变量进行同步的一种机制, 主要包括两个动作: 一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。 条件的检测是在互斥锁的保护下进行的。如果条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。 pthread_cond_wait 原子调用: 等待条件变量, 解除锁, 然后阻塞 当 pthread_cond_wait 返回,则条件变量有信号,同时上锁 等待条件有两种方式: 条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(), 其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT 无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait() (或pthread_cond_timedwait(),下同)的竞争条件(Race Condition)。 mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP), 且在调用pthread_cond_wait()前必须由本线程加锁

信号量与条件变量的区别

。_饼干妹妹 提交于 2020-01-01 00:22:59
注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注 进程间通信 ; 而条件变量、互斥锁,主要关注 线程间通信 。 下面内容参考: http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait指的是 条件变量 ,总和一个 互斥锁结合使用 。在 调用pthread_cond_wait前要先获取锁 。pthread_cond_wait函数执行时先 自动释放 指定的锁,然后等待条件变量的变化。在函数调用返回之前,自动将指定的互斥量 重新锁住 。 int pthread_cond_signal(pthread_cond_t * cond); pthread_cond_signal通过条件变量 cond发送消息 ,若多个消息在等待,它 只唤醒一个 。 pthread_cond_broadcast可以唤醒所有。调用pthread_cond_signal后要 立刻释放互斥锁 ,因为pthread_cond_wait的最后一步是要将指定的互斥量重新锁住,如果pthread_cond_signal之后没有释放互斥锁,pthread_cond_wait仍然要阻塞

python线程

戏子无情 提交于 2019-12-29 02:18:54
1. 线程的创建 使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子类class,只要继承 threading.Thread 就可以了,然后重写 run 方法 示例如下: #第一种import threading import time def saySorry(): print("============") time.sleep(1) if __name__ == "__main__": for i in range(5): t = threading.Thread(target=saySorry) t.start() #启动线程,即让线程开始执行 # 第二种import threading import time class MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = "I'm "+self.name+' @ '+str(i) #name属性中保存的是当前线程的名字 print(msg) if __name__ == '__main__': t = MyThread() t.start() 说明 python的threading.Thread类有一个run方法

互斥锁pthread_mutex_init()函数

↘锁芯ラ 提交于 2019-12-28 04:29:49
linux下为了多线程同步,通常用到锁的概念。 posix下抽象了一个锁类型的结构:ptread_mutex_t。通过对该结构的操作,来判断资源是否可以访问。顾名思义,加锁(lock)后,别人就无法打开,只有当锁没有关闭(unlock)的时候才能访问资源。 即对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 使用互斥锁(互斥)可以使线程按顺序执行。通常,互斥锁通过确保一次只有一个线程执行代码的临界段来同步多个线程。互斥锁还可以保护单线程代码。 要更改缺省的互斥锁属性,可以对属性对象进行声明和初始化。通常,互斥锁属性会设置在应用程序开头的某个位置,以便可以快速查找和轻松修改。 l 头文件: #include <pthread.h> l 函数原型: int pthread_mutex_init( pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER ; l 函数作用: 该函数用于C函数的多线程编程中,互斥锁的初始化。 pthread_mutex_init () 函数是以动态方式创建互斥锁的

并发编程-线程-死锁现象-GIL全局锁-线程池

孤者浪人 提交于 2019-12-27 05:39:18
一堆锁 死锁现象 (重点) 死锁指的是某个资源被占用后,一直得不到释放,导致其他需要这个资源的线程进入阻塞状态. 产生死锁的情况 对同一把互斥锁加了多次 一个共享资源,要访问必须同时具备多把锁,但是这些锁被不同线程或者进程所持有,就会导致相互等待对方释放从而程序就卡死了 第二种情况的解决方法: 抢锁一定按照相同的顺序去抢 给抢锁加上超时,如果超时则放弃执行 递归锁 (了解) 与普通的区别 相同: 多线程之间都有互斥的效果 不同: 同一个线程可以对这个锁执行多次acquire 解决方法 同一个线程必须保证,加锁的次数和解锁的次数相同,其他线程才能够抢到这把锁 信号量 (了解) 可以限制同时并执行公共代码的线程数量 如果限制数量为1,则与普通互斥锁没有区别(默认为1) from threading import Semaphore,current_thread,Thread import time s = Semaphore(2) def task(): s.acquire() time.sleep(1) print(current_thread().name) s.release() for i in range(10): Thread(target=task).start() # 结果是每次都会执行两个子线程 GIL全局锁 (重点) 什么是GIL锁? 在cpython中