自定义锁

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 @ 2022-04-01 09:08  甜菜波波  阅读(38)  评论(0编辑  收藏  举报