前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >aqs底层【java并发编程】

aqs底层【java并发编程】

作者头像
高大北
发布2022-06-15 12:53:05
2490
发布2022-06-15 12:53:05
举报
文章被收录于专栏:java架构计划训练营

luck锁底层

aqs+cas+lucksuuport

luck

代码语言:javascript
复制
 public void lock() {
        sync.lock();
    }
       public void unlock() {
        sync.release(1);
    }
    Sync extends AbstractQueuedSynchronizer

手写 luck锁(aqs+cas+lucksuuport)

代码语言:javascript
复制
public class GTFlock {
    /**
     * 0没有获取到
     * 1有线程获取到
     */
    private  AtomicInteger lockState=  new AtomicInteger(0);
    /**
     * 获取到锁的线程
     */
    private Thread getLockThread = null;
    /**
     * 没有获取到的装入链表
     */
    private ConcurrentLinkedDeque<Thread> concurrentLinkedDeque=new ConcurrentLinkedDeque<Thread>();

    /**
     * 获取
     */
    public void lock(){
        acquire();
    }
    public boolean acquire(){
        for(;;){
            if (lockState.compareAndSet(0,1)) {
                //获取到锁-成功 记录
                getLockThread=Thread.currentThread();
                System.out.println("获取到锁-成功 记录");
                return true;
            }
            //获取到锁-失败  装入到链表中
            concurrentLinkedDeque.add(Thread.currentThread());
            System.out.println("获取到锁-失败  装入到链表中");
            //阻塞
            LockSupport.park();
        }
    }
    public  boolean compareAndSet(int expect,int update){
       return   lockState.compareAndSet(expect,update);
    }
    /**
     * 释放
     */
    public boolean unlock() {
      if(getLockThread==null){
          return false;
      }
      //获取到锁的线程 如果为当前线程的话
      if (getLockThread == Thread.currentThread()) {
          boolean b = compareAndSet(1, 0);
          if (b) {
              //公平锁
              Thread first = concurrentLinkedDeque.getFirst();
              LockSupport.unpark(first);
//              //非公平锁
//              concurrentLinkedDeque.forEach((k)->{
//                  LockSupport.unpark(k);
//              });
          }
      }

        return false;
    }

    public static void main(String[] args) throws InterruptedException {
        GTFlock gtFlock = new GTFlock();
        gtFlock.lock();
        new Thread(()->{
            System.out.println(Thread.currentThread().getName() + "start");
            gtFlock.lock();
            System.out.println(Thread.currentThread().getName() + "end");
        }).start();
        Thread.sleep(1000);
        gtFlock.unlock();
    }
}

aps

node:底层双向链表 状态:0.1或者大于1,当前线程会重复会获取锁,

lucksuuport基本用法

代码语言:javascript
复制
    public static void main(String[] args) throws InterruptedException {
     Thread t1=new Thread(()->{
            System.out.println("start");
            //阻塞
            LockSupport.park();


            System.out.println("end");
        }).start();
        //唤醒阻塞的线程
        LockSupport.unpark(thread);
    }

# synchronized锁与luck锁区别
luck锁 升级过程需要自己实现。

cas回顾

代码语言:javascript
复制
    //cas回顾
    private static AtomicInteger atomicInteger = new AtomicInteger(0);
    public static void main(String[] args) throws InterruptedException {
        boolean b = atomicInteger.compareAndSet(0, 1);
        boolean b1 = atomicInteger.compareAndSet(0, 1);
        System.out.println(b); //true
        System.out.println(b1); //false
    }

Semaphore信号量基于aqs限流

代码语言:javascript
复制
public class Text05 {
    public static void main(String[] args) {
        //接口限流
        Semaphore semaphore = new Semaphore(5);
        for (int i = 0; i < 10;i++) {
            int factory=i;
            new Thread(()->{
                try {
                    semaphore.acquire();
                    //                    semaphore.release();
                    System.out.println(Thread.currentThread().getName() + factory);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

    public final void acquireSharedInterruptibly(int arg)
            throws InterruptedException {
        if (Thread.interrupted())
            throw new InterruptedException();
        if (tryAcquireShared(arg) < 0)
            doAcquireSharedInterruptibly(arg);
    }

CountDownLatch

代码语言:javascript
复制
public class Text05 {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        new Thread(()->{
            try {
                //阻塞
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        //唤醒
        countDownLatch.countDown();
        countDownLatch.countDown();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • luck锁底层
    • luck
      • 手写 luck锁(aqs+cas+lucksuuport)
        • aps
          • lucksuuport基本用法
          • cas回顾
          • Semaphore信号量基于aqs限流
          • CountDownLatch
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档