CAS

Web.xml详解

做~自己de王妃 提交于 2021-01-13 22:13:07
这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论。 ---题记 Web.xml详解: 1.web.xml加载过程(步骤) 首先简单讲一下,web.xml的加载过程。当启动一个WEB项目时,容器包括(JBoss、Tomcat等)首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。 1. 启动WEB项目的时候,容器首先会去它的配置文件web.xml读取两个节点: <listener></listener>和<context-param></context-param>。 2. 紧接着,容器创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文。 3. 容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。 4. 容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,在监听中会有contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,系统调用Listener的该方法,在这个方法中获得:

科研大牛们怎么读文献

ぐ巨炮叔叔 提交于 2021-01-13 04:31:35
来源:知乎问答 孟凡康, 中国科学院大学 遗传学专业博士在读 读文献要 读人,读典和读新 。 科研大牛们读文献的技巧很多时候是指导给学生。很幸运,我的导师在指导学生方面非常尽职尽责,在平时的闲聊之中也教给了我很多的文章阅读方法,同时加上我平时以及总结的文献阅读和获取技巧,希望在这里分享给大家。 以下是我这篇回答的主要内容: 读文献要读人,读典和读新。 1. 如何读人?我的经验 2. 如何读典?如何获取经典的文章? 3. 如何读新?如果对新的文章进行获取和筛选? 一. 读人 读人是我的导师在与我晚上聊天时,推荐我去进行系统性文献阅读的方法。为什么要读人呢?一个很重要的原因在于,如果只是平时零散的阅读文献,很难去把握一个科研领域发展的脉络。可能不同的领域存在差别,但是很多时候一个领域往往是由为数不多的几个实验室推动的。如果能够对这些实验室的相关文章进行系统性的梳理,那么一定在了解相关领域的发展脉络上有更加深刻的了解,同时还可以通过思考,预测这个实验室未来的发展方向,这对我们布局以后的科研方向具有很好的促进作用。 那么如何读人呢?想必不同的人有不同的思路和方法,那么在此我也来分享一下我的方法。 就在那晚与导师闲聊之后,我便开始了自己的尝试,我第一个想要读的人是David Liu,是基因编辑、定向进化等领域的开拓者和领导者,是单碱基编辑技术,PACE定向进化技术的开创者。

谈谈Java中的volatile

不打扰是莪最后的温柔 提交于 2021-01-12 16:51:28
内存可见性   volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。   为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看如下代码 public class TestVolatile { boolean status = false; /** * 状态切换为true */ public void changeStatus(){ status = true; } /** * 若状态为true,则running。 */ public void run(){ if(status){ System.out.println("running...."); } } }   上面这个例子,在多线程环境里,假设线程A执行changeStatus()方法后,线程B运行run()方法,可以保证输出"running....."吗?    答案是NO!   这个结论会让人有些疑惑,可以理解。因为倘若在单线程模型里,先运行changeStatus方法,再执行run方法,自然是可以正确输出"running...."的;但是在多线程模型中

分布式锁优化

独自空忆成欢 提交于 2021-01-12 07:04:00
首先,我们一起来看看这个问题的背景? 前段时间有个朋友在外面面试,然后有一天找我聊说:有一个国内不错的电商公司,面试官给他出了一个场景题: 假如下单时,用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景? 他说他当时没答上来,因为没做过没什么思路。其实我当时听到这个面试题心里也觉得有点意思,因为如果是我来面试候选人的话,应该会给的范围更大一些。 比如,让面试的同学聊一聊电商高并发秒杀场景下的库存超卖解决方案,各种方案的优缺点以及实践,进而聊到分布式锁这个话题。 因为库存超卖问题是有很多种技术解决方案的,比如悲观锁,分布式锁,乐观锁,队列串行化,Redis原子操作,等等吧。 但是既然那个面试官兄弟限定死了用分布式锁来解决库存超卖,我估计就是想问一个点:在高并发场景下如何优化分布式锁的并发性能。 我觉得,面试官提问的角度还是可以接受的,因为在实际落地生产的时候,分布式锁这个东西保证了数据的准确性,但是他天然并发能力有点弱。 刚好我之前在自己项目的其他场景下,确实是做过高并发场景下的分布式锁优化方案,因此正好是借着这个朋友的面试题,把分布式锁的高并发优化思路,给大家来聊一聊。 库存超卖现象是怎么产生的? 先来看看如果不用分布式锁,所谓的电商库存超卖是啥意思?大家看看下面的图: 这个图,其实很清晰了,假设订单系统部署两台机器上

6、jsp和servlet在xml得映射和web.xml介绍

|▌冷眼眸甩不掉的悲伤 提交于 2021-01-12 07:03:37
本身肯定会学的东西,今天想起来了,那就记一下吧。 做那个后端的界面时候,有人反应不要hou.jsp,说设个路由随便编乱点,别人猜不到。我也没听懂设个路由是什么意思。 最后一想,这不就是个jsp映射嘛。 jsp映射和servlet映射就一条不同,servlet还可以通过@WebServlet(“”)方法。 顺便转载一下web.xml的介绍,方便以后查看 转载自:http://blog.csdn.net/believejava/article/details/43229361 Web.xml详解: 1.web.xml加载过程(步骤) 首先简单讲一下,web.xml的加载过程。当启动一个WEB项目时,容器包括(JBoss、Tomcat等)首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。 1. 启动WEB项目的时候,容器首先会去它的配置文件web.xml读取两个节点: <listener></listener>和<context-param></context-param>。 2. 紧接着,容器创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文。 3. 容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对

告诉你一个 AtomicInteger 的惊天大秘密!

淺唱寂寞╮ 提交于 2021-01-10 14:53:41
作者 | cxuan 来源 | Java建设者(ID:javajianshe) 头图 | CSDN 下载自视觉中国 i++ 不是线程安全的操作,因为它不是一个原子性操作。 那么,如果我想要达到类似 i++ 的这种效果,我应该使用哪些集合或者说工具类呢? 在 JDK1.5 之前,为了确保在多线程下对某 基本数据类型 或者 引用数据类型 运算的原子性,必须依赖于外部关键字 synchronized ,但是这种情况在 JDK1.5 之后发生了改观,当然你依然可以使用 synchronized 来保证原子性,我们这里所说的一种线程安全的方式是原子性的工具类,比如 「AtomicInteger、AtomicBoolean」 等。这些原子类都是线程安全的工具类,他们同时也是 Lock-Free 的。下面我们就来一起认识一下这些工具类以及 Lock - Free 是个什么概念。 了解AtomicInteger AtomicInteger 是 JDK1.5 新添加的工具类,我们首先来看一下它的继承关系 与 int 的包装类 Integer 一样,都是继承于 Number 类的。 这个 Number 类是基本数据类型的包装类,一般和数据类型有关的对象都会继承于 Number 类。 它的继承体系很简单,下面我们来看一下它的基本属性和方法 AtomicInteger 的基本属性

Java并发编程:synchronize、Lock、ReenTrantLock 的区别

*爱你&永不变心* 提交于 2021-01-10 09:53:11
synchronize 和Lock: 1、synchronize 系java 内置关键字;而Lock 是一个类   2、synchronize 可以作用于变量、方法、代码块;而Lock 是显式地指定开始和结束位置 3、synchronize 不需要手动解锁,当线程抛出异常的时候,会自动释放锁;而Lock则需要手动释放,所以lock.unlock()需要放在finally 中去执行 4、性能方面,如果竞争不激烈的时候,synchronize 和Lock 的性能差不多,如果竞争激烈的时候,Lock 的效率会比synchronize 高 5、Lock 可以知道是否已经获得锁,synchronize 不能知道。Lock 扩展了一些其他功能如让等待的锁中断、知道是否获得锁等功能;Lock 可以提高效率。 6、synchronize 是悲观锁的实现,而Lock 则是乐观锁的实现,采用的CAS 的尝试机制 ------------------------------------------------------------------------------------------------- synchronize 和 ReenTrantLock: 除开上面和Lock 的区别,还有一下的一些区别: 1、ReenTrantLock 可以中断锁的等待,提供了一些高级功能 2

java 并发编程-volatile、CAS、synchronize

大兔子大兔子 提交于 2021-01-10 09:52:41
前言: 从17年9月份开始断断续续的接触java开发,对java的知识体系了解甚少,都是浮在各种语法的使用上,浅尝则止,使用最多的关键字莫过于String List Map Thread,对java语法体系的内部逻辑没有深入学习过,希望通过笔记分享来加深对java的学习,知其然,知其所以然 今天要分享的知识:java并发编程-volatile、CAS、synchronize volatile 1、保证可见性:可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值 产生不可见的原因:cpu结构,各个cpu的cache之间数据不可见 场景:共享变量ShareV = false,线程T1在cpu1上运行,将ShareV修改为true,线程T2在cpu2上运行,通过判断ShareV的值进行逻辑处理,若Cache1中ShareV没有更新到主存,Cache2中ShareV的值仍然为false,导致共享变量的值在多线程下不一致 作用:被定义为volatile的变量在Cache中发生变化时会被立即更新到主存,同时使该值在其他Cache的副本失效,Cache会从主存拉取该变量的最新值 应用实例: public class VolatileTest { private volatile static boolean flag = false ; public

Java 并发AQS

拈花ヽ惹草 提交于 2021-01-09 04:36:47
转载出处: http://www.cnblogs.com/waterystone/ 一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。   以下是本文的目录大纲: 概述 框架 源码详解 简单应用   若有不正之处,请谅解和批评指正,不胜感激。   请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/waterystone/p/4920797.html   手机版可访问: https://mp.weixin.qq.com/s/eyZyzk8ZzjwzZYN4a4H5YA    二、框架   它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里volatile是核心关键词,具体volatile的语义,在此不述。state的访问方式有三种: getState() setState() compareAndSetState()   AQS定义两种资源共享方式

JeecgBoot使用感受

£可爱£侵袭症+ 提交于 2021-01-07 00:54:24
JeecgBoot使用心得 ​ JeecgBoot 是一款基于代码生成器的低代码开发平台。采用前后端分离架构:SpringBoot2.x,Ant Design&Vue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式-> 代码生成器模式-> 手工MERGE智能开发), 帮助解决Java项目70%的重复工作,让开发更多关注业务逻辑。既能快速提高开发效率,帮助公司节省成本,同时又不失灵活性! ​ JeecgBoot在提高UI能力的同时,降低了前后分离的开发成本,JeecgBoot还独创在线开发模式(No代码概念),一系列在线智能开发:在线配置表单、在线配置报表、在线图表设计、在线设计流程等等 1、技术架构 后端技术: SpringBoot + Mybatis-plus + Shiro_1.4.0 + Jwt_3.7.0 + Swagger-ui + Redis 前端技术: Ant-design-vue + Vue + Webpack 其他技术: Druid(数据库连接池)、Logback(日志工具) 、poi(Excel工具)、 Quartz(定时任务)、lombok(简化代码) 项目构建: Maven、docker 前端效果: 全新的swagger-ui界面——