悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每 次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传 统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写 锁等,都是在做操作之前先上锁。再比如 Java 里面的同步原语 synchroniz ...
分类:
其他好文 时间:
2020-04-25 00:42:12
阅读次数:
181
Redis Lua 这个技术,我之前就在关注,今天有空,我把项目中基于Redis实现的ID生成器改成用lua脚本实现,防止并发id冲突问题 Redis中使用Lua的好处 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他 ...
分类:
其他好文 时间:
2020-04-23 00:18:56
阅读次数:
76
1:类介绍 在jdk里面提供的原子操作类有4中类型分别是针对原子更新基本类型如Integer,Boolean,Long类型,原子更新数组如AtomicIntegerArray,AtomicLongArray和AtomicReferenceArray对应的是整形数组,长整型数据以及引用数组,还有原子更 ...
分类:
其他好文 时间:
2020-04-14 20:14:17
阅读次数:
98
函数中被defer关键字声明的语句会被延迟执行,延迟到函数结束之前才执行。 首先对于函数中的return语句,它是由两步组成,而非一个原子操作: return=赋值给返回值+返回 func f1(x int) int { //x=5 defer func() { x++ }() return x } ...
分类:
编程语言 时间:
2020-04-12 10:17:49
阅读次数:
78
睡眠与唤醒 Peterson解法和TSL解法都是正确的,但它们都有忙等待的缺点。这些解法在本质上是这样的: 当一个进程想进入临界区时,先检查是否允许进入,若不允许,则进程将踏步等待,直到许可为止 。 这种方法不仅浪费CPU时间,还可能引起预料不到的结果,即: 优先级翻转问题(priority inv ...
分类:
编程语言 时间:
2020-04-11 15:51:23
阅读次数:
97
为什么会有这个需求: 例如一个简单用户的操作,一个线程去修改用户状态,首先在在内存中读出用户的状态,然后在内存中进行修改,然后在存到数据库中。在单线程中,这是没有问题的。但是在多线程中由于读取,修改,写入是三个操作,不是原子操作(同时成功或失败),因此在多线程中会存在数据的安全性问题。 这个问题的话 ...
分类:
其他好文 时间:
2020-04-08 19:01:03
阅读次数:
66
概述 redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关参考文 ...
分类:
其他好文 时间:
2020-04-08 13:36:59
阅读次数:
65
目录 JDK的Atomic原子操作类实现机制 通过JDK源码,品AtomicXXXFieldUpdater原子更新器及其优势 品Netty源码,学习原子更新的最佳实现方式 本篇文章大概3300字,阅读时间大约15分钟 如果仔细阅读过Netty的线程调度模型的源码,或者NIO线程对象及其线程池的创建源 ...
分类:
其他好文 时间:
2020-04-07 09:33:54
阅读次数:
92
原子操作 处理器自动保证基本内存操作的原子性,如对同一个缓存行里进行16/32/64位的操作是原子的。复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。 Atomic 在Atomic包里一共有12个类,四种原子更新方式,原子更新基本类型,原子更新数组,原子更新引用 ...
分类:
其他好文 时间:
2020-04-06 19:05:23
阅读次数:
75
并发的途径: 1.多线程并发访问 2.抢占式并发访问 3.中断并发访问 4.多核(SMP),核间并发访问 常用防止并发访问手段 1.原子操作 原子操作可以保护数据每次操作不被其它操作打断,从而实现数据不被其它操作修改,达到保护数据的目的 使用结构体 typedef struct { int coun ...
分类:
其他好文 时间:
2020-04-06 15:35:08
阅读次数:
83