ConcurrentHashMap

位运算

位运算控制CRUD权限
@Data
public class TestDemo {
    //查询权限
    public static final int ALLOW_SELECT = 1 << 0;//0001
    //插入权限
    public static final int ALLOW_INSERT = 1 << 1;//0010
    //更新权限
    public static final int ALLOW_UPDATE = 1 << 2;//0100
    //删除权限
    public static final int ALLOW_DELETE = 1 << 3;//1000
    //权限状态
    private int flag;
    //设置用户权限
    public void setPer(int per) {
        flag = per;
    }
    //再增加用户权限,1个或者多个
    public void enable(int per) {
        flag = flag | per;
    }
    //删除用户权限
    public void disable(int per) {
        flag = flag & ~per;
    }
    //判断用户权限
    public Boolean isAllow(int per) {
        return ((flag & per) == per);
    }
    //判断用户没有的权限
    public Boolean isNotAllow(int per) {
        return ((flag & per) == 0);
    }
    @Test
    public void testDemo1() {
        //默认全部权限
        int flag = 15;
        TestDemo testDemo = new TestDemo();
        testDemo.setFlag(flag);
        //去除掉删除和更新权限
        testDemo.disable(ALLOW_DELETE | ALLOW_UPDATE);
        System.out.println("ALLOW_SELECT=" + testDemo.isAllow(ALLOW_SELECT));
        System.out.println("ALLOW_DELETE=" + testDemo.isAllow(ALLOW_DELETE));
        System.out.println("ALLOW_UPDATE=" + testDemo.isAllow(ALLOW_UPDATE));
        System.out.println("ALLOW_INSERT=" + testDemo.isAllow(ALLOW_INSERT));
    }
}
ALLOW_SELECT=true
ALLOW_DELETE=false
ALLOW_UPDATE=false
ALLOW_INSERT=true
JDK1.8后的实现
与1.7相比
主要数据结构和关键变量
Put时候做了什么


 
 数据的实际初始化
 
 
 
 
Get时候做了什么

扩容
更多并发容器

ConcurrentSkipListMap, ConcurrentSkipListSet
链表和跳表
为什么hashMap不适应跳表
ConcurrentLinkedQueue
阻塞队列

 
概念
生产者和消费者
延迟队列实战
/*
 * 实现一个订单延迟功能,实现Delayed接口。重写compareTo,getDelay方法
 * 这里框架针对于超时取消通用
 * */
public class ItemVo<T> implements Delayed {
    //数据
    private T date;
    //订单的过期时间 ms单位
    private long activeTime;
    public ItemVo(T date, long activeTime) {
        this.date = date;
        //将时间转换为ns,加上当前纳秒数
        this.activeTime = TimeUnit.NANOSECONDS.convert(activeTime, TimeUnit.MILLISECONDS) + System.nanoTime();
    }
    public T getDate() {
        return date;
    }
    public long getActiveTime() {
        return activeTime;
    }
    @Override
    public int compareTo(Delayed o) {
        long d = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
        return (d == 0) ? 0 : (d > 0 ? 1 : -1);
    }
    //返回元素剩余的时间
    @Override
    public long getDelay(TimeUnit unit) {
        long d = unit.convert(this.activeTime - System.nanoTime(), TimeUnit.NANOSECONDS);
        return d;
    }
}
/*
* 订单实体类
* */
public class OrderBean {
    //订单号
    private String code;
    //订单金额
    private Integer money;
    public OrderBean(String code, Integer money) {
        this.code = code;
        this.money = money;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public Integer getMoney() {
        return money;
    }
    public void setMoney(Integer money) {
        this.money = money;
    }
}
public class TestDemo {
    private DelayQueue<ItemVo<OrderBean>> delayQueue;
    public TestDemo(DelayQueue<ItemVo<OrderBean>> delayQueue) {
        this.delayQueue = delayQueue;
    }
    //插入数据
    public Thread setOrder() {
        return new Thread(() -> {
            //5s后过期
            OrderBean tb = new OrderBean("TB2022040401", 888);
            ItemVo<OrderBean> tbVo = new ItemVo<>(tb, 2000);
            delayQueue.add(tbVo);
            System.out.println("淘宝订单2s后到期:" + tb.getCode());
            //6s后过期
            OrderBean jd = new OrderBean("JD2022040401", 888);
            ItemVo<OrderBean> jdVo = new ItemVo<>(jd, 2000);
            delayQueue.add(jdVo);
            System.out.println("京东订单2s后到期:" + jd.getCode());
        });
    }
    //获取过期的数据
    public Thread getOrder() {
        return new Thread(() -> {
            while (true) {
                try {
                    ItemVo<OrderBean> take = delayQueue.take();
                    OrderBean date = (OrderBean) take.getDate();
                    System.out.println("拿到过期的订单:" + date.getCode());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public static void main(String[] args) {
        DelayQueue<ItemVo<OrderBean>> itemVos = new DelayQueue<>();
        TestDemo testDemo = new TestDemo(itemVos);
        Thread setThread = testDemo.setOrder();
        Thread getThread = testDemo.getOrder();
        setThread.start();
        getThread.start();
    }
}
淘宝订单2s后到期:TB2022040401
京东订单2s后到期:JD2022040401
拿到过期的订单:TB2022040401
拿到过期的订单:JD2022040401
面试常问











