构建高性能服务(二)java高并发锁…
来源:互联网 发布:喷火战斗机 知乎 编辑:程序博客网 时间:2024/06/05 05:30
提高系统并发吞吐能力是构建高性能服务的重点和难点。通常review代码时看到synchronized是我都会想一想,这个地方可不可以优化。使用synchronized使得并发的线程变成顺序执行,对系统并发吞吐能力有极大影响,我的博文
那么对于必须使用synchronized的业务场景,这里提供几个小技巧,帮助大家减小锁粒度,提高系统并发能力。
初级技巧 - 乐观锁
乐观锁适合这样的场景:读不会冲突,写会冲突。同时读的频率远大于写。
以下面的代码为例,悲观锁的实现:
- public
Object get(Object key) { -
{ -
== null){ -
set some values -
} -
-
map.get(key); -
} - }
- public
Object get(Object key) { -
synchronized(map) { -
if(map.get(key) == null){ -
// set some values -
} -
-
return map.get(key); -
} - }
- public
Object get(Object key) { -
Object val = -
= null)map.get(key) == { -
当map取值为null时再加锁判断 -
{ -
= null)map.get(key) == { -
set some value to map... -
} -
} -
} -
-
map.get(key); - }
- public
Object get(Object key) { -
Object val = null; -
if((val = null)map.get(key) == { -
// 当map取值为null时再加锁判断 -
synchronized(map) { -
if(val = null)map.get(key) == { -
// set some value to map... -
} -
} -
} -
-
return map.get(key); - }
中级技巧 - String.intern()
乐观锁不能很好解决大量写冲突问题,但是如果很多场景下,锁实际上不是针对某个用户或者某个订单。比如一个用户必须先创建session,才能进行后面的操作。但是由于网络原因,创建用户session的请求和后续请求几乎同时达到,而并行线程可能会先处理后续请求。一般情况,需要对用户sessionMap加锁,比如上面的乐观锁。在这种场景下,使用String.inter()是一种更高效的办法。类String 维护一个字符串池。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由equals(Object)方法确定),则返回池中的字符串。可见,当String相同时,String.intern()总是返回同一个对象,因此就实现了对同一用户加锁。由于锁的粒度局限于具体用户,使系统获得了最大程度的并发。
- public
void doSomeThing(String uid) { -
{ -
... -
} - }
- public
void doSomeThing(String uid) { -
synchronized(uid.intern()) { -
// ... -
} - }
高级技巧 - 类ConcurrentHashMap
String.inter()的缺陷是类 String 维护一个字符串池是放在JVMperm区的,如果用户数特别多,导致放入字符串池的String不可控,有可能导致OOM错误或者过多的FullGC。怎么样能控制锁的个数,同时减小粒度锁呢?JavaConcurrentHashMap提供了一种很好的借鉴方式,将需要加锁的对象分为多个bucket,每个bucket加一个锁,伪代码如下:
- Map
locks new= Map(); - List
lockKeys new= List(); - for(int
number 1: - 10000){ -
Object lockKey = Object(); -
lockKeys.add(lockKey); -
locks.put(lockKey, Object()); - }
-
- public
void doSomeThing(String uid) { -
Object lockKey = lockKeys.get(uid.hash() % lockKeys.size()); -
Object lock = locks.get(lockKey); -
-
{ -
do something -
} - }
- 构建高性能服务(二)java高并发锁…
- 构建高性能服务(二)java高并发锁的3种实现
- 构建高性能服务(二)java高并发锁的3种实现
- 构建高性能服务(二)减小锁粒度 提高Java并发吞吐实例
- 构建高性能高并发Java系统
- 构建高性能高并发Java系统
- 构建高性能高并发Java系统
- 构建高性能高并发Java系统
- 构建高性能高并发Java系统
- 构建高性能高并发Java系统
- 构建高性能高并发Java系统
- 构建高性能服务(一)ConcurrentSkipListMap和链表构建高性能Java Memcached
- 构建高性能服务(一)ConcurrentSkipListMap和链表构建高性能Java Memcached
- 构建高性能服务(一)ConcurrentSkipListMap和链表构建高性能Java Memcached
- 构建高性能、高并发的JAVA应用系统
- java高并发、高性能
- 构建高性能服务(一)
- java开发高性能网站(高并发)
- WebSokcet之ServerEndPoint
- 相对熵和交叉熵
- richedit ole得到位图
- Synchronized同步的考虑(包含利用…
- Mysql安装小坑
- 构建高性能服务(二)java高并发锁…
- 抓包工具原理和使用
- Mysql中的schema设计
- WebSocket API
- websocket error code&n…
- 我为什么从程序员转行做了产品经理
- Swift4.0--Photos框架的使用附从相簿中获取图片
- 解压版(免安装版)mysql数据库安装
- websocket 传输文件及图片的…