深入理解CAS(CompareAndSet)
前言
学习java并发始终绕不开CAS(CompareAndSet),但如果只从java的角度来学习、理解CAS,又会觉得了解的不够深入。笔者从CPU发展史和Java发展史的角度深入探索了CAS的前世今生,希望能给读者带来更多的信息输入。
学习java并发始终绕不开CAS(CompareAndSet),但如果只从java的角度来学习、理解CAS,又会觉得了解的不够深入。笔者从CPU发展史和Java发展史的角度深入探索了CAS的前世今生,希望能给读者带来更多的信息输入。
记得很早之前,java开发为了支持文件上传,需要引入其他依赖,做一些复杂的配置,才能实现文件上传。具体来说,有两种方式,一种是在HttpFilter上做文章,引入一个HttpFilter,在HttpFilter中判断请求中是不是上传文件,如果是上传文件的请求,就用MultipartHttpServletRequest包装原始HttpServletRequest,并透传到下游,这个类内部会解析文件,下游只需要用instanceof判断HttpServletRequest是不是MultipartHttpServletRequest,如果是的话,强转后调用相关方法即可获取文件;在引入springmvc后,spring将这个逻辑包装到了DispatcherServlet中,只需要在spring中配置MultipartResolver实例Bean,DispatcherServlet就会做这个包装,甚至可以在入参中定义MultipartFile参数,spring就会把文件映射到入参中。
而从 servlet 规范3.0 开始,HttpServletRequest接口本身就要求支持文件获取,也就是说凡是支持servlet规范3.0的产品,都应该内部支持文件解析获取。顺便查了一下,servlet3.0规范在2009年11月份就定稿了,tomcat 也在 7.0版本上支持了servlet3.0,这个时间是2011年3月份,也就是说2011年后,不需要引入其他依赖、额外配置就能实现文件解析获取。
假设我们在容器中直接启动的是我们的程序,例如java -jar xxx.jar
。如果执行docker stop <container>
,则意味着调用了kill -15 1
。
对于java程序而言,它会接收到SIGTERM
信号,Runtime的ShutdownHook钩子将会被回调。像spring这样的框架,都会把自己加入到ShutdownHook回调中,在回调中执行destroy、close等生命周期操作。
所以说如果只是执行kill -15 PID
命令,java程序是可以优雅的关闭。但同时我们也能看出,如果在ShutdownHook钩子中执行很耗时的操作,那么执行这个命令短时间内也不会停止java程序。所以在ShutdownHook中尽量不要做耗时长的操作,而是应该处理一些IO关闭、缓存刷新的操作。
Hive是一个使用类SQL管理分布式存储上大规模数据集的数据仓库,它提供了命令行工具和JDBC驱动程序帮助用户使用Hive。
hive基于hadoop,它的具体功能如下:
以上内容来自Apache Hive官网,hive在1.x版本中只支持MapReduce,从2.x开始开始支持其他分布式计算引擎。
在之前的文章记hadoop伪分布式安装中,我们已经成功地安装了Hadoop,并且在文章在java中通过API读写hdfs入门学习中实现了通过java代码访问hdfs文件系统,接下来就进入到了MapReduce的学习。
最近在尝试从mybatis sql模板中获取参数信息,期间学习了mybatis内部的一些结构,接下来笔者就向大家分享mybatis相关知识和具体代码实现。