• 自定义锁


    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+"");
        }
  • 相关阅读:
    delphi中屏蔽浏览器控件右键菜单
    书目:一些
    数据库ADONETDataAdapter对象参考
    数据库ADONET排序、搜索和筛选
    易语言数据类型及其长度
    易语言数据类型的初始值
    数据库ADONET使用DataAdapter对象
    ADONET使用DataSet处理脱机数据
    数据库ADONETOleDbParameter对象参考
    在项目中添加新数据集
  • 原文地址:https://www.cnblogs.com/tiancai/p/16085161.html
Copyright © 2020-2023  润新知