Java基础--常见的几种锁
一、悲观锁和乐观锁 多线程访问共享资源时,会对共享资源有增删改查的操作; 悲观锁在线程操作共享资源期间,枷锁成功就会禁止其他线程操作共享资源; 乐观锁不限制各个线程对共享资源的操作,但是当线程要更新共享资源时,会先判断该资源有没有被其他线程修改,如果共享资源没有被其他线程更新,则更新共享资源,如果被其他资源更新,则根据自己的需求另作处理; 悲观锁适合写操作较多的场景,加锁可以保证数据正确性,java的synchronized和Lock都是悲观锁实现 乐观锁适合读操作较多的场景,不加锁可以提升性能,java的原子操作类就是基于乐观锁实现 二、自旋锁和非自旋锁 2.1 自旋锁 多线程获取共享资源时,若资源被其他线程占用,该线程就会等待获取锁资源,但是线程不会放弃已经拿到的CPU时间片,通过自旋等待共享资源被释放 2.2 非自旋锁 非自旋锁再等待其他线程施放锁的时候,会让出CPU时间片,使线程进入休眠,所释放后,才会重新获取CPU时间片 三、无锁、偏向锁、轻量级锁和重量级锁 偏向锁通过对比Mark Word处理加锁问题,避免执行CAS操作,轻量级锁通过CAS操作和自旋来解决加锁问题,避免线程....