一、引入场景 1. 打印方法执行的耗时 2. 在before和after记录当前时间,两者相减得到doSomething()的耗时 3. 多线程下,共享变量开始时间startTime可能会被别的线程改写,不是线程安全的 4. 多线程解决方法: a. 加锁,性能不好 b. ThreadLocal 二、 ...
分类:
其他好文 时间:
2019-10-26 21:12:01
阅读次数:
104
1. redis加锁分类 redis能用的的加锁命令分表是INCR、SETNX、SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说 ...
分类:
其他好文 时间:
2019-10-25 13:11:22
阅读次数:
58
1. 锁分类 MySQL中主要分为全局锁、表级锁和行锁三类。本篇主要涉及全局锁和表级锁。 2. 全局锁 全局锁是对整个数据库实例进行加锁。 Flush table with read lock(FRTWRL)该命令用于加全局锁。使用该命令之后,整个库处于只读状态,不能执行数据的增删改查、建表、修改表 ...
分类:
数据库 时间:
2019-10-19 16:32:41
阅读次数:
122
摘要「HHBchain」中使用了 CCXT 而且目前的项目是使用 celery 做的分布式,多个 CCXT 对象会在多个 celery worker 进程中被重复使用,这样就会存在 nonce 被重复的问题,所以这里必须对 CCXT 对象加锁。目前在研究锁方案。「django-easy-valida... ...
分类:
其他好文 时间:
2019-10-17 17:29:13
阅读次数:
61
背景 小明在一家在线购物商城工作,最近来了一个新需求,需要他负责开发一个商品秒杀模块,而且需求很紧急,老板要求必须尽快上线。 方案 小明一开始是这么做的,直接用数据库锁进行控制,获取秒杀商品数量并加锁,如果数量大于零则成功,否则秒杀失败。 写了并发线程,跑了一下,没问题,搞定!但是,小明转头一想,老 ...
分类:
其他好文 时间:
2019-10-17 13:59:35
阅读次数:
96
加锁: 1.同步实例方法,锁是当前实例对象 2.同步类方法,锁的是当前类对象 3.同步代码块,锁是括号里面的对象 原理: JVM内置锁通过synchronized使用,通过内部对象Monitor(监视器锁)实现,基于进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层操作系统的M ...
分类:
其他好文 时间:
2019-10-16 00:31:04
阅读次数:
93
重入锁 重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题。 1、线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。 2、锁的最终释放 ...
分类:
编程语言 时间:
2019-10-15 19:27:16
阅读次数:
89
在了解ReentrantLock之前,我们首先回忆一下 synchronized ,synchronized是java内置的关键字,锁的获取和释放都是由jvm实现,因此用户就不需要显示的去释放锁,是一种独占的加锁方式,但是虽然方便,也有一定的弊端: 1 ...
分类:
其他好文 时间:
2019-10-13 20:44:24
阅读次数:
92
一 互斥锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如下 如何控制,就是加锁处理。而互斥锁的意思就是互相排斥,如果把多个进程比喻为多个人,互斥锁的工作原理就是多个人都要去争抢同一个资源:卫生间,一个人 ...
分类:
其他好文 时间:
2019-10-13 11:16:36
阅读次数:
73
通过setnx()方法尝试加锁,如果当前锁不存在,返回加锁成功。 如果锁已经存在则获取锁的过期时间,和当前时间比较,如果锁已经过期,则设置新的过期时间,返回加锁成功。 通过setnx()方法尝试加锁,如果当前锁不存在,返回加锁成功。 如果锁已经存在则获取锁的过期时间,和当前时间比较,如果锁已经过期, ...
分类:
其他好文 时间:
2019-10-12 19:10:41
阅读次数:
100