JUC包下AtomicXXX类与新的同步机制:Latch Semaphore等

Long、AtomicLong、LongAdder

  • 多线程自增(i++)

    • synchronized(o) aLong++
    • CAS atomicLong.incrementAndGet();
    • 分段锁 longAdder.increment();
  • 可重入(synchronized)

各种JUC同步锁

ReentrantLock

  • Reentrantlock用于替代synchronized

  • 必须要必须要必须要手动释放锁

  • 使用sync锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放

  • 使用ReentrantLock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待

  • 使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,

  • 在一个线程等待锁的过程中,可以被打断

  • ReentrantLock还可以指定为公平锁

  • 公平锁、非公平锁

    • 非公平锁:直接争抢,抢不到再进队列
    • 公平锁:新来的线程,获取锁时,先去检查等待队列是否为空,不为空,直接进入队列排队
ReentrantLock syncchronized
手动加锁、解锁 系统自动
可重入 可重入
CAS sync(锁升级)
tryLock
lockInterruptibly
非公平(默认)、公平 非公平

CountDownLatch

  • 门闩
public class CountDownLatchTest {
    CountDownLatch latch = new CountDownLatch(10);
    latch.countDown();
    latch.await();
}
1
2
3
4
5

CyclicBarrier

  • 栅栏
public class CyclicBarrierTest {
    CyclicBarrier barrier = new CyclicBarrier(20);
    barrier.await();
}
1
2
3
4

Phaser

  • 阶段(门闩+栅栏)
public class PhaserTest {
    MarriagePhaser phaser = new MarriagePhaser();
    phaser.bulkRegister(7);
    phaser.arriveAndAwaitAdvance();
    
    phaser.arriveAndDeregister();
    phaser.register()
}
1
2
3
4
5
6
7
8

ReadWriteLock、StampedLock

  • 读写锁
    • 读 共享锁
    • 写 排它锁、互斥锁
public class ReadWriteLockTest {
    ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    Lock readLock = readWriteLock.readLock();
    Lock writeLock = readWriteLock.writeLock();
}
1
2
3
4
5

Semaphore

  • 信号灯,允许N个线程同时运行
    • 限流
public class SemaphoreTest {
    Semaphore s = new Semaphore(1);
    s.acquire();
    s.release();
}
1
2
3
4
5

Exchanger

  • 交换器
public class ExchangerTest {
    Exchanger<String> exchanger = new Exchanger<>();
}
1
2
3

锁概念

  • 乐观锁 CAS
  • 悲观锁 synchronized
  • 自旋锁 CAS AtomicXXX
  • 读写锁(排它锁、共享锁) ReadWriteLock
  • 分段锁 LongAdder、ConcurrentHashMap
总字数: 550 字  上次更新: 2023-03-14 00:25:11