java人生
java人生
叹人间,美中不足今方信
这个作者很懒,什么都没留下…
展开
-
ThreadLocal的理解与正确使用
本地变量副本别人总是说用使用ThreadLocal可以避免线程不安全的问题,因为ThreadLocal使用的本地变量副本。怎么理解本地变量副本这个概念呢?线程的创建和销毁是非常消耗资源的,所以有了线程池,重复利用线程一个线程,每执行一个任务,任务中都去创建对象,例如SimpleDateFormat对象,同样很消耗资源使用ThreadLocal给当前线程绑定一个SimpleDateFormat对象,让这个线程每次执行任务,通过ThreadLocal#get方法获取SimpleDateFormat对象原创 2021-01-10 22:30:33 · 215 阅读 · 1 评论 -
ClassLoader#getResource和Class#getResource
ClassLoader#getResource(String name)ClassLoader使用双亲委派模型去查找文件资源,先Bootstrap,再ExtClassLoader,最后AppClassLoader,返回的是target/classes或者target/test-classespublic URL getResource(String name) { URL url; if (parent != null) { url = parent.getResou.原创 2020-12-27 22:15:21 · 169 阅读 · 0 评论 -
ClassLoader加载项目下的资源文件
Bootstrap、ExtClassLoader、AppClassLoader首先先要知道三种类加载器的作用。启动类加载器(Bootstrap)启动类加载器是C++实现的,负责将<JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,出于安全考虑,Bootstrap只加载包名为java、javax、sun等开头的类##扩展类加载器(ExtClassLoader)ExtClassLoader是Java实现的,是sun.misc原创 2020-12-27 22:12:10 · 1280 阅读 · 3 评论 -
Java实现自旋锁、独占锁和共享锁
简述AQS全称AbstractQueueSynchronizer,在java.util.concurrent.locks包下,是构建锁和其他同步器的框架,它的定位是能够成为实现大部分同步需求的基础。Java中基于AQS的有ReentrantLock、Semaphore、读写锁、CountDownLatch等。同步器内部维护一个volatile的int类型的成员变量表示同步状态,主要使用方式是通过子类继承同步器,实现它的抽象方法(try开头的方法)来管理同步状态。在同步器的内部提供了一个FIFO双向队列完原创 2020-12-18 23:13:20 · 267 阅读 · 1 评论 -
windows同时安装不同版本的jdk
背景我首先安装了jdk8,但是公司的maven配置的是jdk7,为了避免已有的项目出现编译环境的问题,因此又安装了jdk7。出现的问题修改环境变量JAVA_HOME,指向jdk7的路径,但是在cmd中执行java -version显示的版本仍然是jdk8的信息。原因官方会默认把java.exe、javaw.exe、javaws.exe复制到C:\Windows\System32目录下...原创 2020-02-10 15:52:49 · 289 阅读 · 1 评论 -
Java浅拷贝和深拷贝的区别
浅拷贝和深拷贝的区别浅拷贝和深拷贝都是复制对象,复制出来的对象,它们的内存地址都是重新分配的,区别在于浅拷贝对象中的引用类型和原对象中的引用类型指向同一个内存地址,而深拷贝对象中的引用类型的内存地址是重新分配的,也就是说,浅拷贝对象和原对象的引用类型的数据是同步的,深拷贝对象和原对象的引用类型的数据是互不干扰的。注意: 这里说的是引用类型!对于对象中直接定义的基本数据类型及其包装类型、Stri...原创 2019-12-31 17:01:59 · 905 阅读 · 1 评论 -
Lambda表达式
Lambda表达式是什么?实现了匿名接口的匿名方法的表达式,它有参数列表、函数主体、返回类型,也可能抛出异常。Lambda的组成Lambda表达式有三个部分参数列表箭头 -> 把参数列表与Lambda主体分隔开Lambda主体,表达式就是Lambda的返回值,可以是任意类型Lambda如何理解?任意接口有且只有一个方法(不包括默认方法),并且方法参数列表匹配Lambda参...原创 2019-11-05 20:40:06 · 174 阅读 · 0 评论 -
Java基于DelayQueue实现周期任务实例
自定义周期执行任务首先看一下执行结果:--- 开始执行任务 ---任务1:执行第1次,执行时间:13:29:49:945任务1:下次执行时间:13:30:06:769任务10:执行第1次,执行时间:13:29:49:945任务10:下次执行时间:13:29:52:595任务2:执行第1次,执行时间:13:29:49:945任务2:下次执行时间:13:30:04:773...原创 2018-04-13 14:40:48 · 1453 阅读 · 0 评论 -
Runtime.getRuntime().addShutdownHook
public class Main { /** * running 的值变化时,其他线程会得到感知 */ private static volatile boolean running = true; public static void main(String[] args) { // 正常停止应用时调用此方法,此方法使用一个线程...原创 2018-07-27 17:49:11 · 1204 阅读 · 0 评论 -
String的valueOf方法源码解读
String中的valueOf方法大致可以分为三种: String.valueOf(Object)、String.valueOf(char[])、String.valueOf(基本数据类型)案例:Integer arg = null;String.valueOf(arg); // 输出 nullString.valueOf(null); // 抛java.lang.NullPoint...原创 2018-08-21 23:30:23 · 5304 阅读 · 0 评论 -
Java IO操作常犯的错
read为什么返回int类型的数据JAVA中IO操作字节流时,每次read(读取)一个字节,返回的参数是int类型而不是byte类型,并且当读取字节时返回-1表示读取完毕。read方法为什么返回int类型?计算机是以二进制补码的方式进行数据的存储和运算,1Byte = 8bit,一个字节的取值范围:11111111~01111111 即 -128~127。当read读取数据时,读到的...原创 2018-09-13 09:43:19 · 1358 阅读 · 0 评论 -
Address already in use: JVM_Bind
ide启动工程时60104端口被占用,端口是随机的Error running 'test-project': Unable to open debugger port (127.0.0.1:60104): java.net.BindException "Address already in use: JVM_Bind"在cmd中查找端口被占用的进程的PIDC:\Users\8002...原创 2018-09-20 15:58:08 · 1509 阅读 · 0 评论 -
HashMap的扩容时机和初始化集合容量时是否根据公式计算
HashMap&amp;lt;Integer, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;(5);for (int i = 0; i &amp;lt; 5; i++) { map.put(i, i);}原创 2019-02-28 17:56:41 · 1494 阅读 · 0 评论 -
Java基本数据类型的包装类型的比较
基本数据类型的包装类型比较分为两种类型:相同类型比较Number类型比较时,只要有一个调用了拆箱,就可以用“==”比较,无论是调用intValue还是longValue。当然对于包装类的比较,建议使用equals比较。Integer id1 = 123456789;Integer id2= 123456789;// falseSystem.out.println(id1 == id...原创 2019-04-24 17:41:19 · 1814 阅读 · 0 评论 -
Java打开文件夹/文件
Java执行本地命令,可以用Runtime实现,也可以用ProcessBuilder实现。无论使用哪种方式,必须要给正确的执行命令,例如打开文件夹的命令是explorer.exe,打开txt文件notepad.exe等,注意:对于不同的文件后缀,应该使用正确的命令。执行带有参数的命令,所有命令一定要在一个数组或集合内Runtime案例:String path = System.getP...原创 2019-04-24 18:47:04 · 9087 阅读 · 1 评论 -
Java泛型使用建议(List T、List ?、List Object的使用建议)
泛型在用法上可以分成类泛型和方法泛型两种:类泛型泛型类在实例化时就要指明类型,不同的类型实例必须要重新new一次,不够灵活顶层接口:interface GenericInterface<T>子类实现:不指明泛型类型(<T>必须要带,否则子类中无法引用到T)class GenericInterfaceImpl<T> implements Gen...原创 2019-04-25 11:38:25 · 8320 阅读 · 0 评论 -
JDK动态代理和CGLib动态代理
&nbsp;&nbsp;&nbsp;&nbsp;JDK 动态代理是 JVM 根据传进来的对象,动态的创建对象的代理对象并返回。 &nbsp;&nbsp;&nbsp;&nbsp;CGLib 动态代理比较复杂,它是通过继承的方式来实现类的代理。JDK 动态代理实现步骤:定义业务接口实现业务接口定义代理类public class JDKProxy { /原创 2018-04-22 15:16:40 · 1203 阅读 · 0 评论 -
内部类:静态内部类和非静态内部类的区别
如果一个类中定义了静态成员变量和静态方法,那么静态方法可以访问静态成员变量,而无法访问非静态成员变量,并且静态成员变量和静态方法是随着类的加载而加载、非静态成员变量和方法的声明周期是由对象的声明周期控制的。 静态内部类和非静态内部类同静态方法和非静态方法类似。为什么要使用内部类 &n...原创 2018-04-18 10:53:58 · 2604 阅读 · 0 评论 -
JavaWeb RSA密码加密登录
思路:每次登录前,向后端发送请求,由RSA生成一对公钥和私钥,用redis或者数据库保存用户名对应的私钥,获取公钥中的modulus和publicExponent,分别调用String#toString(int)方法,然后传到前端,前端使用security.js加密密码,然后进行登录,在后端使用私钥解密,再验证密码的正确性。注意: - 每次登录都需要获取公钥和私钥 - 保证每次登录时,生成...原创 2018-02-05 17:00:22 · 6931 阅读 · 6 评论 -
spring cloud eureka 服务治理
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。主要包括:Eureka 服务端 1)服务注册中心Eureka 客户端 1)服务提供者 2)服务消费者本文主要内容包括:服务治...原创 2018-02-27 17:27:26 · 1655 阅读 · 0 评论 -
Log4j详解及demo
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;Log4j 是 Apache 的一个开源项目,通过使用 Log4j,我们可以控制原创 2018-03-18 15:50:39 · 1515 阅读 · 0 评论 -
Java 原子操作的实现
Java 原子操作分为处理器实现和 Java 程序实现。处理器实现: 处理器使用基于对缓存加锁或总线加锁的方式实现多处理器之间的原子操作。 (1)第一个机制是使用总线锁保证原子性。 原创 2018-03-22 13:22:50 · 1406 阅读 · 0 评论 -
Java线程的6种状态、中断、线程间通信
进程:系统中能独立运行并作为资源分配的基本单位,是一个独立运行的活动实体 线程:线程是进程中的一个实体,是系统调度和分派的基本单位Java 线程的6种状态 Java 线程在运行的生命周期中可能有6种不同的状态,在某个时刻,线程只能处于其中的一个.原创 2018-03-24 13:33:54 · 1284 阅读 · 0 评论 -
Cookie 和 Session的介绍和区别(附带CookieUtils工具类)
Cookie&nbsp;&nbsp;&nbsp;&nbsp;Cookie 是由服务器发给客户端的特殊信息,客户端将这些信息以文本文件的形式存放在本地,客户端每次向服务器发送请求时都会带上这些信息。从 HTTP 协议的角度理解 Cookie 的话,它实际上是一个通行证,弥补了 HTTP 协议是无状态的不足,服务器可以通过 Cookie 确认客户的身份。 &nbsp;&nbsp;&nbsp;&a原创 2018-03-14 16:05:41 · 1397 阅读 · 1 评论 -
volatile 原理
定义:Java 允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。volatile 如何确保共享变量的可见性? 有 volatile 修饰的共享变量进行写操作时,它的汇编指令中会有 lock 字样,称为 Lock 前缀。Lock 前缀的指令在多核处...原创 2018-03-22 09:41:16 · 1265 阅读 · 0 评论 -
浅析项目中的并发 ( 一 )
前言 控制并发的方法很多,从最基础的synchronized,juc中的lock,到数据库的行级锁,乐观锁,悲观锁,再到中间件级别的redis,zookeeper分布式锁。特别是初级程序员,对于所谓的锁一直都是听的比用的多,第一篇文章不深入探讨并发,更多的是一个入门介绍,适合于初学者,主题是“根据并发出现的具体业务场景,使用合理的控制并发手段”。...转载 2018-04-08 22:17:23 · 1309 阅读 · 0 评论 -
synchronized 的实现原理与应用
synchronized 是多线程并发编程中的一员,被称为重量级锁,但在 Java SE 1.6 对 synchronized 进行了各种优化,引入偏向锁和轻量级锁,减少了获取锁和释放锁带来的性能消耗。synchronized 实现同步的基础 Java 中的每一个对象都可以作为锁。具体表现为以...原创 2018-03-22 11:47:34 · 1260 阅读 · 0 评论 -
ActiveMQ实际应用实例
前提本例子是模拟下订单的,结合 Spring、SpringMVC 整合的 ActiveMQ。MySQL 表结构及数据CREATE TABLE `tb_cart` ( `id` int(11) NOT NULL AUTO_INCREMENT, `goods_id` int(11) NOT NULL COMMENT '商品 id', `goods_quantity` i...原创 2018-04-02 21:38:45 · 4755 阅读 · 4 评论 -
Freemarker生成商品详情静态页面
&nbsp;&nbsp;&nbsp;&nbsp;Freemarker 模板引擎技术,是一种基于模板和数据生成可用的文本的工具。例如,我们可以通过定义 JavaBean 对象的格式,从数据库提取字段名称、类型,生成 JavaBean 对象。我们还可以用它生成静态的 html 页面,提供访问效率,例如电商网站商品详情页面,布局格式相同,只是内容不一样。 &nbsp;&nbsp;&nbsp;&原创 2018-03-27 21:00:10 · 2701 阅读 · 0 评论 -
Spring MVC之mvc:resources处理静态资源
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;由于早期的 SpringMVC 不能很好地处理静态资源,所以在 web.xml 中配置 DispatcherServlet 的请求映射时,往往采用 *.do、*.xhtml 等方式,这就决定了请求 URL 必须是一个带后缀的 URL,而无法采用真正 REST 风格的 URL。 &amp;amp;nbsp;&原创 2018-03-28 10:33:16 · 11674 阅读 · 0 评论 -
多服务保证订单号唯一
以生成订单号为例:多个用户下单时,如果我们只部署了一个服务,那么在订单生成的方法上使用 synchronized 可以保证订单号唯一,但是应用部署在多个服务器上时,用户访问不同服务器上的服务时,synchronized 就不能同步了。换句话说,synchronized 只能保证一个应用中的同步。多服务下保证订单号唯一  ...原创 2018-04-03 14:27:35 · 2218 阅读 · 0 评论 -
Lock锁的使用模板及API解释
实现同步,我们可以使用 synchronized ,也可以使用 Java SE 5 之后新增的 Lock 接口。synchronized 和 Lock 的区别1)synchronized 是 Java 中的关键字;Lock 是个接口 2)synchronized 在发生异常时,会自动释放锁;Lock 必须手动释放锁,应该使用 try…finally ,避免死锁 3)Lock...原创 2018-03-28 20:41:03 · 1765 阅读 · 0 评论 -
JavaWeb三大组件的关系
Servlet、ServletConfig、ServletContext、Filter、EventListener、web.xml、Tomcat 服务器之间的关系图原创 2018-04-11 13:39:37 · 1896 阅读 · 1 评论 -
微信公众号中调用支付宝手机网站支付
在阿里官网中有解决微信公众号中调用支付宝手机网站支付的方案,就是使用官方提供的ap.js和pay.html,当然,阿里也给了get和post相关的例子: 我们以demo_post.htm为例: 可以看到script中处理了各个参数,但是这种方式...原创 2018-01-03 16:26:13 · 18076 阅读 · 21 评论