Lock和多线程工具笔记

ReentrantLock

介绍:用lock和unlock进行枷锁和解锁,配合try、finally来实现,

和synchronized wait notify 对比

1 有公平锁的功能

2 可中断lock.lockInterruptibly()

3CAS枷锁方式

4 trylock 可以规定时间内获得一把锁

CyclicBarrier  (人满发车)

介绍:满人发车,可以限制N个线程阻塞,当阻塞线程达到N个之后,可以执行一个方法,阻塞的线程统一执行,

使用

CyclicBarrierbarrier=newCyclicBarrier(10,()->System.out.println("满人"));

barrier.await();

System.out.println("执行");

CountDownLatch(事后明白)

介绍:设置一个数量,每个线程执行一次 减一个数量,当数量为0,可以执行wait的线程,与CyclicBarrier  不同的在于,CyclicBarrier  所有线程到数量后一起执行(多次),CountDownLatch是执行到数量后等待线程才会执行(一次)

使用:

CountDownLatchlatch=newCountDownLatch(threads.length);

latch.countDown();//数量减去1

latch.await();  等待执行的地方

MarriagePhaser

分阶段执行(安各个阶段的线程到了之后,分阶段执行,)

ReadWriteLock  

介绍:读锁 只能有一个线程修改  写锁 能有多个线程读取,场景:当需要读写多线程的场景,读写锁可以提高效率,让多个线程一起读。

使用:

staticReadWriteLockreadWriteLock=newReentrantReadWriteLock();

staticLockreadLock=readWriteLock.readLock();

staticLockwriteLock=readWriteLock.writeLock();

辅助类工具

LockSupport

介绍:LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。

它的内部其实两类主要的方法:park(停车阻塞线程)和unpark(启动唤醒线程)。

与wiat与notify的区别:

1)wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,但是park不需要获取某个对象的锁就可以锁住线程。

(2)notify只能随机选择一个线程唤醒,无法唤醒指定的线程,unpark却可以唤醒一个指定的线程。

Semaphore

介绍:限流,限制线程并发数

使用方法: 限制同事只有两个线程

Semaphores = new Semaphore(2);

try{

s.acquire();

System.out.println("running...");

}catch(InterruptedExceptione){

e.printStackTrace();

}finally{

s.release();

}

 

Exchanger

介绍:2个线程交换数据

使用:

staticExchanger<String>exchanger=newExchanger<>();

exchanger.exchange(s);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值