做网站设计的广告公司,建设银行网站图片,网站降权分析,网站建设的售后服务流程提到锁#xff0c;大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题#xff0c;但是#xff0c;对于系统吞吐量要求更高的话#xff0c;我们这提供几个小技巧。帮助大家减小锁颗粒度#xff0c;提高并发能力。
初级技巧-乐观锁
乐观锁使用的场景是#…提到锁大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题但是对于系统吞吐量要求更高的话我们这提供几个小技巧。帮助大家减小锁颗粒度提高并发能力。
初级技巧-乐观锁
乐观锁使用的场景是读不会冲突写会冲突。同时读的频率远大于写。 悲观锁的实现 悲观的认为所有代码执行都会有并发问题所以将所有代码块都用sychronized锁住
乐观锁的实现 乐观的认为在读的时候不会产生冲突为题在写时添加锁。所以解决的应用场景是读远大于写时的场景。
中级技巧-String.intern()
乐观锁不能很好的解决大量的写冲突的问题但是很多场景下锁只是针对某个用户或者某个订单。 比如一个用户先创建session才能进行后面的操作但是由于网络的问题创建session的请求和后续请求几乎同时到达而并行线程可能会先处理后面的请求。一般情况需要对用户sessionMap加锁比如上面的乐观锁。在这样的场景下可以将锁限定在用户本身上即原来的 这个比较类似行锁和数据库表锁的概念。显然行锁的并发能力比表锁的高很多。
实用String.intern();是这种方式的具体实现。类String维护了一个字符串池。当调用intern方法时如果池已经包含一个等于此String对象的字符串该对象由equals(Object)方法确定则返回池中的字符串。可见当String 相同时总返回同一个对象因此就实现了对同一用户加锁。由于所的颗粒度局限于具体用户使得系统获得最大程度的并发。 CopyOnWriteMap 既然说到了“类似于数据库中的行锁的概念”就不得不提一下MVCCJava中CopyOnWrite类实现了MVCC。Copy On Write是这样一种机制。当我们读取共享数据的时候直接读取不需要同步。当我们修改数据的时候我们就把当前数据Copy一份副本然后在这个副本 上进行修改完成之后再用修改后的副本替换掉原来的数据。这种方法就叫做Copy On Write。 但是JDK并没有提供CopyOnWriteMap为什么下面有个很好的回答那就是已经有了ConcurrentHashMap为什么还需要CopyOnWriteMap 高级技巧 - 类ConcurrentHashMap
String.inter()的缺陷是类 String 维护一个字符串池是放在JVM perm区的如果用户数特别多导致放入字符串池的String不可控有可能导致OOM错误或者过多的Full GC。怎么样能控制锁的个数同时减小粒度锁呢直接使用Java ConcurrentHashMap或者你想加入自己更精细的控制那么可以借鉴ConcurrentHashMap的方式将需要加锁的对象分为多个bucket每个bucket加一个锁伪代码如下