JavaEE(系列15) -- 多线程(JUC中常见的类)

JUC----- java.util.concurrent(并发)

1. ReentrantLock

1. 可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全.

2. ReentrantLock 也是可重入锁. "Reentrant" 这个单词的原意就是 "可重入".

1. ReentrantLock 的用法:

  • lock(): 加锁, 如果获取不到锁就死等.
  • trylock(超时时间): 加锁, 如果获取不到锁, 等待一定的时间之后就放弃加锁.
  • unlock(): 解锁
ReentrantLock lock = new ReentrantLock();
-----------------------------------------
lock.lock(); 
try {  
// working  
} finally {  
lock.unlock()  
} 

 2. ReentrantLock 和 synchronized 的区别:

  • synchronized 是一个关键字, 是 JVM 内部实现的(大概率是基于 C++ 实现). ReentrantLock 是标准库的一个类, 在 JVM 外实现的(基于 Java 实现).
  • synchronized 使用时不需要手动释放锁. ReentrantLock 使用时需要手动释放. 使用起来更灵活,但是也容易遗漏 unlock.
  • synchronized 在申请锁失败时, 会死等. ReentrantLock 可以通过 trylock 的方式等待一段时间就放弃.
  • synchronized 是非公平锁, ReentrantLock 默认是非公平锁. 可以通过构造方法传入一个 true 开启公平锁模式.

 3. 如何选择使用哪个锁?

  • 锁竞争不激烈的时候, 使用 synchronized, 效率更高, 自动释放更方便.
  • 锁竞争激烈的时候, 使用 ReentrantLock, 搭配 trylock 更灵活控制加锁的行为, 而不是死等.
  • 如果需要使用公平锁, 使用 ReentrantLock.

2. 原子类 

原子类内部用的是 CAS 实现,所以性能要比加锁实现 i++ 高很多。原子类有以下几个

  • AtomicBoolean: AtomicBoolean是通过原子方式更新 boolean 值。AtomicBoolean用于诸如原子更新标志之类的应用程序,但是不能替换boolean类使用。
  • AtomicInteger:AtomicInteger 是一个支持原子操作的 Integer 类,它提供了原子自增方法、原子自减方法以及原子赋值方法等。
  • AtomicIntegerArray:.AtomicIntegerArray表示一个int数组。AtomicIntegerArray中的int元素可以原子更新。AtomicIntegerArray还支持比较并交换功能。
  • AtomicLong:AtomicLong是作用是对长整形进行原子操作。
  • AtomicReference:AtomicReference类提供了对象引用的非阻塞原子性读写操作,并且提供了其他一些高级的用法
  • AtomicStampedReference:解决ABA问题引进版本号.

 以 AtomicInteger 举例,常见方法有

JavaEE(系列15) -- 多线程(JUC中常见的类)_第1张图片

你可能感兴趣的:(JavaEE,java-ee,java,开发语言)