锁 锁以及信号量对大部分人来说都是非常熟悉的,特别是常用的mutex.锁有很多种,互斥锁,自旋锁,读写锁,顺序锁,等等,这里就只介绍常见到的, 互斥锁 这个是最常用的,win32:CreateMutex-WaitForSingleObject-ReleaseMutex,linux的pthread_mutex_lock-pthread_mutex_unlock,c#的lock和Monitor,java的lock,这些都是互斥锁.互斥锁的作用大家都知道,是让一段代码同时只能有一个线程运行, 自旋锁…
MySQL的innodb存储引擎支持行级锁,innodb的行锁是通过给索引项加锁实现的,这就意味着只有通过索引条件检索数据时,innodb才使用行锁,否则使用表锁.根据当前的数据更新语句(UPDATE user set name='11111' where account='1'),该条件字段account并没有添加索引,所以导致数据表被锁. 我们验证一下: 第一种情况,通过非索引条件检索数据时,使用的是表锁,会导致数据表被锁 1.首先,我们将mysql事务设置为不自动提交,mysql事务默认是…
innoDB默认隔离级别 mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 两个事务同时更新一条数据 右图第二个事务的update增加行锁(表中id有索引), 在未提交之前,左图第一个事务update操作会进入阻塞状态, 左图中仍然可以进行select 右图第二个事务提交之后, 第一个事务会…
默认隔离级别:可重复读 原始数据 | id | name | addr | | nick | NULL | 事务1 事务2 start transaction start transaction ; // name = nick ; // name = nick commit; ; // name = nick // 即使第1个事务已经提交数据,此事务中查询的结果仍然是旧值 commit; ; // name = lock 脏读 read uncommit 第一个事务还没提交, 第二个事务就读出…
Java中有各种各样的锁,例如公平锁.乐观锁等等,这篇文章主要介绍一下各种锁的分类. 按照其性质分类 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者线程饥饿. 公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程.公平锁则在于每次都是依次从队首取值. ReentrantLock中可以在构造函数中指定其是公平锁…
目录 Java多线程(一) 一.线程的定义 二.Synchronize线程同步 三.偏向锁.自旋锁.重量级锁 四.volatile关键字 五.Compare And Swap无锁自旋优化技术和ABA版本号机制 六.乐观锁和悲观锁(参考https://blog.csdn.net/qq_34337272/article/details/81072874) 七.公平锁.非公平锁 Java多线程(一) 一.线程的定义 一个程序中不同的分支进行执行 二.Synchronize线程同步 概念:线程同步指的是…
郑重声明:转载自http://blog.csdn.net/zhongjin616/article/details/18765301 1> 首先讨论各种单片机与操作系统的关系 说到单片机,大家第一时间想到的应该是51单片机,对吧.不错,更高级一点的AVR,把他称为单片机,我们也还觉得可以接受.那么再高级一点的ARM7,8086,80386,Core i3,Athlon 等等我们更习惯称他们为CPU,因为学习计算机原理的时候都是这么叫的,但按照单片机的定义,他们也是归属于单片机.这也不怪大家,中国的…
我们都知道所有的程序最终都是一系列计算机能够识别的指令和数据,通过执行这些指令来控制整个计算机. 而CPU就是负责读取和解释执行这些指令的,CPU主要包括运算器.控制器和寄存器,控制器负责把指令.数据读入寄存器,而运算器则负责运算寄存器中的数据. 那么CPU读取的指令是在哪里存储着的呢?就是在内存中,内存主要就是负责存储运行中程序的数据和指令. 但由于内存容量有限,成本高,最重要的是断电之后里面的一切数据都会丢失,所有并不能作为我们永久存储程序的地方,而硬盘的价格便宜.容量大.断电后仍能保存数据…
对于多线程,如果是计算密集型,多线程不一定优势:但如果是io密集型(因为速度慢),多线程多数情况下就有很大的优势了(但也不全是,因为当io已经满负荷运转下,即100%了,再增加线程,未必就会增加效率): 对于java并发包(java.util.concurrent)几种线程池,其中的固定线程池的线程设为几个好,一般会设为和当前电脑cpu的核数相等的值.…
前言 其实之前大家都了解过volatile,它的第一个作用是保证内存可见,第二个作用是禁止指令重排序.今天系统学习下为什么CPU会指令重排. 存储器的层次结构图 1.CPU乱序执行指令的根源 CPU读取数据的时候会先从离自己最近且速度最快的L1_cache高速缓存取数据,取不到就找L2_cache,还取不到,就读内存. CPU如果一个cpu在执行的时候需要访问的内存都不在cache中,cpu必须要通过内存总线到主存中取,那么在数据返回到cpu这段时间内(这段时间cpu大致能够执行成百上千条指令的…