提高锁性能
- 如何提高锁性能
- 减小锁持有的时间
- 减小锁粒度
- 锁分离
- 锁粗化
- java虚拟机对锁优化的处理
- 偏向锁:如果一个线程获得了锁,那么锁就进入偏向模式,当这个线程再次请求锁时,无须再做任何同步操作,这样可以节省大量有关锁申请的操作,适合几乎没有锁竞争的场合。
- 轻量级锁:虚拟机只是简单的将对象头部作为指针,指向持有锁的线程堆栈的内部,以此判断一个线程是否持有锁。如果获得轻量级锁成功,则可顺利进入临界区,否则,当前线程膨胀为重量级锁。
- 自旋锁:如果当前线程暂时无法获得锁,但是什么时候获得是一个未知数,也许在将来几个CPU时钟周期之后就可以得到锁,如果这样,简单粗暴地挂起线程可能是一种得不偿失的选择,因此系统会进行一次赌注,它会假设不久的将来可以获得该锁,于是虚拟机会让当前线程做几个空循环。如果若干次能得到锁,则顺利进入临界区,否则,将线程挂起。
- 锁消除:java虚拟机在JIT编译时,通过对运行上下文扫描,去除不可能存在的共享资源竞争的锁,通过锁消除可以节省毫无意义的请求锁时间。例如没有资源竞争的情况下使用线程安全的集合vecotr,这里锁竞争无意义,java虚拟机会自动去除这些锁。
-
ThreadLocal
- 简单使用:只有当前线程可以访问的一个局部变量,只有当前线程可以访问数据。这是为每个应用分配不同的对象,需要在应用层面保证,它只是起到一个容器的作用。
-
无锁
- CAS算法:它包含三个参数CAS(V,E,N),V表示要更新的变量,E表示预期值,N表示新值。仅当V等于E时,才会将V的值设置为N,如果V值和E值不同,则说明已经有其他线程对该值做了更新,则当前线程什么都不做。