AnthonyZero's Bolg

Love Coding,Enjoy Life


  • 首页

  • 归档

  • 分类

  • 标签
AnthonyZero's Bolg

Java并发-synchronized关键字

发表于 2018-11-23 | 分类于 Java

概述

使用 Synchronized 关键字是解决并发问题的最简单的一种方式之一,我们只需要使用它修饰需要被并发处理的代码块、静态方法或普通方法,虚拟机自动为它加锁和释放锁,并将不能获得锁的线程阻塞在相应的同步队列上。

Synchronized是一种互斥阻塞的同步方式:它具有原子性和可见性的特征。

  • 互斥性:在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块进行访问。互斥性我们也往往称为操作的原子性
  • 可见性:确保在锁被释放之前,对共享变量所做的修改,(刷新到主内存)对于随后获得该锁的另一个线程是可见的。
阅读全文 »
AnthonyZero's Bolg

Java内存模型

发表于 2018-11-18 | 分类于 Java

概念

Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。

在并发编程中,需要处理两个关键问题:线程直接如何通信和同步。

  1. 通信:是指线程之间以何种机制来交换信息;在命令式编程中,通信机制有两种,共享内存和消息传递。
  2. 同步:是指程序用于控制不同线程之间操作发生相对顺序的机制。

Java的并发采用的是共享内存模型,线程之间的通信总是隐式的进行。Java线程之间的通信由内存模型(JMM)控制,JMM决定了一个线程对共享变量的写入何时对另一个线程可见。

共享变量指实例域、静态域和数组元素

阅读全文 »
AnthonyZero's Bolg

Java并发-理解Volatile

发表于 2018-11-14 | 分类于 Java

定义

Java编程语言允许线程访问共享变量,为了确保共享变量能够被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。
volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”,可见性的意思是当一个线程修改了一个共享变量时,另一个线程能读到这个修改的值。

共享变量(多个线程访问的变量),volatile一般修饰类的成员变量、 类的静态成员变量

阅读全文 »
AnthonyZero's Bolg

Java并发-线程安全

发表于 2018-10-31 | 分类于 Java

概述

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其它的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。
下面介绍线程安全有以下几种实现方式:

不可变

不可变(Immutable)的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。只要一个不可变的对象被正确地构建出来,永远也不会看到它在多个线程之中处于不一致的状态。多线程环境下,应当尽量使对象成为不可变,来满足线程安全。

阅读全文 »
AnthonyZero's Bolg

Java序列化机制

发表于 2018-10-24 | 分类于 Java

概况

对象序列化API提供了一个框架,用来将对象编码成字节流,并从字节流编码中重新构建对象。“将一个对象编码成一个字节流”,称作将对象序列化(serializing);相反的处理过程被称为反序列化(deserializing)。
一旦对象被序列化后,它的编码就可以从一台正在运行的虚拟机被传递到另一台虚拟机上,或者被存储到磁盘上,供以后反序列化时用。序列化技术为远程通信提供了标准的线路级对象表示法,也为JavaBeans组件结构提供了标准的持久化数据格式。
序列化其实可以看成是一种机制,按照一定的格式将 Java 对象的某状态转成介质可接受的形式,以方便存储或传输。序列化时将 Java 对象相关的类信息、属性及属性值等等保存起来,反序列化时再根据这些信息构建出 Java 对象。

阅读全文 »
AnthonyZero's Bolg

SpringBoot:Spring工厂加载机制

发表于 2018-09-26 | 分类于 SpringBoot

简介

Spring 工厂加载机制,即 Spring Factories Loader,核心逻辑是使用 SpringFactoriesLoader 加载由用户实现的类,并配置在约定好的META-INF/spring.factories 路径下,该机制可以为框架上下文动态的增加扩展。
该机制类似于 Java SPI,给用户提供可扩展的钩子,从而达到对框架的自定义扩展功能。
本文记录在SpringBoot中Spring工厂加载机制的运用。SpringBoot版本为2.0.5.RELEASE

SpringFactoriesLoader 是 Spring 工厂加载机制的核心底层实现类。它的主要作用是 从 META-INF/spring.factories 路径下加载指定接口的实现类。该文件可能存在于工程类路径下或者 jar 包之内,所以会存在多个该文件。

SpringBoot自动装配

Spring Boot 完成自动装配的核心之一就是工厂加载机制。我们以 Spring Boot 的自动装配为例来分析。如果要开启 Spring 的自动装配功能,@SpringBootApplication派生 @EnableAutoConfiguration 这个注解,这个注解会 Import AutoConfigurationImportSelector 这个类。

阅读全文 »
AnthonyZero's Bolg

Spring:条件装配

发表于 2018-08-12 | 分类于 Spring

Spring条件装配

从 Spring Framework 3.1 开始,允许在 Bean 装配时增加前置条件判断

条件注解举例

Spring注解 场景说明 起始版本
@Profile 配置化条件装配 3.1
@Conditional 编程条件装配 4.0
阅读全文 »
AnthonyZero's Bolg

Spring:AOP实现原理

发表于 2018-07-02 | 分类于 Spring

AOP概述

AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理。允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

阅读全文 »
AnthonyZero's Bolg

Java字节码增强

发表于 2018-06-12 | 分类于 Java

字节码增强技术

个人理解,是在Java字节码生成之后,运行期对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。这类增强字节码的技术基本都应用在减少冗余和屏蔽实现细节上,Java的字节代码的增强在很多的Java框架中都可以看到,比如Spring使用cglib对字节码的增强实现面向切面的编程AOP和自动代理类的生成等上。

字节码操作框架

  • JDK的动态代理(利用JAVA反射)
  • ASM:一个JAVA字节码分析、创建和修改的开源应用框架
  • AspectJ:意思是Java的AspectJava的AOP,提供了强大的AOP功能
  • CGLIB:功能强大,高性能的代码生成包,使用字节码处理框架ASM(对ASM的封装),来转换字节码并生成新的类
  • Javassist:一个开源的分析、编辑和创建Java字节码的类库,在性能上Javassist高于反射,但低于ASM
阅读全文 »
AnthonyZero's Bolg

Spring:常用扩展接口

发表于 2018-05-06 | 分类于 Spring

前言

Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心。Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP—-开闭原则,即:

1、保证对修改关闭,即外部无法修改Spring整个运作的流程
2、提供对扩展开放,即可以通过继承、实现Spring提供的众多抽象类与接口来改变类加载的行为

阅读全文 »
1…5678
Pingjin

Pingjin

Java/GoLang攻城狮

76 日志
17 分类
93 标签
GitHub Twitter Weibo 倔金
© 2017 - 2022 Pingjin
本站访客数:
主题 - NexT.Pisces