网上一个错误示例: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本身是单线程线程安全的内存数据库,但是不代表你的使用就是线程安全的的更多相关文章

  1. Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  2. redis为什么是单线程而且速度快?

    redis支持的5种数据类型: 1.String(字符串) 2.List(数组或列表) 3.Set(集合) 4.Hash(哈希或字典) 5.ZSet(有序集合) 数据库的工作模式按存储方式可分为: 硬 ...

  3. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  4. redis 为什么是单线程,为什么速度快。

    redis 5中存储方式 String.List.Set.Hash.ZSet这5种 数据库的工作模式按存储方式可分为: 硬盘数据库和内存数据库.Redis 将数据储存在内存里面,读写数据的时候都不会受 ...

  5. Redis为什么是单线程,高并发快的3大原因详解

    出处知乎:https://zhuanlan.zhihu.com/p/58038188 Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了 ...

  6. Redis使用单进程单线程方式的优缺点分析

    [转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...

  7. Redis为什么是单线程

    转自:https://www.zhihu.com/question/23162208 https://www.zhihu.com/question/55818031:加了一些个人的理解. Redis为 ...

  8. Redis为什么单进程单线程也那么快

    [转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...

  9. 对Redis 单进程、单线程模型的理解(网摘)

    1.基本原理 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗) (1)为什么不采用多进程或多线程处理? 多线程处理可能涉及到锁 多线程处理会涉及到线程切换而 ...

随机推荐

  1. quartz部署出现找不到表的情况,错误提示: Table 'heart_beat.QRTZ_LOCKS' doesn't exist

    描述一下,本地可以,部署到Linux就不行,Linux上的数据库是本地直接拷贝上去的,项目环境是Spring Boot2.1.Shiro.MyBatis.Redis.swagger.Bootstrap ...

  2. 在UWP中实现自己的MVVM设计模式

    其实写这篇博文的时候我是拒绝的,因为这牵扯到一个高大上的东西——"框架".一说起这个东西,很多朋友就感觉有点蒙了,尤其是编程新手.因为它不像在代码里面定义一个变量那么显而易见,它是 ...

  3. Tomcat意外宕机分析

    之前在网上看过一篇文章,是讲Tomcat进程意外退出的,我看完感觉好奇,自己也测试了下,果然是有这种问题,所以自己也借此总结一下. 先简单说下测试过程,先创建一个web服务启动 test.sh,内容如 ...

  4. CSS属性之position讲解

    postion 属性定义了一个元素在页面布局中的位置以及对周围元素的影响.该属性共有5个值: position: static position: inherit position: relative ...

  5. vue-cli脚手架之package.json

    package.json文件配置及其含义,这个是vue-cli自动生成的文件,先贴一张代码及其含义: { "name": "secondproject",//模 ...

  6. JMeter JMeter远程分布式联机性能测试

    JMeter远程分布式联机性能测试   by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 Java JDK版本:1.8 1.  JMeter分布式测试简介 当一个 ...

  7. 聊聊HTTP gzip压缩与常见的Android网络框架

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/5835990.html 进入主题之前,我们先来看一下客户端与服 ...

  8. 项目开发常见字符串处理模型-strstr-while/dowhile模型

    strstr-whiledowhile模型用于在母字符串中查找符合特征的子字符串. c语言库提供了strstr函数,strstr函数用于判断母字符串中是否包含子字符串,包含的话返回子字符串的位置指针, ...

  9. [Android] 获取系统顶部状态栏(Status Bar)与底部导航栏(Navigation Bar)的高度

    Android一些设备都有上下两条bar,我们可以获取这些bar的信息.下面放上获取高度的代码.代码注释和其他方法有空再放. 原文地址请保留http://www.cnblogs.com/rossone ...

  10. android recovery 升级之USB设备挂载

    Recovery升级过程,通常会从两个地方获取升级包update.zip升级,一般在线升级,会把升级包下载到cache分区,本地升级会从usb或者tf卡中升级.本文讨论下,本地USB升级时,无法挂载U ...