Redis本身是单线程线程安全的内存数据库,但是不代表你的使用就是线程安全的
网上一个错误示例:https://www.cnblogs.com/Simeonwu/p/7881100.html,部分代码如下:
package com.me.config; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; /**
* Project: me
* Package: com.me.config
* Date: 2017/11/22 19:30
* Author: Simeon
*/ class Demo extends Thread
{
public void run()
{
Jedis jedis1 = new Jedis();
for (int i=0;i<100;i++){
int num = Integer.parseInt(jedis1.get("num"));// 1: 代码行1
num = num + 1; // 2: 代码行2
jedis1.set("num",num+"");
System.out.println(jedis1.get("num"));
}
} } public class test{ public static void main(String... args){
Jedis jedis = new Jedis();
jedis.set("num","1");
new Demo().start();
new Demo().start();
} }
如代码所示,例如当线程1在代码行读取数值为99时候,此时线程2页执行读取操作也是99,随后同时执行num=num+1,之后更新,导致一次更新丢失,这就是这个代码测试的错误之处。所以Redis本身是线程安全的,但是你还需要保证你的业务必须也是线程安全的。
注意:千万不要以为原子操作是线程安全的,原子操作只能保证命令全执行或者全不执行,并不会保证线程安全操作。例如数据库中的事务就是原子的,依旧还需要提供并发控制!!!!
原子性操作是否线程安全?
原文:https://stackoverflow.com/questions/14370575/why-are-atomic-operations-considered-thread-safe

1.原子操作是针对访问共享变量的操作而言的。涉及局部变量访问的操作无所谓是否原子的。
2.原子操作是从该操作的执行线程以外的线程来描述的,也就是说它只有在多线程环境下才有意义。
原子操作得“不可分割”包括两层含义
1.访问(读、写)某个共享变量的操作从其执行线程以外的任何线程来看,该操作要么已经执行结束要么尚未发生,
即其他线程不会“看到”该操作执行了部分的中间效果。
2.访问同一组共享变量的原子操作是不能够被交错的。
此原子性与数据库原子性有区别:最主要区别是数据库的原子性,可以被其他线程看见中间状态,否则就不会有隔离级别的事了。
Redis本身是单线程线程安全的内存数据库,但是不代表你的使用就是线程安全的的更多相关文章
- Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- redis为什么是单线程而且速度快?
redis支持的5种数据类型: 1.String(字符串) 2.List(数组或列表) 3.Set(集合) 4.Hash(哈希或字典) 5.ZSet(有序集合) 数据库的工作模式按存储方式可分为: 硬 ...
- 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- redis 为什么是单线程,为什么速度快。
redis 5中存储方式 String.List.Set.Hash.ZSet这5种 数据库的工作模式按存储方式可分为: 硬盘数据库和内存数据库.Redis 将数据储存在内存里面,读写数据的时候都不会受 ...
- Redis为什么是单线程,高并发快的3大原因详解
出处知乎:https://zhuanlan.zhihu.com/p/58038188 Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了 ...
- Redis使用单进程单线程方式的优缺点分析
[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...
- Redis为什么是单线程
转自:https://www.zhihu.com/question/23162208 https://www.zhihu.com/question/55818031:加了一些个人的理解. Redis为 ...
- Redis为什么单进程单线程也那么快
[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...
- 对Redis 单进程、单线程模型的理解(网摘)
1.基本原理 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗) (1)为什么不采用多进程或多线程处理? 多线程处理可能涉及到锁 多线程处理会涉及到线程切换而 ...
随机推荐
- Ubuntu下将现有的文件打包成deb包
转自:http://www.linuxidc.com/Linux/2008-04/12297.htm deb是Debian Linux的软件包格式.一般来说是需要通过编译源码然后制作deb包,今天由于 ...
- MVC 的 Razor引擎显示代码表达式与隐式代码表达式
隐式代码表达式 就是一个标识符,之后可以跟任意数量的方法调用("()").索引表达式("[]")及成员访问表达式(".").但是,除了在&q ...
- SQL SERVER 如何声明一个变量
DECLARE @i AS INT; ; GO 或者 ; GO 表表达式形式 ); SET @empname = (SELECT firstname + N' ' + lastname FROM HR ...
- C#基础 数据类型 类型转换
本节主要讲解数据类型和各类型之间的转换,两点都是重点,难点在于各种转换的活学活用. 一 数据类型 (一)基本数据类型 1 值类型 (1)整形 int ...
- Java基础——Oracle(七)
一.概述 pl/sql (procedural lanaguage/sql)是 oracle 在标准 sql 上的扩展 .不仅允许嵌入sql 语言,还可以定义变量和常量,允许使用条件语句和循环语句,允 ...
- 【Java基础】3、Java 位运算(移位、位与、或、异或、非)
public class Test { public static void main(String[] args) { // 1.左移( << ) // 0000 0000 0000 0 ...
- 解决vue-cli不能初始化webpack模板的问题(vue init卡住了,解决办法)
报这个错误 有人说是代理问题.我也不懂,但这个方法有用 1.去github上下载要初始化的模板 https://github.com/vuejs-templates/webpack 或者直接用git去 ...
- css兼容问题(一)
开头语:不用就忘,还是自己乖乖的记笔记吧! 正文开始: (一)如果你的页面对IE7兼容没有问题,又不想大量修改现有代码,同时又能在IE8中正常使用,微软声称,开发商仅需要在目前兼容IE7的网站上 ...
- 从零开始学习html(八)CSS选择器——上
一.什么是选择器? <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...
- 测试思想-测试设计 史上最详细测试用例设计实践总结 Part2
史上最详细测试用例设计实践总结 by:授客 QQ:1033553122 -------------------------接 Part1-------------------------- 方法:这里 ...