自定义锁

复制代码
package TestAQS;

import sun.misc.Unsafe;

import java.lang.reflect.Field;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;

public class OtherLock {

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public Thread getThread() {
        return thread;
    }

    public void setThread(Thread thread) {
        this.thread = thread;
    }

    private static final Unsafe unsafe = reflectGetUnsafe();

    private  int state=0;

    private Thread thread;

    public  void  lock() throws NoSuchFieldException{

        for (;;){
            if (unsafe.compareAndSwapInt(this,unsafe.objectFieldOffset(OtherLock.class.getDeclaredField("state")),0,1)) {
                this.setState(1);
                this.setThread(Thread.currentThread());
                System.out.println("获取锁"+Thread.currentThread().getId());
                break;
            }

        }
    }

    public  void  unlock() throws NoSuchFieldException{
        unsafe.compareAndSwapInt(this,unsafe.objectFieldOffset(OtherLock.class.getDeclaredField("state")),1,0);
        this.setThread(null);
        System.out.println("释放锁"+Thread.currentThread().getId());
    }


    public static Unsafe reflectGetUnsafe() {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            return (Unsafe) field.get(null);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }


}
复制代码

使用锁:

复制代码
 static int num=0;
    static  void  test1() throws NoSuchFieldException,InterruptedException{
        OtherLock otherLock=new OtherLock();
        CountDownLatch countDownLatch=new CountDownLatch(100);
        for (int i=0;i<100;i++){
            new Thread(()->{
                try {
                    otherLock.lock();
                    num++;
                    otherLock.unlock();
                    countDownLatch.countDown();
                }
                catch (Exception ex){}

            }).start();
        }
     //   Thread.sleep(3000);
        countDownLatch.await();
  log.info(num+"");
    }
复制代码

 

posted @   甜菜波波  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示