Java
文章平均质量分 73
﹏天微亮ミ夜微凉╮
......
展开
-
linux目录结构
原创 2021-06-07 22:44:31 · 54 阅读 · 0 评论 -
Docker 常用命令
帮助文档地址:https://docs.docker.com/reference/常用基本命令帮助命令docker vers ion # 显示docker的版本docker info # 显示docker的系统信息docker命令--help # 帮助命令镜像命令docker images # 查看所有本地的主机上的镜像-a, --all # 列出所有镜像-q, --quiet # 只显示镜像的iddocker search # 搜索镜像d原创 2021-06-04 19:28:10 · 205 阅读 · 0 评论 -
了解 Dockerfile
介绍Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。构建步骤:编写一个dockerfle文件docker build构建成为一个镜像docker run运行镜像docker push发布镜像构建过程每个保留关键字(指令)都是必须是大写字母执行从上到下顺序执行#表示注释每一个指令都会创建提交一个新的镜像层,并提交!相关指令FROM:该指令用于指定要构建的镜像的基础镜像。它通常是 Dockerfile 中的第一条指令。RU原创 2021-06-05 21:49:18 · 80 阅读 · 0 评论 -
Docker 的安装与基本原理
安装安装之前先卸载 docker 相关 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ dock原创 2021-06-04 14:47:50 · 107 阅读 · 1 评论 -
虚拟机安装 Centos7
centos 下载地址:http://mirrors.163.com/centos/新建虚拟机完成后设置光驱,直接开启虚拟机即可选中第一个点击软件选择配置一下桌面和自带工具方便学习配置分区点击完成,接收更改,然后禁用KDUMP配置网络和主机名这里网络打开自动关闭解决:https://blog.csdn.net/henu1710252658/article/details/105062197关闭最后一个安全应用,直接开始安装设置密码,创建其他用户安装原创 2021-06-07 21:18:39 · 79 阅读 · 0 评论 -
【Java】线程池ThreadPool学习与使用
线程池的自我介绍如果不使用线程池,每个任务都新开一个线程处理◆ 一个线程◆ for 循环创建线程◆ 当任务数量上升到 1000这样开销太大,我们希望有固定数量的线程,来执行这 1000 个线程,这样就避免了反复创建并销毁线程所带来的开销问题。线程池的好处加快响应速度合理利用CPU和内存统一管理线程池适合应用的场合服务器接受到大量请求时,使用线程池技术是非常合适的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率实际上,在开发中,如果需要创建5个以上的线程,那么就可以使用线程池来原创 2021-06-28 09:34:47 · 287 阅读 · 1 评论 -
ThreadLocal 解析
使用场景典型场景一每个线程需要一个独享的对象 (通常是工具类,典型需要使用的类有 SimpleDateFormat 和 Random)1000 个打印线程的任务,都用线程池来运行避免众多对象创建和销毁的开销,把 SimpleDateFormat 提出来作为公共变量,但这就会产生线程安全问题,解决方案可以加锁,但是太影响性能了,更好的解决方案使用 ThreadLocal,每个 Thread 内有自己的实例副本不共享,利用 ThreadLocal,给每个线程分配自己的 dateFormat 对象,保证原创 2021-06-28 16:38:20 · 171 阅读 · 0 评论 -
CopyOnWriteArrayList 重点解析
简单介绍CopyOnWriteArrayList 用来代替 Vector 和 SynchronizedList,就和 ConcurrentHashMap 代替 SynchronizedMap 的原因一样Vector 和 SynchronizedList 的锁的粒度太大,并发效率相对比较低,并且迭代时无法编辑Copy-On-Write 并发容器还包括 CopyOnWriteArraySet,用来替代同步 Set适用场景读操作可以尽可能地快,而写即使慢一些也没有太大关系读写规则回顾读写锁:读读共享原创 2021-06-29 07:20:44 · 141 阅读 · 1 评论 -
JVM内存结构 VS Java内存模型 VS Java对象模型
整体方向JVM 内存结构,和 Java 虚拟机的运行时区域有关。Java 内存模型,和 Java 的并发编程有关。Java 对象模型,和 Java 对象在虚拟机中的表现形式有关。JVM 内存结构Java 对象模型Java 对象自身的存储模型JVM 会给这个类创建一个 instanceKlass,保存在方法区,用来在JVM层表示该 Java 类。当我们在 Java 代码中,使用 new 创建一个对象的时候,JVM 会创建一个 instanceOopDesc 对象,这个对象中包含了对象头以及原创 2021-07-01 17:34:05 · 157 阅读 · 0 评论 -
AQS 介绍及核心原理
简介AQS是一个用于构建锁、同步器、协作工具类的工具类(框架)。有了AQS以后,更多的协作工具类都可以很方便得被写出来。一 句话总结:有了AQS ,构建线程协作类就容易多了。因为上面的那些协作类,它们有很多工作都是类似的,所以如果能提取出一个工具类,那么就可以直接用,对于ReentrantLock和Semaphore而言就可以屏蔽很多细节,只关注它们自己的“业务逻辑”就可以了和 AQS 的关系Semaphore、ReentrantLock、CountDownLatch 内部有一个 Sync 类,Sy原创 2021-06-27 18:13:41 · 395 阅读 · 2 评论 -
CAS 原理
应用场景乐观锁并发容器原子类Unsafe 类Unsafe 是 CAS 的核心类。Java 无法直接访问底层操作系统,而是通过本地 (native) 方法来访问。不过尽管如此,JVM 还是开了一个后门,JDK 中有一个类 Unsafe,它提供了硬件级别的原子操作valueOffset 表示的是变量值在内存中的偏移地址,因为 Unsafe 就是根据内存偏移地址获取数据的原值的,这样我们就能通过 unsafe 来实现 CAS 了文字描述我认为 V 的值应该是 A,如果是的话那我就把它改成 B,如原创 2021-06-29 10:18:28 · 130 阅读 · 0 评论 -
ReentrantLock 原理
非公平锁实现原理ReentrantLock 默认是非公平锁 public ReentrantLock() { sync = new NonfairSync(); }没有竞争时,就一个线程,加锁成功 static final class NonfairSync extends Sync { private static final long serialVersionUID = 7316153563782823691L; /原创 2021-04-16 20:12:33 · 64 阅读 · 0 评论 -
ThreadLocal 的理解
介绍ThreadLocal类用来提供线程内部的局部变量。这种变是在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。我们可以得知ThreadLocal的作用是:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。总结:1.线程并发:在多线程并发的场景下2.传递数据原创 2021-05-10 21:15:15 · 126 阅读 · 0 评论 -
ConcurrentHashMap 1.7 和 1.8 分析
为什么HashMap是线程不安全的?同时put碰撞导致数据丢失同时put扩容导致数据丢失死循环造成的CPU100%原创 2021-06-29 06:13:54 · 440 阅读 · 1 评论 -
并发流程的控制(CountDownLatch、Semaphore、Condition、CycliBarrier)
CountDownLatchCountDownLatch(int count):仅有一个构造函数,参数 count 为需要倒数的数值。await():调用 await() 方法的线程会被挂起,它会等待直到 count值为 0 才继续执行。countDown():将 count 值减1,直到为 0 时,等待的线程会被唤起。用法一一个线程等待多个线程都执行完毕再继续自己的工作。/** * 描述:工厂中,质检,5个工人检查,所有人都认为通过,才通过 */public class CountD.原创 2021-06-29 21:10:20 · 131 阅读 · 0 评论 -
【Java】CompletableFuture学习记录
业务场景:查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间。假如商品详情页的每个查询,需要如下标注的时间才能完成。那么,用户需要 5.5s 后才能看到商品详情页的内容。很显然是不能接受的。如果有多个线程同时完成这 6 步操作,也许只需要 1.5s 即可完成响应。Future 是 Java 5 添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。原创 2023-10-07 08:46:53 · 244 阅读 · 0 评论 -
【Java】泛型
Java泛型的总结学习原创 2023-09-20 16:55:37 · 233 阅读 · 0 评论 -
枚举类理解与使用
一、枚举类的使用1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类2.当需要定义一组常量时,强烈建议使用枚举类3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。二、如何定义枚举类方式一:jdk5.0之前,自定义枚举类public class TestEnum { public static void main(String[] args) { Person xg = Person.XG; System.out.println(x原创 2021-05-28 21:38:37 · 77 阅读 · 0 评论 -
强大的 Stream 流
Stream API简介:Stream API ( java.util.stream) 把真正的函数式编程风格引入到 Java 中。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。Stream 和 Colle原创 2021-05-20 18:11:55 · 421 阅读 · 0 评论 -
Lambda 表达式的使用
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。Lambda表达式的本质:作为函数式接口的实例,先来看一下什么是函数式接口:只包含一个抽象方法的接口,称为函数式接口。我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数原创 2021-05-20 13:15:17 · 222 阅读 · 0 评论