自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 控制并发流程,做好线程间的协调

线程一般是由线程调度器自动控制的,但有些场景需要按照我们程序员的意愿去实现多线程之间相互配合,从而满足业务逻辑。让线程A等待线程B执行完后再执行等一些相互合作的逻辑;或一系列线程等待一个线程运行完毕或发出信号之后再执行CountDownLatch(int count):仅有这一个构造函数,参数count为需要倒数的数值。await(): 调用 await() 方法的线程会被挂起,它会等待直到count值为0才继续执行。

2023-06-15 12:14:06 503

原创 Java并发容器 & 并发队列

阻塞队列是具有阻塞功能的队列,所以它首先是一个队列,其次是具有阻塞功能通常,阻塞队列的一端是给生产者放数据用,另一端给消费者拿数据用。阻塞队列是线程安全的,所以生产者和消费者都可以是多线程的阻塞队列的分为有界和无界,有界是指队列存储容量有限,无界队列是指存储容量无限大,如 LinkedBlockingQueue 的存储容量为 Integer.MAX_VALUE,约为2的31次方,可近似认为是无界队列。

2023-06-14 14:50:50 807

原创 final&不可变性

如果对象在被创建后,状态就不能被修改,那么它就是不可变的这个对象不能被修改指:对象指向(引用)不可变字段不可变成员变量不可变案列演示:person对象,age和name属性都不能再变/*** 不可变的对象,演示其他类无法修改这个对象* public也不行final String name = "李白";

2023-06-13 22:02:27 379

原创 Java并发之原子类

Java中提供了一些原子类,原子类包装了一个变量,并且提供了一系列对变量进行原子性操作的方法。原子性的意思是对于一组操作,要么全部执行成功,要么全部执行失败,不能只有其中某几个执行成功。在多线程的情况下能够保证操作不会被中断,从而能保证并发安全Java8引入高并发下LongAdder比AtomicLong效率高,本质还是空间换时间竞争激烈的情况下,LongAdder会把不同线程对应到不同的Cell上进行修改,降低冲突的概率,是多段锁的理念,提高了并发性。

2023-06-13 22:01:29 957

原创 java并发之CAS(Compare and swap)

CAS的底层调用native方法,最终是利用CPU的一个特殊指令,该指令由CPU保证了原子性,而且包含多个操作,比如先比较再更新。(1)需要读写的内存值(V)、原值(A)和新值(B)。如果V的值与原值A相匹配,那么把B设置给V,否则处理器不做任何操作。(2)无论哪种情况,都返回V内存值。(3)原子类里,当失败时,就一直循环,直到成功。(1)、(2)是在CPU和内存的层面来说的,(3)是在Java层面说的int var5;

2023-06-13 22:00:53 239

原创 Java并发之 Lock 锁

锁是一种工具,用于控制对共享资源的访问Lock和synchronized是最常见的两个锁,他们都能够达到线程安全的目录,但是使用和功能上又有较大的不同Lock接口最常见的实现类就是通常情况下Lock只允许一个线程访问共享资源,特殊情况也允许多个线程并发访问,如ReadWriteLock的ReadLock悲观锁认为:如果我不锁住这个资源,别人就会来争抢,就会造成数据结果错误,所以为了结果的正确性,悲观锁会在每次获取并修改结果时把数据锁住,让别人无法访问。

2023-06-13 22:00:21 2442

原创 Java并发工具之ThreadLocal

ThreadLocal 字面意思是本地线程,其实更准确来说是线程局部变量,线程类 Thread 有个变量叫做 threadLocals,其类型就是ThreadLocal.ThreadLocalMap 类型,他其实不是一个 Map 类型,但可以暂时理解它是一个Map,键为 ThreadLocal 对象,值就是要存入的value。

2023-06-13 21:57:57 4252 1

原创 死锁细究!

发生在并发中互不想让:当两个(或更多)线程(或进程)相互持有对方所需要的资源,又不主动释放,导致所有人都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁。多个线程造成死锁的情况如果多个线程之间的依赖关系是环形,存在环路的锁的依赖关系,那么也可能会发送死锁虽然线程并没有阻塞,也始终在运行(所以被称为“活锁”,线程是“活的”),但是程序却得不到进展,因为线程始终重复做同样的事如果是死锁,只会是等待,不会消耗CPU资源,但活锁除了程序无法进行,还会消耗 cpu 资源。

2023-06-09 20:33:06 339

原创 java线程池

如果线程池当前的线程数多于corePoolSize ,其中多余的那部分线程空闲时间超过keepAliveTime,它们就会被终止,比如:corePoolSize 为5,当前线程数为10,如果线程空闲了,就会恢复到5;如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。核心线程池大小, 线程池初始化后,默认是没有任何线程的,当新的任务到线程池后,线程池会创建新的线程(即使有空闲线程),直到核心线程池已满。

2023-06-06 17:07:24 360

原创 牛郎织女的幸福生活(活锁)

*** 吃饭的人/*** 是否饥饿} }eatWith()/*** 方法里面描述的是吃饭的事* @param spoon 勺子* @param spouse 夫妻对方//如果勺子不是自己的,则等一会儿,等对方吃完 if(spoon . getOwner()!} //先检查对方是否饥饿,如果对方饥饿的话先把勺子交给对方,让对方先吃 if(spouse . isHungry) {

2023-06-03 11:33:44 361

原创 哲学家就餐问题(死锁)

本文主要讲述死锁的一个经典案例—哲学家就餐问题,并对该问题进行修复。

2023-06-03 11:32:12 813

原创 银行转账问题(死锁)

本文主要讲述死锁的一个经典案例—银行转账问题,并对该问题进行定位、修复。

2023-06-03 11:31:03 784

原创 Java内存模型

从Java代码到CPU指令的变化过程是怎样的?最开始,我们编写的Java代码,即*.Java文件在执行编译Javac命令后,从刚才的*.Java文件会变出一个新的Java字节码文件,即*.class文件JVM会执行刚才生成的*.class字节码文件,并把字节码文件转化为机器指令机器指令可以直接在CPU上执运行,也就是最终的程序执行。

2023-06-03 11:26:30 2919

原创 单例模式8种写法

我们可以结合代码,假如A线程进入同步代码块执行 instance = new Singleton6(),执行到“instance = memory 设置instance指向刚分配的内存”,这个时候B线程在第一次执行“if (instance == null)”,发现instance不为空,直接返回instance实例,其实线程B得到的这个实例并没有完全初始化(A还没有执行完对象的初始化步骤)就已经使用了。:线程不安全,还有性能问题!:使用到的时候才会创建对象,不会造成各种资源浪费问题,线程安全。

2023-06-03 11:26:20 336

原创 synchronized 关键字

synchronized 关键字解决的是多个线程之间访问资源的同步性,用于保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。其中前两种使用的锁称为对象锁,后两种称为类锁。只能等执行完锁定代码块或者遇到异常才能退出。不能中断一个正在试图获得锁的线程。每个锁仅有单一的条件(某个对象)试图获得锁时不能设定超时时间。无法知道是否成功获取到锁。加锁和释放锁的时机单一。

2023-06-03 11:23:39 133

原创 volatile 关键字

volatile是一种同步机制,类似于 Lock 和 Synchronized ,但是他更轻量级,因为使用 volatile 并不会发生上下文切换等开销很大的行为。如果一个变量被volatile修饰,那么JVM会认为这个变量可能会被并发修改,会保证关于这个变量的修改能立即被其他线程看到。因为开销小,所以能力也小;他做不到像 synchronized 那样的原子保护,使用的场景比较有限。

2023-06-03 11:23:24 1813

原创 多线程安全的案例展示与解决方案

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。通俗来说就是:不管业务中遇到怎么的多个线程访问某个对象或某个方法的情况,而在编写这个业务逻辑的时候,都不需要额外做任何额外的处理(也就是可以像单线程编程一样),程序也可以正常运行(不会因为多线程而出错),就可以称为线程安全。

2023-06-03 11:21:40 395

原创 多线程的未捕获异常类 UncaughtExceptionHandler 的使用

*** 自定义 UncaughtExceptionHandler*/@Overridelogger.log(Level.WARNING,"线程异常:"+t.getName(),e);System.out.println(name+"我捕获了异常"+t.getName()+"异常名字:"+e);

2023-06-03 11:20:14 1809

原创 线程的四个属性

线程的四个属性。

2023-06-03 11:16:25 1105

原创 wait,notify,notifyAll,sleep,join等线程方法的全方位演练

因为java中每个对象都有一把称之为monitor监控器的锁,每个对象头中有一个用来保存锁信息的位置,所以每个对象都可以上锁,这个锁是对象级别的,而非线程级别的,wait/notify/notifyAll也都是锁级别的操作,他们的锁属于对象,所以把他们定义在Object类中最合适,因为Object类是所有对象的父类。

2023-05-27 21:48:35 338 1

原创 线程的 6 个状态(生命周期)

Runnable:是在线程调用 start() 方法之后的状态(其实包括两个阶段:一是 start() 方法调用之后但是未拿到 cpu 资源的 ready 阶段,二是拿到cpu资源的后的 Running 阶段);Terminated:线程运行的最终状态:可能是run() 方法的逻辑运行结束,也有可能是遇到未被 catch 的异常,抛出异常后终止。Timed_Waiting:执行了带有 time 参数的 wait(time) 方法后的状态,见下图;因为他们都需要被线程以外的条件去唤醒,不是当前线程所控制的。

2023-05-27 21:47:44 223

原创 深度解析线程的正确停止方法

使用interrupt方法请求中断,而不是强制终止线程,是合作机制。这样,被请求中断的线程可以自主决定,处理自己的逻辑。好处是,可以保证数据安全,来得及清理,能够保证数据完整性。

2023-05-26 11:55:18 1357

原创 深度解析多线程的创建方式和正确启动多线程

准确的讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元有两种方式:一是实现Runnable接口的run方法,并把Runnable实例传给Thread类,二是重写Thread的run方法(继承Thread类)其它创建线程的方式也有很多,但都是在代码的写法上的千变万化,本质上还是都基于 Thread 类和 Runnable 类的重写run()方法。方法一:最终调用Runnable实例的run()方法(target.run());方法二:直接将Thread类的里整个 run() 方法重写。

2023-05-25 08:14:15 902

原创 Canal 与 MariaDB 实现数据同步

译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费业务,其中包括:数据库镜像、数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新、带业务逻辑的增量数据处理。

2023-05-24 09:15:00 579

原创 MariaDB 主从同步配置

(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。============== MariaDB 从节点上可能的 /etc/my.cnf 配置如下 =============找到auto.cnf文件,修改里面的uuid值,保证各个主从的uuid不一样,重启数据库即可。

2023-05-22 13:38:08 1465

原创 CentOS-7 安装 MariaDB-10.8

运行安装命令安装 MariaDB(安装过程可能会比较漫长,使用中科大的就快了):下载安装包,进行自动安装,登录到 MariaDB,此时 root 账户的密码为空,直接回车即可,退出 Mariadb,然后获取到对应版本的网址 ,修改MariaDB.repo文件中的baseurl 值。进行 MariaDB 的相关简单配置, 使用一下命令进行配置(先退出数据库)。(2)文件/etc/my.cnf.d/mysql-clients.cnf。初始化 MariaDB 完成,直接登录,成功。简单的用户和权限配置就完成了。

2023-05-21 19:56:46 858

原创 Elasticsearch 安装 X-pack

X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。ES7.0+之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。

2023-05-17 18:09:26 2365

原创 Kibana 的安装

Kibana 是一个开源的分析与可视化平台,可以用 Kibana 搜索、查看存放在 Elasticsearch 中的数据,就跟谷歌的 elasticsearch head 插件类似,但 Kibana 与 Elasticsearch 的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。Elasticsearch、Logstash 和 Kibana 这三个技术就是常说的 ELK 技术栈,很典型的 MVC 思想,模型持久层,视图层和控制层。

2023-05-17 17:02:13 3033

原创 Xpack-Watchers基本语法与使用

Elasticsearch 提供了数据的存储及快速的搜索,而其中的 Watcher 功能可以实时地根据一些条件来发送警报。与 Elasticsearch 的使用一样,可以通过 Resfulapi 调用创建、管理、更新预警任务。watcher。

2023-05-17 16:55:57 675

原创 ELK 海量日志收集架构设计

一、架构图:ELK 技术栈架构设计图:从左往右看,BeatsFilebeatKafkaLogstashKibanaLog4j2Log4j2app.logerror.logslf4jLog4j2(1)slf4j:全称是Log4jLog4j2Log4j全称是,即是上面接口的一个实现,Log4j2是Log4j的升级版本,提高日志输出的吞吐量。

2023-05-17 12:57:37 745

原创 logstash 的基础语法与使用

区域内可以包括插件区域定义,你可以在一个区域内定义多个插件。插件区域内则可以定义键值对设置。

2023-05-17 09:31:00 1754

原创 FileBeat 安装与配置

Filebeat 是使用 Golang 实现的轻量型日志采集器。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。

2023-05-15 20:37:25 1233

原创 Kafka 整合 SpringBoot

编写测试代码:ApplicationTests.java。

2023-05-15 14:50:50 1284

原创 kafka之消费者进阶

消费者组:一个消费者组包含多个消费者。同一个消费组的消费者,分别消费不同的partition,便于加快消费。kafka约定在一个消费者组中,对于同一个topic,每个consumer会分配不同partition,即topic下的一个patition只能被同一个消费者组的一个消费者消费,所以当消费组中的消费者个数大于partition个数时,会存在消费者闲置的情况,因为分不到partition.

2023-05-13 20:31:38 950

原创 Kafka 之生产者与消费者基础知识:基本配置、拦截器、序列化、分区器

自定义生产者拦截器类需要继承 org.apache.kafka.clients.producer.ProducerInterceptor,并实现其中的方法:onSend(ProducerRecord record)是发送消息之前的切面方法;onAcknowledgement(RecordMetadata metadata, Exception exception)是发送消息之后的切面方法;close()是生产者关闭前调用的方法;> configs)是拦截器用于配置一些属性的方法;

2023-05-12 17:06:24 3243

原创 Kafka 使用java实现,快速入门

【代码】Kafka 集成 SpringBoot, 快速入门。

2023-05-10 21:02:41 8481 2

原创 kafka安装及配置

如果想要搭建集群的话,需要对于其他的虚拟机节点也按照上述方法执行安装,只是其中配置文件里的 broker.id=0 的值需要修改一下,每个节点必须保证不一样。上传到 linux 下的 /home/software/ 目录下,然后解压 kafka_2.13-3.2.1.tgz 包到/usr/local/如果提示权限不够,可以使用 chmod kafka-manager 修改权限。以配置文件的方式启动,后面的 & 表示后台启动。我这里下载的是 3.2.1 版本。

2023-05-10 15:28:29 3164

原创 RabbitMQ启动失败的一系列尝试

slave2在三台虚拟机关闭之后,第二天启动虚拟机后,执行如下命令后,使用 lsof -i:5672 查看无任何返回信息:三台虚拟机均是如此,于是开始尝试。

2023-05-09 15:52:56 3450

原创 RabbitMQ可靠性消息发送(java实现)

本博客属于 《RabbitMQ基础组件封装—整体结构》的子博客。

2023-05-06 14:56:40 2362

原创 RabbitMQ基础组件封装—整体结构(总篇)

这是一个设置对象转换方式的操作,这里的转换是指我们自己写的Message实体类和org.springframework.amqp.core.Message之间的转换。@Autowired的注入方式是单例,为了提高效率,可以池化处理RabbitTemplate:让一个topic对应一个rabbitTemplate,第一次是创建一个template,相当于多生产者,并行发送消息,一个topic对应一个生产者,相比于单例中的单个生产者的效率有所提升。基于上面已完成的代码,可以很容易实现 确认类型消息 的发送。

2023-05-05 18:58:10 2224 2

kafka-manage-2.0.0.2

kafka manager可视化管控台压缩包

2023-05-10

ZooKeeper可视化界面:ZooInspector

ZooKeeper可视化界面软件:ZooInspector压缩包

2023-05-10

RabbitMQ延迟消息插件rabbitmq-delayed-message-exchange

RabbitMQ延迟消息插件rabbitmq_delayed_message_exchange

2023-05-06

elastic-job-lite-console-2.1.4.tar.gz

elastic-job的控制台安装包

2023-05-05

在linux上安装RabbitMQ-3.6.5需要的一些安装包

在linux上安装RabbitMQ-3.6.5需要的一些安装包: socat-1.7.3.2-1.1.el7.x86_64.rpm rabbitmq-server-3.6.5-1.noarch.rpm erlang-18.3-1.el7.centos.x86_64.rpm

2023-04-25

空空如也

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

TA关注的人

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