一丶JUC是什么
java.util.concurrent是我们java中常用的并发包,简称juc。
二丶LOCK接口
1.和synchronized对比:
之前使用的锁都是synchronized关键字锁,来进行,但是这样锁不够灵活,而且不能自己控制,但是如使用lock锁,我们就可以进行自己来控制何时使用何时取消。
2.关于lock锁的具体实现:
1. ReentrantLock :重入锁
表示已获取锁的线程重新进入的时候不会阻塞,但是会增加一次锁的次数。
2. ReentrantReadWriteLock:读写重入锁
规定了多个排斥:读读不互斥,读写互斥,写写互斥。
3.Lock锁的使用:
static Integer num = 0;
public static void main(String[] args) {
ReentrantLock reentrantLock = new ReentrantLock();
for (int i = 0; i < 1000; i++) {
new Thread(()->{
reentrantLock.lock();
num++;
reentrantLock.unlock();
}).start();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("-------"+num);
}
1.lock.lock()其实是对线程竞争
2.lock.unlock()其实是对线程的重新竞争,和释放。
4.关于lock的原理的探索
线程的安全必要几个因素:
1.线程必须抢占共享资源,该资源必须标识是否被抢占
2.如果资源被抢占,要把阻塞的线程放到一个队列中并阻塞
3.关于重入:资源中要标识当前被那个线程占有锁
4.线程的释放,和重新竞争
源码解读:
5.公平锁和非公平锁
公平锁就是遵循先等待的先执行,后等待的后执行,非公平就是一起抢占。