《实战Java高并发程序设计》锁的优化及注意事项–第四章
提高锁性能的几种方法
①减少锁持有时间
②减少锁粒度:只对需要的一部分加锁,相对是锁的粗化。
③读写分离锁来替换独占锁:读与读之间不阻塞
④锁的粗化:虽然减少锁的持有时间可以有效的高并发,但是不断的请求和释放会消耗系统资源,因此将多次请求和释放都整合成一次提交
Java虚拟机对锁优化所做的努力
①偏向锁:第一个线程请求锁并拿到锁之后,下次再请求锁不需要进行同步操作,直接拿到锁,当有第二个线程竞争的时候,偏向锁失效
②轻量级锁:如果偏向锁失败,则升级为轻量级锁
③自旋锁:轻量级锁失效后,java虚拟机会假设在不久的时间内,可以拿到锁。所以让线程进行几个空循环,如果可以拿到锁则进入临界区,否则进入等待
④锁消除:取出不可能存在共享资源竞争的锁,节省不必要的锁请求时间。
人手一支笔:ThreadLocal底层原理
(1)ThreadLocal仅仅只是个变量访问的入口,像synchronize一样
(2)每一个Thread对象都有一个ThreadLocalMap对象,这个ThreadLocalMap存储着当前线程对象的引用
(3)ThreadLocalMap以当前的threadLocal对象为key,以真正的存储对象为value。调用get()方法时通过threadLocal实例就可以找到绑定在当前线程上的副本对 象。
set调用流程:
public void set(T value){
//1首先获得当前线程的对象
Thread th=Thread.currentThread();
//2获取该线程对象中的ThreadLocalMap
ThreadLocalMap map=getMap(th);
if(map!=null){
//3如果map不为空,执行set操作,以当前threadLocal对象为KEY,实际存储值为valu进行set操作
map.set(this,value);
}else{
//4如果为空,则为该线程创建ThreadLocalMap
creatMap(th,value);
}
}