《实战Java高并发程序设计》锁的优化及注意事项--第四章

《实战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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值