构建高性能服务(二)java高并发锁的3种实现
提高系统并发吞吐能力是构建高性能服务的重点和难点。通常review代码时看到synchronized是我都会想一想,这个地方可不可以优化。使用synchronized使得并发的线程变成顺序执行,对系统并发吞吐能力有极大影响,我的博文?http://maoyidao.iteye.com/blog/1149015?介绍了可以从理论上估算系统并发处理能力的方法。
?
那么对于必须使用synchronized的业务场景,这里提供几个小技巧,帮助大家减小锁粒度,提高系统并发能力。
?
初级技巧 - 乐观锁乐观锁适合这样的场景:读不会冲突,写会冲突。同时读的频率远大于写。
?
以下面的代码为例,悲观锁的实现:
?
Map locks = new Map();List lockKeys = new List();for(int number : 1 - 10000) { Object lockKey = new Object(); lockKeys.add(lockKey);locks.put(lockKey, new Object());}public void doSomeThing(String uid) { Object lockKey = lockKeys.get(uid.hash() % lockKeys.size()); Object lock = locks.get(lockKey); synchronized(lock) { // do something }}?
?
关于高性能缓存的设计,请参考构建高性能服务系列之一:http://maoyidao.iteye.com/blog/1559420
?
1 楼 maoyidao 11 小时前 还有一种思路,如果读远远大于写,写全部用一个单线程完成。使用volatile关键字。volatile只提供可见性,即线程能发现最新的修改值,但不能保证原子性。因此需要使用单线程写,但多并发的读线程可以立刻看到最新的修改。