- 博客(140)
- 收藏
- 关注
原创 ThreadLocal的使用
ThreadLocal解决的是变量在不同线程间的隔离性,也就是不同线程拥有自己的值,不同线程中的值是可以放入ThreadLocal类中进行保存的。ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。可以通过set(T)方法来设置一个值,在当前线程
2018-03-13 21:48:05 373
原创 join方法的使用
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束。如果主线程想等待子线程完成之后再结束,就要用到join()方法。public class Run { public static void main(String[] args) { try{ Object lock=new Object();
2018-03-13 21:14:38 616
原创 线程间通信
一、等待/通知(wait/notify)机制的实现 1、等待(wait) 1.1、作用:使当前执行代码的线程进行等待。 1.2、wait()方法是Object类的方法。而不是Thread的方法。 1.3、该方法用来将当前线程置于“预执行队列”中,并且在wait()所在的代码行处停止执行,直到接到通知或被中断为止。 1.4、在调用wait()之前,线程必须获得该对象的对象级别锁,即只能在同...
2018-03-13 20:48:24 314
原创 Volatile的实现原理
Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。它在某些情况下比synchronized的开销小,因为它不会引起线程上下文的切换和调度。访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞。可见性的意思是当一个线程修改一个共享变量时,另一个线程能读到这个修改的值。如果一个字段被声明为 volatile,java线程内存模型确保所有线
2018-03-08 20:04:34 333
原创 synchronized同步语句块(二)
一、静态同步synchronized方法与synchronized(class)代码块 1、静态同步synchronized方法 关键字synchronized可以应用在static静态方法上,是对当前的java文件对应的Class类进行持锁。public class HasSelfPrivateNum {//对静态方法加锁 public synchronized static vo
2018-03-08 11:59:28 447
原创 synchronized同步语句块(一)
用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待较长时间。可以使用synchronized同步语句块。public class NoSysnTest { public void play(){ try{ //其他无关紧要的部分,放到代码块外部,节省时间
2018-03-08 09:49:14 731
原创 Synchronized同步方法
“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。1**、方法内的变量为线程安全的** 方法内部的私有变量,则不存在“非线程安全”的问题,所得结果也就是“线程安全”的。2、实例变量非线程安全
2018-03-07 16:58:25 3541 1
原创 守护线程
在java线程中有两种线程:1.用户线程(非守护线程) 2、守护线程守护线程是一种特殊的线程。当进程中不存在非守护线程,则守护线程自动销毁。典型的守护线程是垃圾回收线程。所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来
2018-03-06 20:22:39 216
原创 线程的优先级
线程的优先级分为 1-10这10个等级。优先级较高的线程得到的CPU资源较多。也就是CPU优先执行优先级较高的线程对象的任务。 public final static int MIN_PRIORITY = 1; public final static int NORM_PRIORITY = 5; public final static int MAX_PRIORITY = 10
2018-03-06 20:06:22 812
原创 暂停线程suspend()和恢复线程resume()
1、使用suspend()方法暂停线程(挂起) : 运行->阻塞 2、使用resume()方法恢复线程 : 阻塞->就绪suspend() 和 resume() 被用在等待另一个线程产生的结果的情 形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。但suspend()方法很容易引起死锁问题, 已经不推荐使用了。public class Run
2018-03-06 17:43:31 4485
原创 使用interrupt方法中断线程
调用interrupt()方法仅仅是在线程中打了一个停止的标记,并不是真的停止线程。(想中断哪个线程,就给哪个线程打标)public class Run { public static void main(String[] args) { CountOperate c=new CountOperate(); Thread thread=new Thread(c
2018-03-06 15:46:58 603
原创 this.getName()和 Thread.currentThread().getName()的区别
这要分两种情况: 1、继承Thread:1.1 线程类public class CountOperate extends Thread { private String name; public CountOperate(String name){ //初始化变量,但是没有get、set方法 this.name=name; System.ou
2018-03-06 11:36:09 421
原创 抽象工厂模式
抽象工厂模式的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。工厂方法模式或简单工厂关注的是单个产品对象的创建,而抽象工厂模式要创建一系列的产品对象(比如CPU和主板),这一系列被创建的对象相互之间是有约束的(比如CPU只能安装到特定的主板)。抽象工厂会定义创建这些对象(CPU和主板)的抽象方法,并不去真正地实现,然后由具体的抽象工厂的子类来提供这一系列对象的创建(子类根据
2018-02-24 21:14:30 164 1
原创 简单工厂模式
java中需要面向接口编程,传统的做法是:/** 定义一个接口*/public interface Api { public void test(String s);}/** 定义一个具体的实现类*/public class Impl implements Api { public void test(String s) { Syste...
2018-02-24 16:36:23 183
转载 Java 串行化技术_Serializable
Java 串行化技术可以使你将一个对象的状态写入一个Byte流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的串行化机制是RMI、EJB等技术的技术基础。用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。序列化就是一种用来...
2018-02-13 15:55:47 543
原创 java.util.AbstractList
//继承AbstractCollection,实现List接口public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 1、构造函数//唯一的构造函数,访问权限是protected ,因此只能在子类中构造 protected AbstractList() { }2、在Lis
2018-02-12 14:58:50 331
原创 利用Fiddler 抓手机的数据包
一。Fiddler的配置 界面 Tool—->Fiddler Options选项, 2。配置HTTPS 注意:如果要 导出证书 ,点击 蓝色的 MakeCert engine ,选择 Make Cert: Connections: 导出 证书 : 点击 Action,选择Export….:在Apple上安装 证书,记得使用Safire 浏览器:
2018-01-25 21:47:44 339
原创 迭代器
ArrayList list = new ArrayList(); //对集合进行操作add 和 remove 方法 list.add(10); //刚开始迭代器实例化时,modCount 和 expectedModCount的值是一样的 //expectedModCount=modCount=3 Iterat
2017-12-25 21:07:39 159
原创 java.util.AbstractCollection中的集合转换数组
//返回 Object类型的数组public Object[] toArray() { Object[] r = new Object[size()]; Iterator it = iterator(); for (int i = 0; i < r.length; i++) { if (! it.hasNext())
2017-12-16 17:58:01 723
原创 java.util.concurrent.Callable
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同:(1)Callable规定的方法是call(),而Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。(3)call()方法可抛出异常,而run(
2017-11-10 20:11:02 4917
原创 java.util.concurrent.TimeUtil类
TimeUnit是java.util.concurrent包下面的一个枚举类,TimeUnit提供了可读性更好的线程暂停操作、不同时间之间的转换操作。它包含 7 个枚举实例NANOSECONDS (毫微秒, 千分之一微秒)public static final TimeUnit NANOSECONDSMICROSECONDS (微秒, 千分之一毫秒)public static final T
2017-11-09 21:37:50 6850
原创 利用Mybatis插入数据到MySQL中
一、需要导入的jar包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.11.RELEASE</version> </dependency>
2017-10-12 20:50:21 8225
原创 Spring中使用定时任务Quartz
需要加入的jar包:dependency> groupId>org.springframeworkgroupId> artifactId>spring-context-supportartifactId> version>5.0.0.RELEASEversion> dependency>dependency> groupId>org.
2017-10-05 14:34:09 841
原创 定时任务--Timer
一、TimerTask TimerTask代表一个需要多次执行的任务,它实现了Runnable接口,可以在run()方法中定义任务逻辑。TimerTask相当于Quartz中的StatefulJob(有状态的Job),两种的区别在于,每当执行任务时,Quartz都会创建一个Job实例,而Timer则使用相同的TimerTask实例。所以,如果TimerTask类中拥有状态,那么这些状态对于后
2017-10-05 10:27:53 314
原创 springMVC--配置数据源
需要导入的jar包: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.apache.
2017-09-24 14:33:22 342
原创 Springmvc--上传文件
SpringMVC为文件上传提供了直接支持,通过MultipartResolver实现。默认没有装配MultipartResolver,需要先在上下文中配置MultipartResolver。1、需要的jar包<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId>
2017-09-10 11:01:01 212
原创 SpringMVC视图、表单
1、视图对象 不同类型的视图实现技术对应不同的View实现类,视图对象由视图解析器负责实例化,因为视图Bean是无状态的,所以不会有线程安全的问题。 2、视图解析器 视图解析器将一个逻辑视图名解析为一个具体的视图对象。 可以选择一种视图解析器或混用多种视图解析器,可以通过orderNo属性指定解析器的优先顺序,值越小优先级越高。其中ContentNegotiatingViewResolv
2017-09-09 16:58:31 227
原创 SpringMVC--数据转换、格式化和校验
Spring MVC通过反射机制对目标处理方法的签名进行分析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是DataBinder,运行机制如下: 1、SpringMVC主框架将ServletRequest对象及处理方法的入参对象实例传递给DataBinder。 2、DataBinder调用ConversionService组件进行数据类型转换、数据格式化等操作,将ServletReq
2017-09-09 16:03:27 396
原创 SpringMVC--处理模型数据
SpringMVC提供了多种途径输出模型数据:1、ModelAndView 控制器处理方法的返回值如果是ModelAndView,则其既包含视图信息,又包含模型数据信息,SpringMVC可以使用视图对模型数据进行渲染。 @RequestMapping(method = RequestMethod.POST) public ModelAndView createUser(User user
2017-09-03 16:22:44 302
原创 SpringMVC信息转换--处理XML和JSON
SpringMVC提供了几个处理XML和JSON格式的请求/响应信息的HttpMessageConverter: 只要在Spring WEB容器中为RequestMappingHandlerAdapter装配好相应的处理XML和JSON格式的请求/响应消息的HttpMessageConverter,并在交互中通过请求的Accept指定MIME类型,SpringMVC就可以使用服务器端的处理方
2017-09-03 12:57:48 387
原创 SpringMVC信息转换---HttpMessageConverter(一)
HttpMessageConverter<\T>是Spring的一个重要接口,负责将请求信息转换为一个对象(类型是T),将对象(类型T)输出为响应信息。DispatcherServlet默认已经安装了RequestMappingHandlerAdapter作为HandlerAdapter的组件实现类:#Spring 2.5中//处理器适配器(3个)org.springframework.web.s
2017-09-02 16:23:40 1277
原创 一个简单的SpringMVC实例
一、web.xml中配置context-param> param-name>contextConfigLocationparam-name> param-value> classpath:myspiter.xml param-value> context-param> listener> listener-class>org.spring
2017-08-30 19:41:01 231
原创 SpringMVC--注解驱动的控制器
使用基于注解的控制器类,在POJO类定义处标注@Controller,再通过<\context:component-scan/>扫描相应的类包,即可使POJO成为一个能处理HTTP请求的控制器。DispatcherServlet所提供的默认DefaultAnnotationHandlerMapping就可以满足需求。它将请求映射到使用@RequestMapping注解的方法。1、@RequestMa
2017-08-29 20:54:49 283
原创 Spring MVC---DispatcherServlet配置
spring MVC的整体架构 和大多数Web MVC框架一样,Spring MVC通过一个前端Servlet接受所有的请求,并将具体工作委托给其他组件进行处理,DispatcherServlet就是Spring MVC的前端Servlet。在整个框架中,DispatcherServlet处于核心的位置,它负责协调和组织不同的组件以完成请求处理并返回响应的工作。DispatcherServle
2017-08-26 15:02:55 1398
原创 利用注解配置切面
利用注解定义切面,必要配置自动代理功能 1、在XML中配置<aop:aspectj-autoproxy/>2、如果是在JavaConfig中,配置@Configuration@EnableAspectJAutoProxy@ComponentScanpublic class ConcerConfig{}一、在POJO中定义前置和后置通知@Aspect //定义切面@Component
2017-08-12 16:25:52 810
原创 在XML中配置AOP
在Spring的aop命名空间中,提供了多个元素用来在XML中声明切面: 在XML文件中配置aop命名空间:<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http
2017-08-12 15:19:55 1941 1
原创 面向切面编程(AOP)
使用面向切面编程时,仍然在一个地方定义通用的功能,但是可以通过声明或注解的方式定义这个功能以何种方式在何处应用,而无需修改受影响的类。散布于应用中多处的功能被称为横切关注点。这些横切关注点从概念上是与应用的业务逻辑相分离的(但往往会直接嵌入到应用的业务逻辑中)。横切关注点可以被模块化为特殊的类,这个类被称为切面。依赖注入(DI)有助于应用对象之间的解耦;而AOP可以实现横切关注点与它们所影响的对象之
2017-08-06 16:19:45 258
原创 SpEL表达式
Spring表达式语言(SpEL)能够以一种强大和简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到。(之前的属性占位符需要在属性文件中硬编码)SpEL表达式要放到 “#{…}”中。属性占位符要放到 “${…}”中。1、字面值public class Student { //也不需要setter方法 //可以注入整形、字符型、boolean
2017-07-30 16:55:48 384
原创 动态注入属性值(一)
一、在javaConfig中利用Environment注入属性值 1、普通的Student类public class Student { private int age; private String name; public Student(int age,String name){ this.age=age; this.name=name;
2017-07-30 15:22:19 1277
原创 Bean的作用域
在默认情况下,Spring应用上下文中所有的bean都是作为以单例的形式创建的。也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。Spring中定义了多种作用域,包括: 1、单例(Singleton):在整个应用中,只创建bean的一个实例. 2、原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例
2017-07-30 10:23:40 348
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人