手机随时阅读
新人专享大礼包¥24
上一篇博客我们介绍了Java虚拟机垃圾回收,介绍了几种常用的垃圾回收算法,包括标记-清除,标记整理,复制等,这些算法我们可以看做是内存回收的理论方法,那么在Java虚拟机中,由谁来具体实现这些方法呢? 没错,就是本篇博客介绍的内容——垃圾收集器。1、垃圾收集器种类 事实上Java虚拟机规范对垃圾收集器应该如何实现,并没有任何的规定,所以不同的厂商、不同版本的虚拟机所提供的垃圾收集
如果对C++这门语言熟悉的人,再来看Java,就会发现这两者对垃圾(内存)回收的策略有很大的不同。 C++:垃圾回收很重要,我们必须要自己来回收!!! Java:垃圾回收很重要,我们必须交给系统来帮我们完成!!! 我想这也能看出这两门语言设计者的心态吧,总之,Java和C++之间有一堵由内存动态分布和垃圾回收技术所围成的高墙,墙外面的人想进去,墙里面的人想出来。 本篇博客我们就来详细介
首先通过一张图了解 Java程序的执行流程: 我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生成的字节码文件,加载完毕之后再由 JVM 执行引擎去执行。在加载完毕到执行过程中,JVM会将程序执行时用到的数据和相关信息存储在运行时数据区(Runtime Data Area),这块区域也就
本系列博客我们将以当前默认的主流虚拟机HotSpot 为例,详细介绍 Java虚拟机。以 JDK1.7 为主,同时介绍与 JDK1.8 的不同之处,通过Oracle官网以及各种文献进行整理,并加以验证,力求保证这块知识的正确性,完整性。 以下是本系列博客参考的相关文档: ①、JDK1.7虚拟机规范:https://docs.oracle.com/javase/specs/jvms/se
在上一篇博客,我们介绍各种锁时,其中介绍了乐观锁和悲观锁,这里首先复习一下。1、悲观锁和乐观锁 乐观锁与悲观锁这两种说法都是一种广义上的概念,从不同的角度看待线程同步。 ①、悲观锁 顾名思义,每次自己拿共享数据的时候,都会认为别人会修改,这种悲观的情绪,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。 Java中,synchronized关键字和Lock的实现类都是悲观锁。
本篇博客我们来详细介绍Java中的各种锁。废话不多说,直接上图。1、乐观锁和悲观锁 乐观锁与悲观锁这两种说法都是一种广义上的概念,从不同的角度看待线程同步。 ①、悲观锁 顾名思义,每次自己拿共享数据的时候,都会认为别人会修改,这种悲观的情绪,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。 Java中,synchronized关键字和Lock的实现类都是悲观锁。 ②、乐观锁
什么是JMM? 我相信稍微面试经验多一点的同学都会遇到过这个面试题,但是很少有人能够完美的回答这个问题。回答的好,这个问题完全能够成为你面试的亮点。 本篇博客就带领大家深入的去探讨这个问题,让你从容的应对面试。1、计算机内存模型 在介绍Java内存模型之前,我们先来了解一下什么是计算机内存模型。 早期计算机时代,CPU通过总线(地址总线、控制总线、数据总线)从内存中读取相关数据,然后进
前面讲解线程同步问题时,我们说到有三种方法,第一种是通过 synchronized 关键字修饰方法,即同步方法,第二种是用 synchronized 构造同步代码块,那么最后一种我们所说的是使用锁机制。使用 synchronized 关键字不管是修饰方法还是构造代码块,都不可能很细粒度的控制线程同步。 比如多个线程读写文件,读操作和写操作是会发生线程安全问题,写操作和写操作也是会发生线程安全
线程Thread 其实是一个重量级资源,它的创建、启动以及销毁都是比较耗费资源的,而且一个系统中创建的线程数量是有限的,线程数量和系统性能其实是一个抛物线关系,当线程数量达到某个数值的时候,性能反而会下降很多,所以对于线程的管理,尤其是线程数量的控制能直接决定程序的性能。 图片引用:https://blog.csdn.net/odailidong/article/details/47
我们在高并发几个基本概念这篇博客中有一个临界区的概念,临界区表示一种公共资源或者说是共享数据,可以被多个线程使用。那么如何保证多个线程访问到的数据是一致的?这便是线程同步。1、临界区访问错误 下面我们以一个多个窗口买票的例子来模拟多个线程访问临界区资源,造成数据不一致的问题。View Code 多次运行上面的程序,可能会出现如下几种打印结果: ①、出现票数为负数的情况 这种情况
关闭一个线程意味着在线程处理完任务之前停掉正在的进行的操作,所以在多线程开发环境中,如何有效合理的停掉某个线程,将是我们开发中的重点。本篇博客我们就详细的来介绍如何关闭线程。1、stop 方法(不推荐) 在上篇博客我们详细的介绍了 stop 方法的用法,该方法的作用是强行停止某个线程。现已被 JDK 官方标记为不推荐使用(后期版本可能会删除该方法),因为强制让线程停止一方面会使得一些
上一篇博客我们介绍了如何创建线程,创建线程有五种方法,在实际项目中都是使用的通过线程池来创建线程。本篇博客我们介绍线程的声明周期以及常用API。1、线程声明周期 这些状态在 java.lang.Thread 类中的内部类 State 都有明确定义,下面是这个类的源码,如果大家能够看懂英文,那我上面那张图就很好理解了。public enum State { /**
关于线程和进程的基本概念,我在前面讲解Java多线程时已经介绍过了,这里总结一下: 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。 线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程
本系列博客我们将介绍Java的高并发设计,当然,在介绍高并发之前,我们可能需要先明白为什么需要高并发?高并发有什么作用?那么首先我们先看看下面两个例子: 1、图像处理:一张 1024*768 像素的图片,包含多达 78 万 6 千多个像素,我们即使将所有的像素都遍历一遍,也得花大量的时间,更何况,图像处理会涉及到大量的矩阵计算,矩阵的规模和数量都非常大,这么大密集的计算,我们该怎么去解决?
mybatis代码生成器相信大家用过,本篇博客我们来介绍如何一键生成mybatis plus 的相关Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码。1、官方教程 参考文档如下:https://mybatis.plus/guide/generator.html 其实官方教程写的很详细了,这里我讲解一下官方的文档,并在我个人 G
上篇博客我们介绍过通过 Mybatis Plus 进行增删改查,如下这段代码:/** * 根据id修改 * UPDATE user SET user_name=?, user_age=? WHERE (id = ?) */@Testpublic void testudpateById(){ User user = new User(); user.setUserAge("25")
本篇博客,我们通过 MyBatis Plus 来对一张表进行 CRUD 操作,来看看是如何简化我们开发的。1、创建测试表 创建 USER 表:DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `ID` int(11) NOT NULL, `USER_NAME` varchar(32) COLLATE utf8mb4_bin DEFAULT
废话不多说,相信现在国内的Java开发者,开发web项目,很少有不使用 Mybatis 这个框架的。 下面是对 MyBatis 这个框架的简单介绍,想看详细教程的,可以看看我以前的博客。 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML
恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具。1、为什么需要 Docker Compose?官网镇楼:https://www.runoob.com/docker/docker-compose.html一句话概括: 帮助我们批量有规则的管理容器。前面基础教程,我们介绍了 Dockerfile ,启动服务都是通过 Dockerfile 构建
什么是容器数据共享?简单来说就是容器与容器之间数据共享,容器与宿主机数据共享。1、为什么需要数据共享?①、数据持久化比如我们有一个MySQL集群,通过容器启动,那么项目运行过程中的数据是保存在容器中的,假设容器被删除了,数据就丢失了,如果没有数据共享,那你就只能删库跑路了。 而有了数据共享,你就可以打通容器和宿主机的数据联通,将容器中的数据同步到宿主机,即使容器删除了,数据还是在本地的。②、同步
想要变成 Docker 的高阶玩家,搞懂 Docker 的容器通信是必不可少的。1、需求通常一个 Web 项目上线,我们会把开发完成的服务部署在Tomcat 服务器里面,然后需要的持久化数据会存放在数据库 Mysql,那么在服务运行时,少不了 Tomcat 和 Mysql 的交互。对应的,应用到 Docker 中,就是 Tomcat 容器和 Mysql 容器间的交互,那么问题来了: 两个容器之间
Dockerfile 简单来说就是一个包含用于组合镜像的命令的文本文档,Docker 通过读取 Dockerfile 中的指令就可以按步骤生成镜像,那么在制作镜像之前,我们先了解一下镜像的原理。1、镜像原理只有了解镜像的原理,我们才能更清晰的通过 Dockerfile 制作镜像。前面几篇文章我们简单介绍了docker中的镜像,镜像是只读的文件,提供了运行程序完整的软硬件资源,是应用程序的“集装箱”
话不多说,本篇文章给大家介绍 docker 的常用命令,基本上会覆盖我们日常使用的命令。1、万能帮助命令docker 命令 --help假设你想用某个命令,但是又不知道该命令的一些参数怎么用,这时候上面的万能帮助命令就派上用场了。更有甚者,你连命令也不记得了,那直接输入: docker --help找到你想要的那个命令,然后通过上面命令查看用法。比如不知道如何运行容器? 找到英文 Run a
前面我们大概介绍了docker是什么以及如何安装docker,但是对里面出现的一些名词,可能大家还不熟悉,这篇文章就来为大家解惑。1、容器化平台Docker 是提供应用打包,部署与运行应用的容器化平台。2、Docker 引擎Docker Engine(Docker引擎)是Docker的核心部分,使用的是客户端-服务器(C/S)架构模式,其主要组成部分如下图所示。①、docker daemon:Do
通过上面文章,我们大概知道了什么是Docker,但那都是文字功夫,具体想要理解,还得实操,于是这篇文章带着大家来手动安装Docker。1、官方教程https://docs.docker.com/engine/install/其实这个文档描写的很清晰了,大家根据上面地址给出的文档可以很方便的安装,当然,贴心的可乐还是怕你们看不懂,下面总结了三种常用的操作系统安装教程。2、Linux 安装教程
1、Docker 是什么?Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 2、Docker 为
1、什么是策略模式?Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 策略模式(Strategy Pattern):定义一族算法类,将
1、什么是模板模式?Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm
1、什么是观察者模式?Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 观察者模式(Observer Design Pattern):在对象之间定义一个一
1、什么是享元模式?Use sharing to support large numbers of fine-grained objects efficiently. 享元模式(Flyweight Pattern):使用共享对象可有效地支持大量的细粒度的对象。 说人话:复用对象,节省内存。 2、享元模式定义 ①、Flyweight——抽象享元角色 是一个产品的抽象类, 同时定义
Copyright © 2005-2022 51CTO.COM 版权所有 京ICP证060544号