2021
09-16
09-16
Java源码解析之详解ImmutableMap
一、案例场景遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样——publicstaticfinalMap<String,String>dayMap=newHashMap<>();static{dayMap.put("Monday","今天上英语课");dayMap.put("Tuesday","今天上语文课");dayMap.put("Wednesday","今天上数学课");dayMap.put("Thursday","今天上音乐课");dayMap.put("Sunday","今天上编程课");......}当时,我就...
继续阅读 >
目录一、前言二、准备java代码三、生成头文件四、gcc环境安装五、生成动态链接库六、总结一、前言首先回顾一下jni的主要功能,从jdk1.1开始jni标准就成为了java平台的一部分,它提供的一系列的API允许java和其他语言进行交互,实现了在java代码中调用其他语言的函数。通过jni的调用,能够实现这些功能:通常情况下我们一般使用jni用来调用c或c++中的代码,在上一篇文章中我们用了下面的流程来描述了native方法的调用过程:JavaCod...
一.AQS入队规则我们仔细分析一下AQS是如何维护阻塞队列的,在独占方式获取资源的时候,是怎么将竞争锁失败的线程丢到阻塞队列中的呢?我们看看acquire方法,这里首先会调用子类实现的tryAcquire方法尝试修改state,修改失败的话,说明线程竞争锁失败,于是会走到后面的这个条件;这个addWaiter方法就是将当前线程封装成一个Node.EXCLUSIVE类型的节点,然后丢到阻塞队列中;第一次还没有阻塞队列的时候,会到enq方法里面,我们仔细...
目录高并发模式初探C语言的高并发案例Java的高并发实现Go的高并发实现Rust的高并发实现总结高并发模式初探在这个高并发时代最重要的设计模式无疑是生产者、消费者模式,比如著名的消息队列kafka其实就是一个生产者消费者模式的典型实现。其实生产者消费者问题,也就是有限缓冲问题,可以用以下场景进行简要描述,生产者生成一定量的产品放到库房,并不断重复此过程;与此同时,消费者也在缓冲区消耗这些数据,但由于库房大小有限,...
目录一、AtomicReference基本使用1.1、使用synchronized保证线程安全性二、了解AtomicReference2.1、使用AtomicReference保证线程安全性2.2、AtomicReference源码解析2.2.1、getandset2.2.2、lazySet方法2.2.3、getAndSet方法2.2.4、compareAndSet方法2.2.5、weakCompareAndSet方法一、AtomicReference基本使用我们这里再聊起老生常谈的账户问题,通过个人银行账户问题,来逐渐引入AtomicReference的使用,我们首...
目录一、认识Semaphore1.1、Semaphore的使用场景1.2、Semaphore使用1.3、Semaphore信号量的模型二、Semaphore深入理解2.1、Semaphore基本属性2.2、Semaphore的公平性和非公平性2.3、其他Semaphore方法一、认识Semaphore1.1、Semaphore的使用场景Semaphore的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前...
一、Executor接口的理解Executor属于java.util.concurrent包下;Executor是任务执行机制的核心接口;二、Executor接口的类图结构由类图结构可知:ThreadPoolExecutor继承了AbstractExecutorService接口;AbstractExecutorService接口实现了ExecutorService接口;ExecutorService继承了Executor接口;因此以下部分主要讲解ThreadPoolExecutor类。三、Executor接口中常用的方法voidexecute(Runnablecomma...
目录一、常规编码方式二、代理模式概述三、静态代理3.1、什么是静态代理3.2、代码示例四、Java字节码生成框架五、什么是动态代理六、JDK动态代理机制6.1、使用步骤6.2、代码示例七、CGLIB动态代理机制7.1、使用步骤7.2、代码示例八、什么情况下使用动态代理九、静态代理和动态代理对比十、总结一、常规编码方式在学习代理之前,先回顾以下我们的常规编码方式:所有interface类型的变量总是通过向上转型并指向某个实例的。1)...
目录一、为什么需要包装类二、装箱与拆箱三、不简单的Integer.valueOf四、Object类可以接收所有数据类型五、包装类在集合中的广泛使用六、数据类型转换一、为什么需要包装类在Java中,万物皆对象,所有的操作都要求用对象的形式进行描述。但是Java中除了对象(引用类型)还有八大基本类型,它们不是对象。那么,为了把基本类型转换成对象,最简单的做法就是将基本类型作为一个类的属性保存起来,也就是把基本数据类型包装一...