
希望各位大佬能点点赞,关注收藏一下哈,谢谢啦!!
目录
1.ReentrantLock(可重入锁的使用)
ReentrantLock是可重入锁,有的兄弟们可以会问,明明我们已经学了一种可重入锁synchronized了,我们为什么还要学习ReentrantLock呢?这是因为虽然它是Java的远古产物,但是ReentrantLock的功能更加丰富。
我们先来了解一下它的基本使用方法,毕竟他是个锁,最重要的就是加锁咋加。
这里和synchronized不一样,ReentrantLock是一个类,所以我们需要调用它的内部方法lock(或是tryLock区别在下面会讲)和unlock(这个很容易忘记)。
接下来是使用ReentrantLock的方法
public class demo1 {//可重入锁ReentrantLock的使用
static int count;
public static void main(String[] args) throws InterruptedException {
ReentrantLock reentrantLock = new ReentrantLock();//新建一个ReentrantLock对象
Thread t = new Thread(() -> {
try {
reentrantLock.lock();
for (int i = 0; i < 50000; i++) {
count++;//还是老例子,我们用count加加来测试能不能锁上
}
} finally {
reentrantLock.unlock();
}
});Thread t1 = new Thread(() -> {
try {
reentrantLock.lock();
for (int i = 0; i < 50000; i++) {
count++;
}
} finally {
reentrantLock.unlock();
}
});
t.start();
t1.start();
t1.join();
t.join();
System.out.println(count);
}
}

我们可以看到,结果输出就是100000,说明这锁是可以使用的。那tryLock是什么呢,事实上,它是遇到锁拿锁,没拿到锁就放弃这个锁,去干别的事情去了。而lock则是没获取到锁时阻塞等待。
这就是ReentrentLock的基本用法,前面说过它还有更多synchronized没有的功能,例如唤醒和等待,而这些功能都在Condition方法里,他的唤醒可以指定唤醒,和wait,notify不同,notify是随机唤醒。虽然ReentrantLock有如此多的功能,但是它不如synchronize方便呀,平时加锁场景我们也不需要这么多功能,并且synchronized本身就是一个代码块加锁,不会出现忘记加unlock的情况。
2.信号量semaphore的使用
信号量就相当于是一个锁,但是他有n把钥匙,当超过n个线程需要钥匙时,需要锁的线程就会进入阻塞等待状态(W

2045

被折叠的 条评论
为什么被折叠?



