java中的锁

锁宏观与微观

  1. 悲观锁
    重量级锁
  2. 乐观锁
    自旋锁
    避免用户线程和内核的切换的消耗,无需进入阻塞状态挂起
    参数设置:
    JDK1.6中-XX:+UseSpinning开启;
    -XX:PreBlockSpin=10 为自旋次数;
    JDK1.7后,去掉此参数,由jvm控制;
    轻量级锁
    轻量级锁是由偏向所升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁;
    偏向锁
    如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁

总结:

在所有的锁都启用的情况下线程进入临界区时会先去获取偏向锁,如果已经存在偏向锁了,则会尝试
获取轻量级锁,启用自旋锁,如果自旋也没有获取到锁,则使用重量级锁,没有获取到锁的线程阻塞
挂起,直到持有锁的线程执行完同步块唤醒他们;

偏向锁是在无锁争用的情况下使用的,也就是同步开在当前线程没有执行完之前,没有其它线程会执
行该同步块,一旦有了第二个线程的争用,偏向锁就会升级为轻量级锁,如果轻量级锁自旋到达阈值
后,没有获取到锁,就会升级为重量级锁;

java锁

  1. synchronized 重量级锁
  2. ReentranteLock 重入锁
  3. ReentrantReadWriteLock 是一个读写锁,读操作加读锁,可以并发读,写操作使用写锁,只能单线程写;

ConcurrentHashMap

解释:当多线程访问容器里不同数据段的数据时,线程间锁竞争压力小,从而可以有效的提高并发访问效率