首页
精选文章反射【Golang】查看全文反射是一种机制,可以在运行时获取操作对象的具体类型,而且通过类型可以获取类的构造,包括成员变量以及成员方法,并且可以动态的调用这些方法或者改变这些变量的值。反射是一种元编程的实现方案。 Golang一般认为是一门静态语言。静态语言是指编译时就可以确定变量的数据类型的语言,大多数静态语言要求在使用变量之前必须声明数据的类型。常见的静态语言有C、C++、Golang等。 PHP、JavaScript、Python、Perl等语言的变量在使用前不需要声明数据类型,在运行时根据被赋值的值类型才确定数据的类型,此类语言称为动态语言。 而通过反射的能力,Golang语言可以动态的改变对象的值,甚至可以动态改变数据类型,所以反射使得Golang语言具备了动态语言的能力。 空接口 Golang 语言是静态类型语言,变量的类型在编译期间就已经确定了。 Golang 对象头部没有类型指针,通过自身无法获得类型信息,反射所需要的全部信息都来源于接口。 在传统的面向对象的语言例如Java中,所有的类都继承自一个基类(Java中称为Object),所以该类可以指向所有的对象。 Golang 弱化了传统编程语言中继承的概念,其多态通过组合方式实现,Golang 语言中不需要显式的绑定继承关系,而是通过该类是否实现了另一个接口中的方法判断该类是否实现了该接口。 所以如果有一个空接口没有任何方法,那么所有的类都可以认为继承了这个空接口。编译器在编译过程中,将全部变量的类型信息(runtime._type或reflect.rtype,两者底层数据结构一样布,可以做类型转换)保存在.rodata节中。 在运行期间,反射可以探知、修改、创建对象的类型信息和内存结构…响应式编程查看全文响应式编程(Reactive Programming)是基于数据流(Stream)模式的一种编程范式,编程范式不和特定的编程语言,编程框架甚至应用场景关联,而是更加通用的一种编程思想。常见的编程范式有命令式编程,声明式编程,函数式编程,面向对象编程,事件驱动编程。和所有的编程范式类似,响应式编程也可以分为输入,逻辑实现,输出三个组件。 在响应式编程中,输入一般通过数据流(Stream来表达) 响应式逻辑的逻辑实现一般通过函数式编程范式来实现。 响应式编程的输出一般通过观察者模式监听并且将这些数据的影响进行传播,例如前端常用的状态管理模块可以将数据和视图建立映射。 数据流 不同于命令式编程中,等执行逻辑结束之后返回输出之后,命令的生命周期就结束了。 响应式编程将数据封装为流式数据,数据流是源源不断的。生产者不停的产生新的数据,生产者和数据流的消费者之间通过推或者拉的方式进行交互。 生产者和消费者会出现速度不匹配的问题,分为两种情况: 消费速度快于生产速度 消费速度较快的时候会出现消费者等待生产者的情况,如果是同步模式,消费者可以进行阻塞,异步模式情况下,消费者会进入挂起状态,等待新的数据流的到来。 消费速度较快的时候,为了有更好的响应能力,一般采用推模式进行消费。 生产速度快于消费速度 消费能力不足的情况,为了匹配消费速度有两种方式,消费者可以丢弃数据或者暂存数据。 背压( backpressure )的方式由消费者发出信号通知生产者降低信息的发布速度,从而让信息速度之间匹配,采用背压策略之后,丢弃数据或者暂存数据的策略由生产者实现。 响应式流(Reactive Streams) 是一项非阻塞背压的异步流处理标准…ThreadLocal【Java】查看全文ThreadLocal是指线程变量,这些变量是线程私有的,不和其他线程共享,所以不存在线程安全的问题。和一般同步机制使用锁等方式进行进行临界区的互斥不同,ThreadLocal通过拷贝变量副本来进行数据隔离。存储结构 在JDK1.8之后,每个Thread会关联一个Map,称为ThreadLocalMap,存放这个线程的ThreadLocal变量,这个ThreadLocalMap的Key就是ThreadLocal变量。 在读写ThreadLocal的时候,首先获取当前线程,然后当前线程可以关联到ThreadLocalMap,再通过ThreadLocal对Map进行读写。 在JDK1.8之前的版本中,每个ThreadLocal都关联一个单独的map对象,map的Key是当前线程,value是ThreadLocal的值。 内存泄漏 ThreadLocalMap中的Key到ThreadLocal变量的引用是弱引用,弱引用在垃圾回收的时候会被优先回收。 因为ThreadLocal的生命周期和ThreadLocalMap的生命周期(即Thread的生命周期)不一致,所以可能会出现ThreadLocal被垃圾回收,但是ThreadLocalMap中的Value值依然存在,就会造成内存泄漏。 为了避免内存泄漏,在每次使用ThreadLocal变量之后,最好手动清理,不仅仅可以避免内存泄漏,也减少了线程共享(例如线程池)时候的可能引发的逻辑错误。 ThreadLocal的应用场景如下: Session会话信息 数据库链接等信息 线程不安全的工具类,例如Random,SimpleDateFormat。 |
热门分类开源Golang消息队列JavaJavascriptLinuxMysqlNLPPHP事务内存管理分布式理论分类存储常用存储开源软件操作系统画图网络编程数据库算法虚拟化前端存储理论常用算法微服务数据结构算法应用计算机原理中间件共识算法分布式分治动态规划容器并发排序架构组件绘图工具网络协议编程语言理论算法思想树缓存架构C++字符串算法工程思想搜索
算法题库
精选内容 |