Future、lock、AQS、syrchronized

Future:取得Callable接口返回值
get() : V 当前线程阻塞直到有返回值为止

FutureTask 在多线程并发下可以保证任务(传入的Callable或Runnable)只执行一次

线程中提交方法
void execute(Runnable r);
V submit(Runnable r)
V submit(Callable c)

JDK1.8 CompletableFuture

多线程三大核心:
分工:创建多个子线程执行不同的任务
JDK1.7 Fork/Join 单机版本的Map/Reduce
JDK9 Flow

互斥:任意一个时刻只有一个线程在操作临界区
synchronized
Lock

同步:线程间通信
wait、notify
Condition

死锁产生的四个必要条件:只有当以下四个条件同时满足时,程序才会死锁
1.互斥:共享资源X与Y只能被一个线程占用
2.占有且等待,线程T1已经拥有共享资源X,在等待共享资源Y的时候,不释放X
3.不可抢占,其他线程不能强行T1线程所持有的资源X
4.循环等待

Lock接口常用方法:
1.void lock();阻塞式获取锁
2.boolean tryLock();非阻塞式获取锁,获取成功继续执行任务返回true;
否则返回false线程直接退出
3.void lockInterruptibly() throws InterruptedException;
获取锁时响应中断
4.boolean tryLock(long time, TimeUnit unit)
throws InterruptedException;
获取锁时支持超时,在指定时间内未获取到锁,线程直接退出
5.Condition newCondition();获取绑定到该lock对象的等待队列,每当调用一次就产生一个新的等待队列
try {
lock.lock();
}finally {
lock.unlock();
}

AQS:同步包装器
基于链表的一个队列,此队列包装了线程节点,所有获取锁失败的线程都被包装为队列节点进入AQS中排队获取锁。

lock与AQS的关系:
lock提供锁获取成功与否的状态给AQS,AQS根据此状态来确定是否将线程置入AQS中。

公平锁与非公平锁:
公平锁:等待时间最长的线程优先获取到锁,只有lock有,lock默认采用非公平锁

读写锁
Lock中的ReentrantReadWriteLock实现读写锁

线程间通信:Condition 搭配 Lock
await()
signal()/signalAll()

sychronized与Lock的关系与区别
1.sychronized是JVM级别的锁,属于Java中的关键字,使用sychronized,加锁与解锁都是隐式的;Lock是Java层面的锁,加锁与解锁都需要显示使用。
2.lock可以提供一些synchronized不具备的功能,如响应中断、超时获取、非阻塞式获取、公平锁、共享锁如读写锁
3.sychronized的等待队列只有一个,而同一个Lock可以拥有多个等待队列(多个Condition对象)

kafka:分布式消息队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值