自定义锁
2024-11-11 14:30:13 0 举报
自定义锁的实现逻辑
作者其他创作
大纲/内容
解锁逻辑( 当前线程处理完毕 根据逻辑需求 可对等待的线程唤醒一个或多个线程)
因为逻辑需求,需要加锁,只能一个线程来完成逻辑
真正的业务逻辑
class YccNBLock { public sync sync = new sync(); public void lock(){ // 加锁,可能会进行等待,也可能不会进入同步队列中 sync.tryAcquire(1); } public void unlock(){ //todo 当一个线程完成 应该来唤醒所有的线程/n个线程 sync.tryReleaseShared(1); } /** * todo state 状态 最高2位 1 代表着 可共享获取锁, 0 代表着 独占锁, 2 代表着 共享释放锁 3 代表着 独占释放锁 */ public final class sync extends AbstractQueuedSynchronizer{ @Override protected boolean tryAcquire(int arg) { int state = this.getState(); // todo 如果state 大于0的话,说明可以抢到锁,如果等于1 只能一个线程抢到锁 return super.tryReleaseShared(arg); } @Override protected boolean tryRelease(int arg) { // todo 释放锁, 根据逻辑释放锁,但是不一定让state+1,可以让state+n. 意思就是根据逻辑 可唤醒多个线程。 return super.tryReleaseShared(arg); } @Override protected int tryAcquireShared(int arg) { return super.tryAcquireShared(arg); } @Override protected boolean tryReleaseShared(int arg) { return super.tryReleaseShared(arg); } }}
ReentrantLock/Synchronized
可用来解决的问题:1:有时候逻辑可以多个线程同时执行,有时候只能一个线程执行来保证安全。2. 针对缓存逻辑, 比如逻辑是 从缓存中查询数据,查询到啦直接返回,查询不到会从数据库查同步到redis。 如果redis没有数据的时候, 多线程环境下,会造成多个线程从数据库查询 同步到redis的操作,会使mysql的压力过大, 平常做的是加锁,只能一个线程 从数据库同步到redis这个操作,其他的线程等待,然后等待唤醒后,还是一个线程继续走查询mysql到redis同步数据的操作(这里是双检检索,意思就是在同步逻辑再次判断 redis有数据没有,有的话返回), 但是这样的 我们其实现在redis已经有数据啦,所以可以多个线程同时唤醒进行走这个同步逻辑。
伪代码 实现
来啦一批线程
0 条评论
下一页