Lingpj's blog

不忘初心,方得始终


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索

Maven学习笔记(4) --- 聚合和继承

发表于 2018-10-09 | 分类于 Java | 阅读次数

最近重新读了一下《Maven实战》,记录一下一直被我忽略的聚合和继承的关系。

聚合

首先,一个模块有一个pom(Project object Model)文件。当一个项目比较大的时候,按一定规则划分成不同的模块是一个比较好的方式。这时候管理一个项目,如果每个模块座位一个项目,那么打包编译的时候需要到每一个模块下去执行mvn命令,太麻烦了。于是,有个继承模块。

继承模块是一个空模块,只有pom文件,没有src、resource之类的目录结构。在pom文件中,用<modules>和<module>标签指定要管理的子模块。另外,<packaging>标签必须指定为pom。

  • e.g:
    1
    2
    3
    4
    5
    6
    <packaging>pom</packaging>
    <modules>
    <module>account-model</module>
    <module>account-service</module>
    <module>account-task</module>
    </modules>

以上情况适用于聚合模块处于目录顶层,子模块是聚合模块的子目录的情况。如果子模块和聚合模块是平行的目录关系,那么应该根据实际路径来写。

阅读全文 »

JDK默认使用的垃圾回收器

发表于 2018-09-09 | 分类于 日常记录 | 阅读次数

查看方法

java -XX:+PrintCommandLineFlags -version

这里写图片描述

阅读全文 »

理解JVM(七):垃圾回收器

发表于 2018-06-29 | 分类于 Java | 阅读次数

一些概念

并行(Parallel)

指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

并发(Concurrent)

指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

吞吐量

CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

阅读全文 »

理解JVM(六):线程安全和锁优化

发表于 2018-06-27 | 分类于 Java | 阅读次数

线程安全的实现方法

互斥同步

互斥是因,同步是果;互斥是方法,同步是目的。

synchronized关键字

  • synchronized关键字是基本的互斥同步手段。它在编译后会在同步代码块前后加入2条字节码指令:monitorenter和monitorexit。
  • 这两个字节码都需要一个reference类型的参数来指明要锁定和解锁的对象。如果Java程序中的synchronized指定了对象参数,那就是这个对象的reference;如果没有指定,就根据synchronized修饰的是实例方法还是类方法,去取对应的对象实例或Class对象来作为锁对象。
  • 执行monitorenter指令时,首先要尝试获取对象的锁。如果这个对象没被锁定,或当前线程已经拥有了那个对象的锁,把锁的计数器加1;在执行monitorexit指令时会将锁计数器减1。当计数器为0时,锁就被释放。如果获取对象锁失败,那当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。
  • synchronized同步块对同一条线程来说是可重入的,不会出现自己把自己锁死的问题。
  • 同步块在已进入的线程执行完之前,会阻塞后面其他线程的进入。
  • Java的线程是映射到操作系统的原生线程之上的,如果要阻塞或唤醒一个线程,都需要操作系统来完成,这就需要从用户态转换到核心态中,因此状态转换需要耗费很多的处理器时间,所以synchronized是Java语言中一个重量级的操作。不过虚拟机会有一些优化措施,比如自旋等待。
    阅读全文 »

理解JVM(五):Java内存模型与线程

发表于 2018-06-26 | 分类于 Java | 阅读次数

Java内存模型

JMM(Java Memory Model)是JVM定义的内存模型,用来屏蔽各种硬件和操作系统的内存访问差异。

  • 主内存:所有的变量都存储在主内存(Main Memory,类比物理内存)中。
  • 工作内存:每条线程有自己的工作内存(Working Memory,类比处理器高速缓存),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

阅读全文 »
12…10
Joepis

Joepis

46 日志
6 分类
39 标签
RSS
GitHub 码云
友情链接
  • 阮一峰
© 2016 - 2021 Joepis
由 Hexo 强力驱动
主题 - NexT.Mist