再次看redis的分布式锁
话说以前我们也有用到这种需求, 在一个noSql数据库中,利用key的expire功能实现的一个锁,那时候因为memcache支持不是太好, 还是略有些问题,不能在很严苛的环境中使用。
主要是一个解锁时候的问题: 当clientA获得锁之后,进行后续逻辑block在某个地方,如果这个时间足够长,长过锁的有效时间(即set在memcache中的expires时间), 当clientA完成操作,解锁的时候,如果直接使用del操作, 很有可能就会把clientB刚刚完成的锁操作(set key)给删除掉。
解决的方法是在unlock前检查一下clientA自己之前的锁是否还有效, 然后再决定是否执行del
继续阅读 »
Lock是java.util.concurrent.locks包下的接口。
Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题。
锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字(这说的是Java 5之前的情况)。
自Java 5开始,java.util.concurrent.locks包中包含了一些锁的实现,因此你不用去实现自己的锁了。但是你仍然需要去了
继续阅读 »
所谓的mouselook其实就是第一人称视角,而pointerlock技术(其实和第一人称没什么关系,只是说这个技术可以用来实现第一人称)其核心就是让鼠标隐藏并且无论怎么拖动鼠标,鼠标指针都不会跑出目标区域。
继续阅读 »
Why
读ConcurrentHashMap的时候,我们遇到的一个很大的概念就是Segment(java8之后只有在调用writeObject方法的方法的时候才会用到segment),该类继承了ReentrantLock,用于实现分段锁(乐观锁)。处于心痒痒的目的,我也尝试写了个简陋版的分段锁。
How
该Demo实现的比较简单:根据key获取或者创建Lock(获取锁的时候使用double check),然后使用该锁来同步put或者read(ConcurrentHashMap的读操作使用的volatile,这里不深入)。不足之处还请指正~
What
java实现: github
more
```java
package
继续阅读 »
在SAE上进行应用开发时,常常需要导入数据库,这时候就需要用MySQLDump工具进行本地数据库导出。
首先MySQLDump最基本的语法是这样的 mysqldump ,执行之后可以在控制台上看到SQL源码。但我第一次尝试将导出的源码上传至SAE时SAE却报错,原因是SAE的数据库管理不支持LOCK和UNLOCK语句。曾有一段时间,我是手动一行行删除LOCK语句。。30多张表那叫一个蛋疼。。后来,我翻阅了mysqlDump的help文档,发现可以添加这么一个参数--ADD-LOCKS=FALSE。几经尝试后发现果然没有LOCK语句了。 在此记录下整句命令:
sh
mysqldump --add-locks=FALSE -uroo
继续阅读 »
GIL
熟悉Python的人对GIL这货可定都不陌生, 全局解释器锁(Global Interpreter Lock)简称GIL, 这货是
Python多线程的核心机制。由于Python的线程实际是操作系统的原生线程,多个线程同时执行同一段字节码可能
会导致很多问题(比如: 内存管理的引用计数需要线程安全机制的保护),于是使用GIL这把大锁锁住其他线程,保
证同一时刻只有一个线程可以解释执行字节码。关于GIL的更多分析,
可以看David Beazley大神的研究。本文主要分析下CPython的GIL在Linux上
基于pthread的实现细节,看完这些源码后能够对GIL有更深入的理解。
GIL的定义
有人可能会想,从GIL的
继续阅读 »
环境
Lucene 6.0.0
Java "1.8.0_111"
OS Windows 7 Ultimate
线程安全
在Lucene中,打开一个IndexWrite之后,就会自动在索引目录中生成write.lock文件,这个文件中并不会有内容,不管是在索引打开期间还是在索引关闭之后,其大小都为0KB,并且在IndexWriter关闭之后,并不会删除该文件。如果同时打开多个IndexWriter的话,后打开的IndexWriter就会抛出LockObtainFailedException异常。这是个很重要的保护机制,因为若针对同一索引打开两个writer的话,会导致索引损坏。所以Lucene中的锁主要针对并发写的情况,在写
继续阅读 »
Mysql数据库中最常使用的两种表类型为 InnoDB和MyISAM。这两种类型各有优缺点,视具体应用而定。
InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。
在InnoDB表中不需要扩大锁定(lock esca
继续阅读 »
写Python多线程都知道当前线程调用a.join()后,会阻塞直到线程a运行结束,看了一下threading模块的源码,
了解了一下实现的原理。
每一个新开启的线程内部都维护着一个Condition类型的条件变量,对线程a进行join(),其实是wait()在线程a
内部的条件变量上,当线程a执行结束时,会通过notify_all()通知所有join()的线程,则阻塞的线程被唤醒,恢复执行。
以下是源码:
self.__block = Condition(Lock()) #线程内部维护的Contition变量
def __stop(self):
if not hasattr(self, '_Thread__block
继续阅读 »
改键
我之前一直以为改键的操作做没有必要,但是在尝试了一个月以后我已经没办法重新使用别人的键盘了 ———— 太慢了。
改建的意义在于将 Ctrl 映射到 Caps Lock 上。原因在于小拇指很容易按到这个大写锁定而很难按到原来 ctrl 的位置。
继续阅读 »