Archive

Posts Tagged ‘并发’

读java concurrency in practice

八月 18th, 2016 No comments

这是一本好书(Java源码作者Doug Lea是作者之一),关于Java并发的各个方面,介绍的很深入,应该算是进阶一类,很多地方不好理解。一开始打算阅读英文版,倒不是英文看不懂,不过还是有很多内容的确理解起来很费劲,尤其是老外写书的风格(废话特别多 = = 一页密密麻麻的英文,让人找不到关键点在哪儿),看几页就没兴趣再看下去哎…后有幸找到了中文翻译版,而且翻译的很有水准,拜谢翻译工作者韩锴和方妙。

找不到翻译版的同学,可以私信我提供。

阅读更多…

ReentrantReadWriteLock简单分析

六月 16th, 2016 No comments

AQS的另一个实现,可重入的读写锁,其中读锁是共享锁,写锁是排他锁。用法和ReentrantLock基本一致。 阅读更多…

可重入锁、ReentrantLock、AQS、Condition

六月 13th, 2016 No comments

本文简单介绍可重入锁的概念,简单介绍java中内置的synchronized锁java.util.concurrent.locks.ReentrantLock,然后大致介绍下ReentrantLock的代码实现。ReentrantLock和AQS代码逻辑真心复杂和难懂,尤其是AQS中Node的ws值中的SIGNAL值的用法和线程park/unpark的用法,持续几周看了好几天终于算是给弄明白了! 阅读更多…

防止数据库数据重复的几种方法

一月 7th, 2015 No comments

在某些数据库表中,比如记录的是一些关联关系,比如某个人关注了另外一个人,person_id和target_id,这种数据表的数据如果出现了重复,可能会引起程序上其他地方的诡异bug,要尽量保持数据的唯一性。这种数据重复,要不就是插入数据时根本没有做存在检查,或者是可能由二次提交产生的比较麻烦的并发情况。

1. 代码层做同步控制,利用锁机制
2. 在数据查重时利用数据库事务 + SQL层加入排他锁,select * from xx where ... lock for update
3. 数据库层Unique检查,建表时加入unique的索引

前两个方法在代码层面,比较容易控制,第三种方法最彻底但是出现冲突时候会报异常。

不过如果在高并发的情况下,使用第三种方式然后主动捕获异常,也是很不错的甚至是最好的。