java 基础: 一些稀奇古怪的好东西总结 丰富知识面

119 阅读2分钟

目录

01 java提供的线程安全自增方法

02 线程安全的List集合

 03 锁 双重校验(类单例模式)

代码了解单例模式: ->

04 读写锁

--> 模拟注册中心 注册和拉取配置


01 java提供的线程安全自增方法

private AtomicLong atomicLong = new AtomicLong(1);//给一个初始值: 1

atomicLong.getAndIncrement();// 等效a++ :1

atomicLong.incrementAndGet();// 等效++a :2

02 线程安全的List集合

private static List<String> cache = new Vector<>();//不推荐使用(影响性能)

//乐观锁 不会有线程异常了 但是数据依然存在重复

private static CopyOnWriteArrayList<String> cache = new CopyOnWriteArrayList<>();

 03 锁 双重校验(类单例模式)

代码了解单例模式: ->

单例模式: 懒汉式 饿汉式 登记式(Spring的IOC) 亲测(多线程测试)_pingzhuyan的博客-CSDN博客

private static CopyOnWriteArrayList<String> cache = new CopyOnWriteArrayList<>();
    //优化 加一个校验
    private  static List<String> selectAll() {

        if (cache.isEmpty()){
            synchronized (cache){//同步代码块
               
                if (cache.isEmpty()) {
                    System.out.println("======>IMITATION GET DATA FROM DATABASE <=======");
                    List<String> cates = Arrays.asList("CateGory-A", "CateGory-B", "CateGory-C");

                    cache.addAll(cates);
                }
            }
        }

        //模拟数据库请求数据, 添加到本地缓存中
        return cache;
    }

04 读写锁

其他锁简介(其他人的文章):

www.baidu.com/link?url=7k…icon-default.png?t=M0H8https://www.baidu.com/link?url=7k1DdnF4acONOsWML5xXG2KRLsts8P3BAJlfcKvZ0fW12O-A2pwWWJxSdjBEl3jv&wd=&eqid=eb1c3e7400077870000000026205c70c

悲观写 乐观读

这么理解 : 共享排他锁(共享独占锁) ”,“多读锁”或者“单写多读锁"

想写 -> 必须等着没有读者 没有写者才可以用 (读写互斥)

--> 模拟注册中心 注册和拉取配置

private static Map<String, String> registryMap = new ConcurrentHashMap<>();
    private static final ReentrantReadWriteLock readWriteLock =  new ReentrantReadWriteLock();

    //服务的注册
    public  static void doRegist(String serviceId, String host) { //悲观写
        readWriteLock.writeLock().lock(); //写锁
        try {
            registryMap.put(serviceId, host);
        } finally {
            readWriteLock.writeLock().unlock();//需要手动释放写锁
        }
    }

    //服务的发现(查找)
    public  static String doLookup(String serviceId) { //乐观读
       // System.out.println(serviceId);
        try{
            readWriteLock.readLock().lock();
            return registryMap.get(serviceId);
        }finally {
            readWriteLock.readLock().unlock();
        }
    }

05 ...