CONCURRENT—JDK工具篇下 CONCURRENT—JDK工具篇下第十七章 通信工具类类(java.util.concurrent)作用Semaphore限制线程的数量Exchanger两个线程交换数据CountDownLatch线程等待直到计数器减为0时开始工作CyclicBarrier作用跟CountDownLatch类似,但是可以重复使用Phaser增强的CyclicBarrierSemaphoreSemaphore这个工具类提供的功能就是多个线程彼此“打信号”。
CONCURRENT—JDK工具篇上 CONCURRENT—JDK工具篇上第⼗⼆章 线程池原理为什么要使⽤线程池创建/销毁线程消耗系统资源,线程池可以复⽤已创建的线程控制并发的数量。并发过多,资源消耗过多,可能造成服务器崩溃(主要原因)可以对线程做统⼀管理线程池的原理Java中的线程池顶层接口是Executor接口,ThreadPoolExecutor是这个接口的实现类。ThreadPoolExecutor提供的构造方法四个构造方法:// 五个参数的构造函数 (下面的构造参数前五个和此构造参数一致)publ
CONCURRENT—原理篇 CONCURRENT—NOTE2——原理篇第六章 Java内存模型基础知识并发编程模型的两个关键问题线程间如何通信?即:线程之间以何种机制来交换信息线程间如何同步?即:线程以何种机制来控制不同线程间操作发生的相对顺序有两种并发模型可以解决这两个问题:消息传递并发模型共享内存并发模型这两种模型之间的区别如下表所示:如何通信如何同步消息传递并发模型线程之间没有公共状态,线程间的通信必须通过发消息来显式进行通信发消息自然同步,发消息总是在接收消息之前,因此同步是
CONCURRENT—基础篇 CONCURRENT—NOTE1——基础篇第一章 进程与线程的基本概念使用多线程,有以下几个好处:进程间的通信比较复杂,而线程间的通信比较简单,通常情况下,我们需要使用共享资源,这些资源在线程间的通信比较容易。进程是重量级的,而线程是轻量级的,故多线程方式的系统开销更小。进程和线程的区别进程是一个独立的运行环境,而线程是在进程中执行的一个任务。他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(比如I/O):进程单独占有一定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数
maven-shade-plugin入门指南 maven-shade-plugin入门指南有时候,需要将复杂的项目, 包括各种xml文件属性文件, 类, jar等等打包到一个可以执行的jar包中, 然后用java -jar xxx.jar 来运行项目, 这样简单方便, 特别是在编写一些测试工具时,尤为重要。但是经常发现打包后的项目无法启动, 其中一大类是您项目有问题, 但是这个相对好解决, 毕竟自己的项目可以在windows下的ide中做各种调试,测试都测试好了, 在打包一般程序问题的概率就低得多了。1. Why?uber-jar 即为 su
WEB-INF与META-INF详解 WEB-INF与META-INF详解WEB-INFWEB-INF简介WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。如果想在页面中直接访问其中的文件,必须通过 web.xml 文件对要访问的文件进行相应映射才能访问。WEB-INF目录的作用/WEB-INF/web.xmlWeb应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。/WEB-INF/classes/包含了站点所有用的 class 文件,包括 s
pom中maven变量相关 文件相关${project} 是 pom.xml 的根节点, 工程的根目录project.basedir(同{project.basedir} (同project.basedir(同{basedir})就是当前pom.xml文件所在的目录。Maven内置属性说明Maven共有6类属性:内置属性Maven预定义,用户可以直接使用${basedir} 表示项目根目录,即当前pom.xml文件的目录${version}表示项目版本project.basedir同{project.
java项目中的classpath到底是什么 java项目中的classpath到底是什么顾名思义,classpath就是class的path,也就是类文件(*.class的路径)。一谈到文件的路径,我们就很有必要了解一个java项目(通常也是web项目)它在真正运行时候,这个项目内部的目录、文件的结构;这样,我们才好分析、理解classpath。开发时期的web项目结构下面,我以一个ssm的项目为例,我先把开发时候的项目的目录结构图放出来。根据maven的约定,一般我们的项目结构就像下面这样。classpath用在哪里了?而我们经常用到c
ClassPath与 FileSystem(ApplicatonContext)的区别 ClassPath与 FileSystem(ApplicatonContext)的区别ClassPathXmlApplicationContextclasspath: 默认就是指项目的classpath路径下面, classpath: 可以缺省如果要使用绝对路径,需要加上 file: 前缀表示这是绝对路径, 不可缺省示例public void testBean(){ //单配置文件方式一 BeanFactory beanFactory=new ClassPathXmlA
java动态代理 java动态代理了解代理模式代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使用了动态代理完成了代码的动态“织入”。使用代理好处还不止这些,一个工程如果依赖另一个工程给的接口,但是另一个工程的接口不稳定,经常变更协议,就可以使用一
git - stash git - stashgit stash(git储藏)可用于以下情形:发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必
checkstyle maven 插件使用 checkstyle maven 插件使用简介检查Java源文件是否与代码规范相符主要包括:Javadoc注释命名规范多余没用的ImportsSize度量,如过长的方法缺少必要的空格Whitespace重复代码maven 集成pom.xml 配置 <!--公共checkstyle标准配置,可以在子模块中覆盖,修改自定义选项--> <plugin> <groupId>o
Findbugs maven 插件使用 Findbugs maven 插件使用FindBugs™手册 http://findbugs.sourceforge.net/manual/index.html0、概述FindBugs是一个静态分析工具,它将**字节码(因此需要先编译)**与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。简而言之,FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。比较典型的,如引用了空指针(null pointer), 特定的资源(
ApplicationListener 学习 ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。这种事件机制都必须需要程序显示的触发。其中spring有一些内置的事件,当完成某种操作时会发出
Java中的static关键字解析 原文链接:https://www.cnblogs.com/dolphin0520/p/3799052.html一.static关键字的用途在《Java编程思想》P86页有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一
gdb调试 一、gdb调试简介及常用命令gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb下常用的命令。1、编译代码并启动gdbgcc -g test.cpp -o test //-g选项告诉gcc在编译程序时加入调试信息//没有这个选项就会报错:No symbol table is loaded. Use the "file" commandgdb -q test //启动gdb,加上-q选项屏蔽掉版本等无用信息2、调试选项
重构,改善既有代码的设计 -- 阅读笔记 代码的坏味道神秘命名直观明了,能够清晰地表明自己的功能和用法改变函数声明变量改名字段改名重复代码两个函数含有相同的表达式:提炼函数移动语句重组代码顺序,再提炼一个超类的不同子类中:函数上移、避免互相调用过长函数什么时候分解函数?一段代码需要以注释来说明函数做什么、如何做 (函数名解释用途)如何分解?大段代码:提炼函数太多的临时变量:以查询取代临时变量参数列表过长: 引入参数对象、保持对象完整 、以命令取代函数条件表达式: 分解条件表达式庞大
linux 快速清空文件内容 $ : > filename #其中的 : 是一个占位符, 不产生任何输出.$ > filename$ echo "" > filename$ echo /dev/null > filename$ echo > filename$ cat /dev/null > filename$ cp /dev/null filename
GIT相关(不断补充) rebase作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁!但是需要注意的是:不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)git log # 查看提交历史记录 可以按s向下翻loggit log --oneline # 可以一行展现合并commit当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记
IP地址(分类)、子网掩码、网络号、主机号、子网号 IP地址IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,而Internet中的路由器,就相当于电信局的“程控式交换机”。IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),