1
并发
并发.....................................................................................................................................1
1. C++并发........................................................................................................................2
2. 多线程..........................................................................................................................2
3. 线程安全......................................................................................................................3
4. 一致性、事务..............................................................................................................4
5. 锁..................................................................................................................................5
2
1. C++并发
C++标准没提供对多线程并发的原生支持,所以C++并发要依靠其他API。
C++11提供了一个新的线程库
volatile
注意debug模式了release模式下,是不同的
sleep和wait
sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持
有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃
这个对象的监视器。
2. 多线程
好处
1.发挥多核CPU优势
2.防止阻塞
3.便于建模
创建方式
1.继承Thread类
2.实现Runnable接口
start()和run()
3
只有调用了start()方法,才会表现出多线程特性,不同线程的run()方法里面的
代码交替执行。
如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()
方法里面的代码全部执行完毕后,另外一个线程才可以执行其run()方法里的代
码。
当某个线程出现异常,如果这个异常没有被捕获,这个线程停止执行,如果这个
线程是某个对象的监视器,那么这个对象的监视器会被释放。
线程池
避免频繁创建和销毁线程,达到线程对象的重用,也可以根据项目灵活控制并
发的数目。
3. 线程安全
多线程模式需要达到和单线程模式一样的结果
单例模式的线程安全
1.饿汉单例模式
线程安全
2.懒汉单例模式
非线程安全
3.双检锁单例模式
线程安全
线程安全4个级别
4
1.不可变(string,int,longlong等基本类型)
2.绝对线程安全,不管运行环境如何,调用者都不用额外的同步措施。
3.相对线程安全,这是通常意义上说的线程安全,像vector中add remove
4.线程非安全,hashmap
4. 一致性、事务
ACID
原子性(Atomicity)
事务是一个不可分割的工作单元,要么都发生,要么不发生
一致性(Consistency)
事务开始之前和结束之后,数据库的完整性约束没有被破坏,数据没有丢失
或者增加。
隔离性(Isolation)
多个事务并发访问时,事务之间是隔离的。
持久性(Durability)
事务完成后,该事务对数据库所作的更改便持久保存在数据库之中,不会被
回滚。
事务隔离急别
未提交读(Read uncommitted)
一个事务可以读取另一个未提交或者撤回之前的数据,容易出现脏读的情况
。
5
读提交可以解决脏读问题。
读提交(Read committed)
一个事务等另外一个事务提交之后才可以读取数据,但会出现不可重复读的
情况,读取过程中出现update操作,会导致数据不一致。SqlServer,Oracle
是这个级别,在读取的时候不允许修改。
数据不可重复读的问题可以用重复读来解决。
可重复读(Repeatable read)
同一个事务里确保每次读取的时候,获得的是同样的数据,但不保障原始数
据被其他事务更新。Mysql,InnoDB是这个级别。
序列化(Serializable)
所有事务串行处理,但是会牺牲效率。
5. 锁
CAS
Compare And Swap(比较-替换)
假设有3个操作数:内存值V,旧的预期值A,要修改的值B,当且仅当预期值A
和内存值V相同时,才会将内存值修改为B并返回true,否则什么都不操作并返
回false。
CAS需要内存值得配合,这样才能保证每次拿到的变量是主内存中最新的那个
值,否则旧的预期值A对某条线程来说,永远是一个不会变的A,只要某次CAS
操作失败,永远都不会成功。
乐观锁
6
对于并发操作的线程安全持乐观态度,不需要持有锁,将比较-
替换两个动作作为一个原子操作尝试修改内存中的变量,如果失败则表示发生
冲突,然后再重试相应的逻辑
悲观锁
对于并发操作的线程安全持悲观态度,每次对某资源进行操作时,都回持有一
个独占的锁,像synchronized,先上锁,再操作。
公平锁&非公平锁
公平锁(FairSync)
严格按照线程启动顺序来执行,不允许其他线程插队执行
非公平锁(NonFairSync)
允许插队
可重入锁&不可重入锁
互斥锁&共享锁
死锁
两个或以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种
阻塞的现象,若无外力作用,他们都将无法推进下去,此时称系统处于死锁状
态或系统产生了死锁,这些永远在相互等待的进程称为死锁进程。
产生原因
1.竞争资源
2.进程间推进顺序非法。
7
产生条件
互斥
持有
不可剥夺
环形等待
并发
最新推荐文章于 2024-08-21 10:43:21 发布