多个线程调用同一个对象中的不同名称的synchronized同步方法或synchronized(this)同步代码块时,调用的效果就是按顺序执行,也就是同步的,阻塞的. synchronized同步方法 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized同步方法中的代码 synchronized(this)同步代码块 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码 其实Java还支持对"任意对象"作为"对象监视器"来实现同步的功能. 这个任意对象大多数是实例变量及方法的参数 synchronized(非this对象x)同步代码块 在多个线程持有"对象监视器"为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象 继续阅读 >>


贺含悦 18/12/26 22:31:44
文章目录前言一、创建DESUtil工具类二、创建EncryptPropertyPlaceholderConfigurer类三、修改spring-dao.xml的相关配置 前言 我们常常在写数据库配置文件jdbc.properties的时候,都是以明文方式来显示,这样做其实是很不安全的,万一被黑客爬取到这些信息连接上数据库,造成数据泄露是很危险的。所以,我们想到对明文进行加密,使用密文来显示是个不错的方法~ 加密一般分为可逆加密和不可逆加密,其中可逆加密一般又分为对称加密和非对称加密,对称加密是使用了同样的密钥进行加密解密,而非对称加密则是使用公钥加密之后必须使用私钥来解密。不可逆加密之后是无法解密的。DES加密就是一种对称加密。 现阶段先不研究加密算法,主要看看在Java中如何使用DES进行加密和解密的~ 一、创建DESUtil工具类 package com.yaya.o2o.util.jdbcpwddes; import sun.misc.BASE64Decoder; import sun.misc 继续阅读 >>


贺含悦 18/12/20 19:29:28
文章目录一、MyBatis的执行流程二、自动映射和驼峰映射三、#{...}和${...}的区别四、获取自增主键值和非自增主键值五、传递多个参数的4种方式1. 顺序传参法2. 使用Map传参3. 使用注解@Param传参4. 通过JavaBean传参六、使用resultMap进行关联查询resultType和resultMap实现一对一查询小结七、动态sql1. if元素2. foreach元素八、模糊查询使用CONCAT()函数进行拼接: 一、MyBatis的执行流程 首先要有MyBatis配置文件,包括MyBatis全局配置文件和MyBatis映射文件。 MyBatis通过读取配置文件信息,构造出SqlSessionFactory,即会话工厂。 通过SqlSessionFactory会话工厂创建SqlSession会话,SqlSession的作用是操作数据库。 SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器来操作数据库的。 Executor执行器要处理的SQL信息是 继续阅读 >>


贺含悦 18/12/20 13:55:53
文章目录前言一、Kaptcha简介二、在项目中使用Kaptcha三、相关参数配置 前言 验证码是防止批量操作和恶意登录最有效的方式之一。所以一个成熟的web项目怎么能少了验证码呢?不过自己编写实现好像对我来说,有点困难阿。不过没关系,我们也可以使用一些比较方便的验证码工具,省时省力。在网上收集一些资料之后,决定使用Kaptcha组件。 一、Kaptcha简介 Kaptcha是一个基于SimpleCaptcha的验证码开源项目,是一个非常实用的验证码生成工具。我们可以利用这个工具根据我们的需求来定制生成各种样式的验证码,真是很人性化了~ 它的工作原理是调用com.google.code.kaptcha.servlet.KaptchaServlet,生成一个验证码图片,响应到客户端,同时将生成的验证码字符串放到HttpSession中。 详情可戳下方链接~ 官方网站:https://code.google.com/archive/p/kaptcha/ github源码地址:https://github.co 继续阅读 >>


贺含悦 18/12/11 01:49:34
一起来学习JVM吧 我们在学习C++的时候知道,每一个new操作都要对应相应的delete操作,否则会出现内存泄漏的问题,同理C语言的malloc和free也是如此。那么对于Java这门语言,我们却无需这样做,这一切都归结于JVM的强大,在虚拟机自动内存管理机制的帮助下,我们一般只需创建对象(申请内存),而不需要关注或者主动的销毁对象。不过,也正是因为我们把内存控制的权力交给了JVM,一旦出现内存泄漏和溢出方面的问题,如果不了解JVM如何使用内存,那么排查起来会异常困难。所以这篇博客就让我们来看看Java的内存区域~ JVM在执行Java程序的过程中会把它所管理的内存划分为JVM将内存主要划分为五个区域:方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。如下如所示: 我们一个一个来看这些区域都有什么用途~ 程序计数器(Program Counter Register) 这是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条 继续阅读 >>


贺含悦 18/07/27 01:18:40
ArrayList源码分析 ArrayList简介 我们知道,ArrayList是基于数组实现的List类,完全支持List接口的全部功能,底层实质上就是一个Object[]数组。从源码注释的第一行“Resizable-array implementation of the List interface”中,可以看出ArrayList是List接口的可变长数组实现,即这是一个动态数组,与普通的数组相比,它可以实现容量的动态增长。至于其他的特征,我们可以从类的定义中得到: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 这是ArrayList的类结构层次图: 由以上信息,我们可以知道: ArrayList:表明ArrayList支持泛型 exten 继续阅读 >>


贺含悦 18/06/29 18:06:53
Java泛型是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 即其本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。 泛型带来了哪些好处? 在没有泛型之前,当我们将一个对象放进集合中,集合会立刻忘记该对象的类型,它会把所有对象都当作Object类型来处理。所以从集合中取出对象的时候,我们通常需要进行强制类型转换,这种做法不仅造成代码的臃肿,而且容易引起异常。 在增加了泛型支持后: 集合可以记住元素的类型,并且在编译的时候检查元素类型,避免引起ClassCastException异常。将运行时的异常提前至了编译时。 所有的强制转换都是自动和隐式的,提高代码的重用率。 使代码更加简洁,程序更加健壮。 定义泛型 Java在接口、类或类的方法的声明中,声明一个泛型。多个参数时要用逗 继续阅读 >>


贺含悦 18/06/12 19:59:00
Lambda表达式是什么? Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”。 Lambda表达式是Java8的重要更新,它支持将代码块作为方法参数,允许使用更简洁的代码来创建只有一个抽象方法的接口,这种接口称为函数式接口。 一起来使用Lambda表达式吧 首先,我们先看一个关于匿名内部类的程序~ interface Command { void process(int[] target); } class ProcessArray { public void process(int[] target, Command cmd) { 继续阅读 >>


贺含悦 18/06/09 18:42:08
什么是内部类? 通俗的讲,就是把一个类放在另一个类的内部定义,这个定义在其他类内部的类就叫做内部类,这个包含内部类的类就叫做外部类。即内部类是依附于外部类而存在的。 使用内部类有什么好处呢? 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,所以就不允许同一个包中的其他类访问该类。 内部类成员可以直接访问外部类的私有数据,其实就是把内部类也当成一个外部类的成员,同一个类的成员之间自然可以互相访问。 使用匿名内部类创建那些仅需要一次使用的类会更方便,无需再去专门定义那些类。 内部类和外部类有什么区别? 内部类要定义在其他类里面。 内部类比外部类可以多使用三个修饰符:private、protected、static,外部类只能是public或默认包访问权限。 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。 非静态内部类不能拥有静态成员。 内部类主要分为哪几类? 非静态内部类(也有称作成员内部类) 静态内部 继续阅读 >>


贺含悦 18/06/07 18:26:18
MVC是什么? 在讲SpringMVC之前我们先来看一下什么是MVC模式~ MVC:MVC是一种设计模式 MVC的原理图: 分析: M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity) V-View 视图(做界面的展示:jsp,html……) C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面) Spring MVC是什么?   SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,SpringMVC就相当于是Struts2加上Spring的整合,但是这里有一个疑惑就是,SpringMVC和Spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上,又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是Spring的一个模块(类似AOP,IOC这样的 继续阅读 >>


贺含悦 18/05/07 22:08:20