自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 收藏
  • 关注

原创 1_基础知识_chapter05_基础构建模块_5_同步工具类

共同特点: 封装了一些状态, 用于决定执行同步工具类的线程继续执行还是等待 常见的有闭锁、信号量、栅栏等 闭锁 (1) 功能: 在闭锁到达结束状态之前, 门一直关闭没有任何线程可以通过;在闭锁到达结束状态后,门会打开, 允许所有线程通过,且永远保持打开 (2) 应用场景: 确保某些活动直到其他活动完成后才继续执行 1° 确保某个计算在其需要的所有资源都初始化以后才执行...

2019-01-22 17:55:00 105

原创 1_基础知识_chapter05_基础构建模块_4_阻塞方法与中断方法

和Thread.sleep一样, BlockingQueue的put和take方法会抛出编译器异常 InterruptedException; __如果一个方法抛出InterruptedException, 说明这个方法是一个阻塞方法Thread提供了interrupt(), interrupted(), isInterrupted()方法(还没看)...

2019-01-22 17:54:00 71

原创 1_基础知识_chapter05_基础构建模块_1_同步容器类

委托是创建线程安全类的一个最有效的策略, 只需让现有的线程安全类管理所有的状态即可Collections.synchronizedXXX是一些同步容器类, 这些类的实现方式是将它们的状态封装起来, 并且对每个公有方法都进行同步同步容器类包括 Vector, HashTable, Collections.synchronizedXXX同步容器类的问...

2019-01-22 17:54:00 100

原创 1_基础知识_chapter05_基础构建模块_3_阻塞队列和生产者-消费者模式

BlockingQueue接口和生产者-消费者模式(1) 生产者-消费者模式消除了生产者类和消费者类之间的代码依赖性: 生产者将数据放入队列; 消费者从队列中取数据(2) 阻塞队列提供了可阻塞的put和take方法, 和支持定时的offer和poll方法(3) 队列可以有界也可以无界(在构造函数中指定, 但其实无界的阻塞队列也有最大值Intege...

2019-01-22 17:54:00 90

原创 1_基础知识_chapter05_基础构建模块_2_并发容器

(1) 并发容器≠同步容器(2) 同步容器将所有对容器状态的访问都串行化,严重影响性能(3) 并发容器专门为多线程并发设计, 应该尽可能通过并发容器代替同步容器(4) 并发容器有 ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, ConcurrentSkipListSe...

2019-01-22 17:54:00 63

原创 1_基础知识_chapter04_对象的组合_4_在现有的线程安全类中添加功能

很多情况下应该重用现有的类, 添加自定义的功能, 此时需要在不破坏线程安全性的情况下添加新的操作(1) 方法一: 直接修改原始的类优点: 同步策略仍然处于同一个源代码文件中, 更容易理解和维护缺点: 常常无法修改源代码(2) 方法二: 扩展这个类同步策略分布到了各个文件中, 并且要确定的得知基类的同步策略示例 @ThreadS...

2019-01-22 17:54:00 105

原创 1_基础知识_chapter04_对象的组合_3_线程安全性的委托

(1) 从头开始构建一个类, 或将多个非线程安全的类组合为一个类时, Java监视器模式很有效(见"2_实例封闭.md");多个线程安全的类组合为一个类时, 可以考虑委托方式(2) 示例1° 基于监视器模式的车辆追踪MonitorVehicleTracker.java @ThreadSafe public class MonitorVe...

2019-01-21 11:17:00 106

原创 1_基础知识_chapter04_对象的组合_1_设计线程安全的类

设计线程安全的类的三要素(1) 找出构成对象状态的所有变量(2) 找出约束状态变量的不可变条件(3) 建立对象状态的并发访问管理策略如果对象的域都是基本类型, 则它们组成了对象的全部状态; 如果出现了引用类型, 则要递归的包含它们引用对象的域同步策略规定了如何在不违背对象的不变条件和后验条件的情况下对其状态的访问操作进行协同, 规定了如...

2019-01-21 11:16:00 82

原创 1_基础知识_chapter04_对象的组合_2_实例封闭

封闭(1) 封装简化了线程安全类的实现过程。将数据封装在对象内部, 可以将数据的访问限制在对象的方法上, 从而更容易确保线程在访问数据时总能持有正确的锁(2) 被封闭对象不能超出它们既定的作用域1° 可以封闭在一个类实例中(private变量)2° 可以封闭在某个作用域内(局部变量)3° 封闭在线程内(只在同一个线程的不同方法内传递, 不在不...

2019-01-21 11:16:00 76

原创 1_基础知识_chapter03_对象的共享_5_安全发布

(1) Java内存模型为不可变对象的共享提供了特殊的初始化安全性保证, 即使在发布这些对象时没有同步(2) 在没有额外同步的情况下, 也可以保证安全访问final类型的域(但是如果final类型的域所指向的是可变对象, 还是需要同步)一个正确构造的对象, 可以通过以下方式安全发布(1) 静态初始化函数中初始化一个对象引用JVM内部存在的同...

2019-01-21 11:15:00 88

原创 1_基础知识_chapter03_对象的共享_3_线程封闭

(1) 访问共享的可变数据时, 通常就需要同步(2) 为了避免同步, 可以不共享数据, 在单线程内访问拘束的话就不需要共享数据, 这就叫线程封闭线程封闭的方式(1) Ad-hoc封闭: 完全交给程序实现者承担尽量少用这种方式(2) 栈封闭: 只能通过局部变量访问对象示例 public class Animals { ....

2019-01-21 11:14:00 80

原创 1_基础知识_chapter03_对象的共享_4_不变性

不可变对象(1) 满足条件1° 对象创建以后状态不能更改2° 对象的所有域都是final类型3° 对象被正确创建(构造函数中没有发生this引用逸出)(2) 不可变对象一定是线程安全的(3) 不可变对象的状态可以更新, 更新的方式是通过一个保存新状态的实例来替换原有的不可变对象(例如String, Integer)final域(1)...

2019-01-21 11:14:00 88

原创 1_基础知识_chapter03_对象的共享_1_可见性

(1)内存可见性一个线程修改了对象状态后, 其他线程能够看到发生的状态变化(2) 重排序在其他线程中,可以观察到某个线程中的操作没有按照程序中指定的顺序来执行注1° 在缺少同步的情况下, Java内存模型允许编译器对操作顺序进行重排序, 并将数值缓存在寄存器中;2° Java内存模型还允许CPU对操作顺序进行重排序, 并将数值缓存在处理器特...

2019-01-21 11:13:00 92

原创 1_基础知识_chapter03_对象的共享_2_发布与逸出

发布: 使一个对象能够在当前作用域之外的代码中使用逸出: 某个不应该发布的对象被发布(1) 发布对象最简单的方式是将对象的引用保存在一个public static变量中, 这样任何类和线程都能看见该对象(2) 发布某个对象时, 可能会间接发布其他对象例如, 一个容器中装着很多个引用类型,这些引用类型的对象都会被发布(3) 发布一个对象时,...

2019-01-21 11:13:00 116

原创 1_基础知识_chapter02_线程安全性_1_线程安全性

对象的状态(1) 对象的状态是指 类的实例或静态变量(2) 也包括其他依赖对象的域例如某个HashMap的状态不仅存储在HashMap对象本身,还存储在许多Map.Entry对象中Java的同步机制(1) synchronized(2) volatile(3) 显示锁(4) 原子变量: package java.util.concu...

2019-01-21 11:12:00 90

原创 0_简介_chapter01_简介_1_简介

线程的优势(1) 发挥多处理器的强大能力(2) 建模简单每个线程只包含一种类型的任务,方便编写和测试(3) 异步事件的简化处理使用非阻塞IO的复杂性远远高于同步IO(4) 响应更灵敏的用户界面线程带来的风险(1) 安全性问题带来不可预测的结果(2) 活跃性问题死锁、活锁、饥饿问题(3) 性能问题线程切换需要时间已经存在的线程的应用即使在...

2019-01-21 11:11:39 94

原创 chapter09_保护Web应用_5_选择查询用户详细信息的服务

有的时候需要对用户的信息进行存储,以便判断登录进系统时的权限。我们需要的是用户存储,在进行认证决策的时候,进行检索Spring Security内置了了多种数据存储方式来认证用户,包括内存、关系型数据库、LDAP等使用基于内存的用户存储(1) 适用于开发、测试的场景,数据量小(2) 要重载 WebSecurityConfigurerAdapte...

2019-01-21 11:09:00 141

原创 chapter09_保护Web应用_3_拦截请求

需求:某些请求需要进行认证,某些请求需要具备特定权限的用户才能访问……对每个请求进行细粒度的安全性控制的关键是重载configure(HttpSecurity http)方法(1) 示例 SecurityConfig.java @Configuration @EnableWebMvcSecurity public class Secu...

2019-01-15 17:43:00 81

原创 chapter09_保护Web应用_2_保护视图

之前的种种操作都是为了不要让某些没有权限的用户看到某个页面,接下来要做的是这些用户能看到页面,但是看不到页面的全部。即,页面中的某些部分根据用户有无权限决定是否渲染JSP的视图保护方案(1) 声明<%@ taglib prefix="security" uri="http://www.springframework.org/security...

2019-01-15 17:42:00 85

原创 chapter09_保护Web应用_1_Spring Security简介

安全性是绝大多数应用的一个重要切面。Spring Security是一个安全框架,它基于Spring AOP和Servlet中的Filter过滤Web请求(1) Spring Security借助一系列Servlet Filter提供各种安全性功能(2) 但是我们只需要配置一个Filter,当我们启用Web安全性的时候,会自动创建这些Filter...

2019-01-15 17:42:00 56

原创 chapter07_SpringMVC的高级技术_4_跨重定向请求传递数据

处理完Post请求后,一般要进行重定向。防止因为浏览器刷新或回退时重新执行Post请求使用转发forward时,由于控制器方法和视图处理的是同一个request,所以转发的过程中,request的属性得以保存控制器方法中的Model对象最终是以请求参数的形式复制到请求中的,因此发生重定向时,不能用Model传递数据常用的跨重定向传递数据的方式有2...

2019-01-15 17:41:00 91

原创 chapter07_SpringMVC的高级技术_3_处理异常

无论在服务器端的程序是否出现异常,有一个request过来时,总会有一个response响应回去。当内部不做任何处理时,如果出现异常,就会映射成 500 Internal Server Error有时,由于路径错误等问题造成了空指针,产生NullPointerException,如果不做处理,也会输出 500 错误;而事实上这是由于没有找到资源文件造成...

2019-01-15 17:40:00 92

原创 chapter07_SpringMVC的高级技术_2_处理Multipart形式的数据

multipart格式的数据会将一个form拆分成多个part,每个part对应一个输入域(1) Spring中解析Multipart交给了MultipartResolver接口的实现类(2) Spring内置了 MultipartResolver的实现类, CommonsMultipartResolver 和 StandardServletMul...

2019-01-15 17:40:00 130

原创 chapter07_SpringMVC的高级技术_1_SpringMVC配置的替代方案

(1) "../第五章 构建Spring Web应用程序/Spring MVC起步.md"中写过,配置DispatcherServlet只需要扩展 AnnotationConfigDispatcherServletInitializer这个类,并重写3个方法(2) 重载 customizeRegistration(Dynamic registrati...

2019-01-15 17:39:00 89

原创 chapter06_渲染Web视图_4_使用Thymeleaf

JSP的问题(1) JSP及其标签库缺乏良好的格式(2) JSP与Servlet紧耦合,应用场景受限Thymeleaf(1) 原生模板,不依赖标签库(2) 不仅限于Servlet配置Thymeleaf视图解析器(1) 需要添加3个bean:ThymeleafViewResolver(将逻辑视图名称解析为Thymeleaf模板视图)、SpringTempla...

2019-01-15 17:38:46 102

原创 chapter06_渲染Web视图_3_使用Apache Tiles视图定义布局

需求:为所有的页面定义一个通用的头部和底部(例如copyright)方法:使用布局引擎Apache Tiles,Spring提供视图解析器TilesViewResolver用于支持Apache Tiles配置Tiles视图解析器(1) 需要添加几个Bean示例WebConfig.java @Configuration @Enabl...

2019-01-15 17:38:00 84

原创 chapter06_渲染Web视图_2_理解视图解析

控制器和视图之间的唯一联系应该是模型Model中的数据,其他方面应该解耦视图的基本接口是 ViewResolver和ViewViewResolver.java public interface ViewResolver { View resolveViewName(String viewName, Locale locale) t...

2019-01-15 17:37:00 66

原创 chapter06_渲染Web视图_1_创建JSP视图

通常将JSP文件放在 /WEB-INF目录下,防止对它的直接访问InternalResourceViewResolver是JSP的视图解析器,它遵循一种约定,会在视图名上添加前缀和后缀,进而定位JSP文件的位置(1) JavaConfig @Configuration @EnableWebMvc @ComponentScan("spit...

2019-01-15 17:35:00 124

原创 chapter05_构建Spring Web应用程序_3_接受请求的输入

接受请求的输入在SpringMVC中一共有3种方式(1) 查询参数(2) 路径参数(3) 表单参数处理查询参数(1) 在url中添加查询参数示例 "/spittles?max=238900&count=50"(2) 处理方式:添加 @RequestParam注解示例 @Controller @RequestMa...

2019-01-14 09:35:00 84

原创 chapter05_构建Spring Web应用程序_2_基本控制器

控制器的类上方要添加 @Controller 注解用于声明,@Controller是@Component的子注解,便于自动扫描 @ComponentScan@RequestMapping注解(1) 可以添加在控制器的类上方,也可以添加在方法上方。当控制器在类上添加@RequestMapping注解时,这个注解会应用到控制器的所有方法上(2) va...

2019-01-14 09:34:00 94

原创 chapter05_构建Spring Web应用程序_1_Spring MVC起步

SpringMVC中请求和响应的过程(1) 浏览器 --请求--> DispatcherServlet(2) DispatcherServlet: 查询 处理器映射(3) DispatcherServlet --请求--> 某个具体的控制器(4) 控制器 --模型、视图名--> DispatcherServlet(5) D...

2019-01-14 09:33:00 83

原创 chapter04_面向切面的Spring_4_使用Xml创建切面

首先要在头部添加aop命名空间 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSche...

2019-01-14 09:32:00 57

原创 chapter04_面向切面的Spring_2_切点

Spring AOP 中,使用AspectJ的切点表达式语言来定义切点,但是只使用一部分,因为Spring不支持字段级别的切面,而AspectJ支持常用切点指示器execution()arg()within()编写切点(1) 示例 execution(* concert.Performance.perform(..))(2) 说...

2019-01-14 09:31:00 135

原创 chapter04_面向切面的Spring_3_使用JavaConfig创建切面

添加 @Aspect注解,代表一个类是一个切面示例 @Aspect public class Audience { ... }通知的时刻有5种,详见"基本概念.md"示例 @Aspect public class AroundAudience { @Around("execution(* com....

2019-01-14 09:31:00 80

原创 chapter04_面向切面的Spring_1_基本概念

横切关注点散布于应用中多出的功能,例如日志、安全等功能。这些功能应该与应用的业务逻辑分离。让横切关注点和业务逻辑相分离是面向切面编程(AOP)要解决的问题切面实现了横切关注点的类。我们可以通过外部声明的方式决定切面在何处、何时应用,而受影响的类本身并不知情。通知(1) 描述了切面完成的工作 和 何时执行工作(2) 何时执行工作一共有...

2019-01-14 09:30:00 68

原创 chapter03_高级装配_2_Profile与条件化Bean

开发和部署可能会使用不同的数据库,Profile就在解决这个问题通过配置 profile bean,Spring可以在运行时确定使用哪个beanJava Config配置@Profile("xxx")示例 @Configuration public class DataSourceConfig { @Bean @Profile...

2019-01-14 09:29:00 68

原创 chapter03_高级装配_3_运行时值注入

目标:避免硬编码,通过运行时读取配置文件的值确定Bean的构造器或setter参数,而非在Bean的类中写硬编码代码,实现解耦运行时求值的方式(1) 从外部 properties文件直接读(2) 属性占位符 ${ ... }(3) Spring EL #{ ... }属性文件(1) 属性文件放在 src/main/resources 目...

2019-01-14 09:29:00 71

原创 chapter03_高级装配_1_bean的作用域

bean的作用域一共有 4种(1)单例: 整个应用中,只创建一个bean的实例(默认)(2)原型: 每次注入或者通过应用上下文获取时,都创建一个新实例(ConfigurableBeanFactory.SCOPE_PROTOTYPE)(3)会话session: 为每个会话创建一个bean实例(WebApplicationContext.SCOPE_...

2019-01-14 09:28:00 104

原创 chapter02_装配Bean_装配Bean

依赖注入对象的依赖关系由系统中负责协调各个对象的第三方组件(Spring)在创建时进行设定。一个对象只通过接口来表明依赖关系,对象会在运行期被赋予它们所依赖的对象,而不需要主动获得装配(1) 定义创建应用对象之间的协作关系(2) 装配机制1 自动2 Java Config 配置类3 Xml(3) 优先级自动 > Java ...

2019-01-14 09:27:00 80

原创 chapter01_Spring之旅_Spring容器

在基于Spring的应用中,对象生存于Spring容器中Spring自带多种容器实现,可以分为 bean工厂 和 应用上下文 两大类。 应用上下文更受欢迎使用应用上下文(1) AnnotationConfigApplicationContext: 从Java Config类中加载应用上下文示例 AnnotationConfigApplica...

2019-01-10 08:50:00 82

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除