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 举例,常见方法有