1.乐观锁总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。 version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数 ...
分类:
其他好文 时间:
2019-09-30 13:10:56
阅读次数:
118
1.轻量级锁(Lock)与重量级锁(synchronized):都是可重入锁 2.可重入锁(递归锁):方法中嵌套方法,锁可传递 3.读写锁(ReentrantReadWriteLock)--读写分离 读锁(获取该值信息)和写锁(对该值操作) 4.乐观锁 本质没有锁,效率比较高、无阻塞、无等待、重试。 ...
分类:
其他好文 时间:
2019-09-15 14:14:55
阅读次数:
130
1. 临界区加排他锁(Go sync.Mutex.Lock()) 如果并发量大,锁竞争激烈,会导致性能开销大 2. 读多写少场景,使用读写锁(Go sync.Mutex.RLock()) 支持并发读,但写锁会block住读和写,读多场景性能会好很多 3. 对计数使用CAS操作(Go sync.ato ...
分类:
其他好文 时间:
2019-09-14 16:16:41
阅读次数:
108
[TOC] 1. 索引 索引优化是对查询性能优化最有效的手段。索引能够轻易将查询性能提高好几个数量级。 索引的目的在于提高查询效率。 B+树结构。 创建索引结构时,要使用区分度较高的字段那一列; 索引字段占用空间要尽量的小。 在建表时,添加索引;不要在添加数据后,再添加索引,会将所有数据都会扫描,很 ...
分类:
数据库 时间:
2019-09-06 22:38:43
阅读次数:
126
之前一直对锁的知识半知半解,写篇博客巩固下。 1、悲观锁、乐观锁 悲观锁每次操作都会加锁,会造成线程堵塞。而乐观锁则是假设不会冲突,每次操作都不会加锁。所以相较而言,乐观锁比较适合于竞争较少的场景,悲观锁比较适合竞争严重的情况。 2、公平锁、非公平锁 如果多个线程按照申请锁的顺序来获取锁,则是公平锁 ...
分类:
编程语言 时间:
2019-08-31 00:50:34
阅读次数:
78
锁降级指的是写锁降级为读锁。 因为读锁与读锁之间不互斥,如果是写锁与读锁或者是写锁与写锁就会互斥,所以由写锁变为读锁就降级了。 如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种并不能称之为锁降级。 锁降级指的是把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前有用的)写锁的过程。 下面给 ...
分类:
其他好文 时间:
2019-08-27 17:29:30
阅读次数:
77
在上一篇文章,我们已经实现了分布式锁。今天更进一步,在分布式锁的基础之上,使用ZooKeeper实现读写锁。 ...
分类:
其他好文 时间:
2019-08-23 13:47:38
阅读次数:
83
mysql 数据支持表级锁,也支持行级锁,但是myIsam 存储引擎只支持表级锁,innodb存储引擎支持行级锁。 表级锁的使用语法为: 加 表级读锁 lock table t_user(表名) read; 加表级写锁:lock table t_user write; 释放锁:UNLOCK tabl ...
分类:
数据库 时间:
2019-08-22 09:13:51
阅读次数:
80
互斥锁:只有一个能进入,他完成 下一个才能进去。读写任何地方都要枷锁 ...
分类:
其他好文 时间:
2019-08-18 17:23:42
阅读次数:
62
重点: 1、读锁共享 2、写锁互斥 3、读写锁互斥 锁降级:将写锁降级为读锁。(先获取写锁,再获取读锁,再释放写锁,最后释放读锁) 造成锁降级的原因:出于性能考虑,一般情况下,都将锁定的动作,精确到具体的语句块,在两个锁的语句块之间,有可能线程的交替执行,造成线程安全问题。 解决的方法: 1、将锁的 ...
分类:
其他好文 时间:
2019-08-17 00:43:26
阅读次数:
118