多线程进阶一些方法的使用(ReentrantLock,Semaphore,CountDownLatch,Conllections,写时拷贝和ConcurrentHashMap)

希望各位大佬能点点赞,关注收藏一下哈,谢谢啦!!

目录

1.ReentrantLock(可重入锁的使用)

2.信号量semaphore的使用

 3.CountDownLatch的使用

4.线程安全的集合类

 5.写时拷贝顺序表CopyOnWriteArraylist

 6.ConcurrentHashMap的使用和理解


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);
    }
}

a0876210fb60468b8fe890ac8577fa44.png

 我们可以看到,结果输出就是100000,说明这锁是可以使用的。那tryLock是什么呢,事实上,它是遇到锁拿锁,没拿到锁就放弃这个锁,去干别的事情去了。而lock则是没获取到锁时阻塞等待。

这就是ReentrentLock的基本用法,前面说过它还有更多synchronized没有的功能,例如唤醒和等待,而这些功能都在Condition方法里,他的唤醒可以指定唤醒,和wait,notify不同,notify是随机唤醒。虽然ReentrantLock有如此多的功能,但是它不如synchronize方便呀,平时加锁场景我们也不需要这么多功能,并且synchronized本身就是一个代码块加锁,不会出现忘记加unlock的情况。

2.信号量semaphore的使用

信号量就相当于是一个锁,但是他有n把钥匙,当超过n个线程需要钥匙时,需要锁的线程就会进入阻塞等待状态(W

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值