
Java
文章平均质量分 70
无法无天过路客
Java程序员一枚,喜欢记录收集技术文章
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java之ThreadLocal
ThreadLocal是什么首先说明,ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。ThreadLocal类提供了一种线程局部变量(ThreadLocal),即每一个线程都会保存一份变量副本,每个线程都可以独立地修改自己的变量副本,而不会影响到其他线程,是一种线程隔离的思想。实现原理ThreadLocal提供四个方法:public T get() { }public void set(T value转载 2020-07-04 19:17:06 · 2270 阅读 · 1 评论 -
线程池里面到底该设置多少个线程
一、抛出问题关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下:第一派:《Java Concurrency in Practice》即《java并发编程实践》,如下图:如上图,在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式:Nthreads=NcpuUcpu(1+w/c),其中Ncpu=CPU核心数Ucpu=cpu使用率,0~1W/C=等待时间与计算时间的比率第二派:《Programming C转载 2020-07-04 17:19:43 · 763 阅读 · 0 评论 -
使用 AOP 防止重复提交
在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端。页面提交请求携带这个提交令牌,后端验证并在第一次验证后删除该令牌,保证提交请求的唯一性。上述的思路其实没有问题的,但是需要前后端都稍加改动,如果在业务开发完在加这个的话,改动量未免有些大了,本节的实现方案无需前端配合,纯后端处理。思路自定义注解 @NoRepeatSubmit 标记所有Controller中的提交请求通过AOP 对所有标记了@NoRepeatSubmit 的方法拦截在业务方法执转载 2020-06-28 09:08:11 · 1498 阅读 · 1 评论 -
itextpdf在PDF指定位置添加文本
最近项目中需要给固定格式的PDF文件动态添加内容,记录下实现方式:使用Adobe打开PDF,点击右下角的准备表单双击名称字段,给字段添加标签productName代码 public static void main(String[] args) throws Exception{ Map<String, Object> data = new HashMap<String, Object>();//要插入的数据 data.put("pro原创 2020-05-30 07:09:12 · 12945 阅读 · 3 评论 -
Java 替换word文档文字
最近项目中需要在word文档中指定位置动态添加文字,记录下项目中的实现方式添加依赖的lib<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-excelant</artifactId> <version>3.12</version> </depende原创 2020-05-30 07:05:32 · 9478 阅读 · 10 评论 -
Java - 一个 TCP 连接可以发多少个 HTTP 请求?
曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?要搞懂这个问题,我们需要先解决下面五个问题:现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况...转载 2019-08-05 08:09:39 · 687 阅读 · 0 评论 -
Java - 请求地址最后面的 “/” 加和不加到底有什么区别?
URL 是我们每天畅游在互联网世界中最最常见的东西了,对于普通用户来说,URL 就是一个字符串,比如 http://www.justdojava.com ,但是对于我们开发者而言,除了 URL,还有一个东西叫做 URI,很多人经常搞不清楚这两个概念,本文我们就从这个话题开始。从 URN 开始在介绍这两个东西之前,我们还得先说说另外一个东西,叫做URN,URN的全程为Uniform Resour...转载 2019-08-05 08:19:47 · 806 阅读 · 0 评论 -
Java - 逃逸分析
什么是逃逸分析?关于 Java 逃逸分析的定义:逃逸分析(Escape Analysis)简单来讲就是,Java Hotspot 虚拟机可以分析新创建对象的使用范围,并决定是否在 Java 堆上分配内存的一项技术。逃逸分析的 JVM 参数如下:开启逃逸分析:-XX:+DoEscapeAnalysis关闭逃逸分析:-XX:-DoEscapeAnalysis显示分析结果:-XX:+Pri...转载 2019-08-05 08:32:30 · 181 阅读 · 0 评论 -
Java - 多线程真的会使用CPU所有的内核吗?
学习多线程的时候,我们都知道如果多个线程分配到CPU多个内核是可以并发的执行。但真的是这样的吗?先来看看电脑配置:测试电脑是单CPU,4核。按道理来说创建4个线程应该可以分配到4个内核同时执行。接下来执行测试代码看结果!public class ThreadTest { private static final int num = 1000 * 1000; public...转载 2019-08-05 08:41:21 · 3427 阅读 · 3 评论 -
Java - 对象的内存分配过程是如何保证线程安全的?
Java对象的内存分配我们知道,Java是一门面向对象的语言,我们在Java中使用的对象都需要被创建出来,在Java中,创建一个对象的方法有很多种,如使用new、使用反射、使用Clone方法等,但是无论如何,对象在创建过程中,都需要进行内存分配。拿最常见的new关键字举例,当我们使用new创建对象后代码开始运行后,虚拟机执行到这条new指令的时候,会先检查要new的对象对应的类是否已被加载,如...转载 2019-08-05 08:48:23 · 330 阅读 · 0 评论 -
单例模式
单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局的访问点。单例模式是创建型模式,单例模式在现实生活中的应用也非常广泛。例如公司CEO、部门经理等。在J2EE标准中,ServletContext、ServletContextConfig等;在Spring框架应用中ApplicationContext;数据库的连接池都是单例形式。在Java中...原创 2019-05-07 14:23:53 · 251 阅读 · 0 评论 -
Java并发编程基础--线程
什么是线程现代操作系统在运行一个程序时会为其创建一个进程,例如启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程里面可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时运行。一个Java程序从main()方法开始执行,然后按照既定...原创 2019-05-14 14:39:22 · 203 阅读 · 1 评论 -
为什么建议在集合初始化时指定集合容量大小
集合是Java开发日常开发中经常会使用到的,关于集合类,《阿里巴巴开发手册》中有一个规定:为什么会有如此建议?如果一定要设置初始容量的话,设置多少比较合适?为什么要设置初始值我们先来写一段代码测试一下,在不指定初始化容量和指定初始化容量的情况下的性能如何。 public static void main(String[] args) { int aHundredMillion = 1...原创 2019-05-07 23:57:45 · 7007 阅读 · 1 评论 -
Java并发编程--并发工具的使用和原理
Condition我们在使用synchronized的时候,经常会用到wait/notify来实现线程间的通信,在J.U.C中也提供了锁的实现机制,那在J.U.C中是否也提供了类似的线程通信的工具呢?Condition就是J.U.C提供的一个多线程协调通信的工具类,可以让某些线程一起等待某个条件,只有满足条件时,才会被唤醒。Condition的基本使用我们先写两个class,Conditio...原创 2019-05-20 21:17:57 · 344 阅读 · 0 评论 -
Java并发编程基础--volatile
在多线程并发编程中synchronized和volatile都扮演着重要角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性"。如果volatile修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。初识volatile下面这段代码演示了一个使用volatile以及没有使用volatile关...原创 2019-05-15 17:12:02 · 295 阅读 · 0 评论 -
Java并发编程基础--Synchronized
线程的合理使用能够提升程序的处理性能,同时也带来了很多麻烦,例如有一个变量i,加入一个线程去访问这个变量并进行修改,这个时候对于数据的访问和修改是没有任何问题的;但是如果多个线程对同一个变量进行修改,就会存在数据安全性的问题。对于线程安全,本质上是管理对于数据状态的访问,而且这个状态通常是共享的,可变的。共享是指这个数据变量可以被多个线程访问;可变是指这个变量的值在他的生命周期内是可以改变的。...原创 2019-05-16 09:53:58 · 331 阅读 · 0 评论 -
HashMap 和 ConcurrentHashMap
Java 7 HashMapHashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作,所以源码也非常简单。首先,我们用下面这张图来介绍 HashMap 的结构。由上图可以看出,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。图中每个蓝色的实体是嵌套类 Entry 的实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。...转载 2019-05-21 17:45:53 · 160 阅读 · 0 评论 -
Java并发编程基础--Java内存模型
Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。主内存和工作内存Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与Java编程中所说的变量有所区别,它包括了实例字段...原创 2019-05-17 15:46:23 · 529 阅读 · 0 评论 -
Java中的线程池
什么是线程池在Java中,如果每一个请求到达就创建一个新线程,那么创建和销毁线程所花费的时间和消耗系统资源都相当大,甚至可能要比在处理实际请求的时间和资源还要多。如果要在JVM中创建非常多的线程,可能会是系统由于过度消耗内存而导致系统资源不足。为了解决这个问题,就有了线程池的概念。线程池的核心逻辑就是提前创建好若干个线程放在一个容器中,如果有任务需要处理,则将任务直接分配给线程池中的线程来执行处...原创 2019-05-27 20:35:40 · 179 阅读 · 0 评论 -
Java 8 ConcurrentHashMap的使用原理
ConcurrnetHashMap是J.U.C包里面提供的一个线程安全并且高效的HashMap,所以ConcurrentHashMap在并发编程的场景中使用的频率比较高。ConcurrentHashMap是Map的派生类,API基本和HashMap类似,主要就是get、put这些方法。接下来基于ConcurrentHashMap的put操作来分析ConcurrentHashMap的源码实现。JD...原创 2019-05-23 16:59:48 · 1405 阅读 · 1 评论 -
Executor框架
在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。Java的线程既是工作单元,也是执行机制。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。Executor框架主...原创 2019-05-28 10:37:02 · 225 阅读 · 0 评论 -
面试题 - 两个int类型的数值互换(异或运算)
题目:int 类型的两个数,a = 3, b = 5,不借用任何变量,将a和b的值互换,并打印输出:a = 5; b = 3答案:public static void main(String[] args) { int a = 3; int b = 5; a = a^b; b = a^b; a = a^b; System.out.println("a = " + a + "; b ...原创 2019-05-28 15:18:04 · 2359 阅读 · 1 评论 -
代理模式的详细介绍
代理模式的应用场景在实际生活中,我们经常见到这样的场景,如:租房中介、售票黄牛、婚介、经纪人、快递、事务代理、非侵入式日只监听等,这些都是代理模式的实际体现。代理模式的定义也非常简单,是指为其它对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,代理模式属于结构性设计模式。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象,下面是代理模式的结构类图...原创 2019-05-08 15:13:26 · 14983 阅读 · 2 评论