先把结论抛出来:redis无法正确实现分布式锁!即使是redis单节点也不行!redis的所谓分布式锁无法用在对锁要求严格的场景下,比如:同一个时间点只能有一个客户端获取锁。 首先来看下单节点下一般redis分布式锁的实现,其实就是个set: 加锁: /** * 尝试获取分布式锁 * @param ...
分类:
其他好文 时间:
2019-12-19 17:40:29
阅读次数:
98
概念 ReentrantLock,可重入锁。在多线程中,可以通过加锁保证线程安全。 ReentrantLock,是基于AQS实现的。 加锁和解锁 加锁: 解锁 内部类Sync继承AQS,因此可以维护状态变量state,通过acquire()获取state、release()释放state。后文会涉及 ...
分类:
其他好文 时间:
2019-12-19 11:25:28
阅读次数:
84
wait() 方法是线程间通信的方法之一 必须在 synchronized 方法或 synchronized 修饰的代码块中使用,否则会抛出 IllegalMonitorStateException 只能在加锁的对象调用 wait() 方法 加锁的对象调用 wait() 方法后,线程进入等待状态,直 ...
分类:
其他好文 时间:
2019-12-17 15:08:08
阅读次数:
126
锁的粒度 表锁:锁住整个表,加锁和释放速度快,能避免死锁。因为锁住的范围大,并发性低。 页锁:锁住的范围以及性能基于表锁和行锁之间,能支持的主要是BDB(BerkeleyDB)引擎。 行锁:以行为单位进行锁定,粒度最小,并发性高。每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外, ...
分类:
数据库 时间:
2019-12-17 10:23:31
阅读次数:
91
概念 AQS全称 AbstractQueuedSynchronizer。 AQS是一个并发包的基础组件,用来实现各种锁,各种同步组件的。它包含了state变量、加锁线程、等待队列等并发中的核心组件。 ReentrantLock、Semaphore、CountDownLatch、FutrueTask, ...
分类:
其他好文 时间:
2019-12-17 00:54:44
阅读次数:
126
MyISAM特点 1)不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁; 2)不支持事务 3)不支持外键 4)不支持崩溃后的安全恢复 5)在表有读取查询的同时,支持往表中插入新纪录 6)支持BLOB和TEXT的前500个字符索引,支持全文索引 7)支持延迟更新索 ...
分类:
数据库 时间:
2019-12-16 20:55:37
阅读次数:
97
在 linux 环境下用 Python 进行项目开发过程中经常会遇到多个进程对同一个文件进行读写问题,而此时就要对文件进行加锁控制,在 Python 的 linux 版本下有个 fcntl 模块可以方便的对文件进行加、解锁控制。 import fcntl file_path = "/home/ubu ...
分类:
编程语言 时间:
2019-12-14 19:01:35
阅读次数:
114
谈谈多线程 多线程真的是一个很宽的话题,可以聊一串东西线程安全、同步机制、锁、线程运行状态、CAS原子操作、线程池、甚至是JMM、内存可见性等。 而在日常coding中更多地关注是创建线程池提交多个任务执行,分析哪些数据结构被多个线程共享访问,在哪个方法上加锁?如果程序运行一段时间出问题,可能jst ...
分类:
编程语言 时间:
2019-12-14 17:38:52
阅读次数:
103
6.824 Lab 2: Raft Part 2A Due: Feb 23 at 11:59pm Part 2B Due: Mar 2 at 11:59pm Part 2C Due: Mar 9 at 11:59pm Introduction This is the first in a serie ...
分类:
其他好文 时间:
2019-12-14 15:43:05
阅读次数:
80
刚开始写博客.. 写的太low。 1、数据库的两种读,每种读读的数据版本不一样,所以也称为MVCC,即多版本并发控制 a) 快照读 select from where xxx 这种形式的都是快照读。 b) 当前读 update , insert ,delete ,select xx from xx ...
分类:
数据库 时间:
2019-12-13 09:14:45
阅读次数:
169