
Java高并发
文章平均质量分 81
Java 多线程、并发、高性能之路
FeelTouch Labs
技术架构、人工智能、区块链与密码学专家
展开
-
SpringBoot整合Mybatis-Plus+Druid实现多数据源
Spring Boot是一个基于Spring框架的开源Java开发框架,旨在简化Spring应用程序的开发、配置和部署。它提供了一种快速、敏捷的方式来构建独立的、生产级别的Spring应用程序,同时还提供了许多开箱即用的功能和工具,如自动配置、内嵌式Web容器、健康检查、监控和管理等。Mybatis-Plus是一个基于Mybatis的增强工具,它在Mybatis的基础上扩展了许多实用的功能,可以帮助开发人员更加高效地完成数据库操作,提高开发效率和代码质量。原创 2025-02-26 17:03:37 · 1370 阅读 · 0 评论 -
Tomcat怎么调整参数以优化性能
优化Tomcat的性能需要综合考虑多个方面,从线程池配置到内存管理,再到具体的应用逻辑,每个应用的需求都是独特的,因此建议在进行任何调整之前,先进行充分的测试和评估。:设置Tomcat可以接受的最大连接数,默认值通常为200,但根据你的硬件能力和应用负载,可能需要增加或减少。在生产环境中,可以将日志级别设置为“INFO”或“ERROR”,以减少日志记录的开销。:设置等待处理的连接队列大小,如果所有线程都忙,新的连接请求将进入此队列。:设置Tomcat启动时创建的最小线程数,这有助于快速响应初始连接请求。原创 2024-10-16 14:45:14 · 660 阅读 · 0 评论 -
一篇搞定!10分钟说透Saga分布式事务
这里对Saga进行一个总结,首先Saga是针对分布式长活事务的解决方案,针对事务长、多、复杂的情况,特别是服务由多个公司开发具有不可控性,可以使用Saga模式进行分布式事务的处理。Saga在处理事务一致性方面采取了向前恢复和向后恢复策略,前者通过不断重试的方式保证事务完成,而后者通过子事务的补偿事务,逐一回滚的方式让事务标记失败。在分布式协调方面,Saga采用了两种模式:编排和控制。前者让参与者(服务)之间通过消息进行沟通,根据事件出发事务的执行流程,是一种去中心化的模式。转载 2024-03-24 22:03:28 · 4919 阅读 · 0 评论 -
Wrk压测发送Post请求的正确姿势
wrk是一个能够在多核CPU上进行HTTP压测的工具,简单实用原创 2024-01-06 00:37:09 · 1890 阅读 · 0 评论 -
Java对象复制或模型转换方法分析
编译期处理性能更高,对实现的技术要求也更高;运行时处理使用起来最为简便,可选的模型转换框架也更多,根据前面文中的分析,若无特殊要求使用Spring的BeanUtils.copyProperties是性能最好和额外依赖最少的属性框架。原创 2024-01-05 01:30:29 · 1065 阅读 · 0 评论 -
一次线上服务CPU100%的排查过程
前言突然收到线上服务cpu达到100%的报警短信,于是立即展开排查。排查过程理论步骤一、找到最耗CPU的进程工具:top方法:执行top -c ,显示进程运行信息列表键入P (大写p),进程按照CPU使用率排序二:找到最耗CPU的线程工具:top方法:top -Hp PID,显示一个进程的线程运行信息列表键入P (大写p),线程按照CPU使用率排序三:将线程PID转化为16进制工具:printf之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。四:查看堆栈,原创 2022-05-29 23:58:22 · 1163 阅读 · 3 评论 -
Java8利用@Contended避免volatile字段的伪共享
Java8引入了@Contented这个新的注解来减少伪共享(False Sharing)的发生。本文介绍了@Contented注解并解释了为什么False Sharing是如何影响性能的。缓存行CPU读取内存数据时并非一次只读一个字节,而是会读一段64字节长度的连续的内存块(chunks of memory),这些块我们称之为缓存行(Cache line)。假设你有两个线程(Thread1和Thread2)都会修改同一个volatile变量x: 1 .转载 2021-04-16 11:56:14 · 654 阅读 · 0 评论 -
Java中的笔试和面试3---ThreadLocal-面试必问深度解析
ThreadLocal是什么ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景。从数据结构入手下图为ThreadLocal的内部结构图ThreadLocal结构内部从上面的结构图,我们已经窥见ThreadLocal的核心机制:每个Thread线程内部都有一个Map。 Map里面存储线程本地对象(key)和线程的变转载 2020-06-25 16:20:44 · 388 阅读 · 0 评论 -
Java多线程系列-happens-before规则和as-if-serial语义
JSR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这2个操作之间必须要存在happens-before关系。这里提到的2个操作既可以是一个线程之内,也可以是不同线程之间。与程序员密切相关的happens-before规则如下:1、程序顺序规则:一个线程中的每个操作,happens-before原创 2017-10-26 21:03:33 · 940 阅读 · 0 评论 -
Java多线程系列-多线程合集3
转自:http://blog.youkuaiyun.com/u013256816/article/details/51363643本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。51. SimpleDateFormat非线程安全当多个线程共享一个Simple转载 2017-10-26 20:52:00 · 625 阅读 · 0 评论 -
Java多线程系列-多线程下的Singleton模式
Singleton是老生常谈的一个设计模式,不过在之前学习的时候,我并没有将多线程的问题考量在内,所以在这篇里面加入多线程,细细聊来。首先,就写出一个最简单的singleton,在单线程模式下,该实现没有任何问题,这是真正安全的模式:?1234567891011public class Singleto原创 2017-10-25 17:30:55 · 1304 阅读 · 0 评论 -
Java多线程系列-多线程合集1
转自:http://blog.youkuaiyun.com/u013256816/article/details/51325246#t6本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。1. interrupted与isInterrupted的区别interrupte转载 2017-10-25 17:51:32 · 708 阅读 · 0 评论 -
Java多线程系列-多线程合集2
转自:http://blog.youkuaiyun.com/u013256816/article/details/51325309本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。27. ConcurrentHashMapConcurrentHashMap是线转载 2017-10-25 19:09:44 · 984 阅读 · 0 评论 -
Java多线程系列-线程池的优点和方法
new Thread的弊端如下:a. 每次new Thread新建对象性能差。b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。c. 缺乏更多功能,如定时执行、定期执行、线程中断。相比new Thread,Java提供的四种线程池的好处在于:a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。b. 可有效控制最原创 2017-10-25 19:15:38 · 2497 阅读 · 1 评论 -
Java多线程系列-实现多线程的最基本两种方式
Java实现多线程的一种方式是实现Runnable接口,另一种则是继承Thread类。我们举例来说明二者的使用。方法1:?1234567public class CreateThreadTest implementsRunnable { publicvoid run() { S原创 2017-10-25 17:13:16 · 629 阅读 · 0 评论 -
Java多线程系列-join方法
Thread类的join方法用来使main线程进入阻塞状态,进而等待调用join方法的线程执行,join方法有如下三种形式?123public final void join(longmillis) throws InterruptedException public final void join(long mi转载 2017-10-25 17:18:34 · 746 阅读 · 0 评论 -
Java多线程系列-BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个转载 2017-02-18 21:17:42 · 533 阅读 · 0 评论 -
Java多线程系列-Executors
概述Executors类是JDK 1.5开始自带的一个非常强大的主要用于创建各类线程池的工具类。常用方法介绍newFixedThreadPoolnewFixedThreadPool方法有两种函数签名:12public static ExecutorService newFixedThreadPool(int nThreads)转载 2017-02-18 21:38:51 · 506 阅读 · 0 评论 -
Java多线程系列-ExecutorService
Executor接口概述该类提供一个提交任务的方法,提交的任务可以在提交程序本线程运行,也可以在不同的线程运行,也可以在一个线程池中的线程运行,全看如何使用。However, the {@code Executor} interface does not strictlyrequire that execution be asynchronous. In the sim转载 2017-02-18 21:40:36 · 621 阅读 · 0 评论 -
Java多线程系列-ThreadFactory
概述ThreadFactory翻译过来是线程工厂,顾名思义,就是用来创建线程的,它用到了工厂模式的思想。它通常和线程池一起使用,主要用来控制创建新线程时的一些行为,比如设置线程的优先级,名字等等。它是一个接口,接口中只有一个方法:123456789/** * Constructs a new {@code Thread}. Im转载 2017-02-18 21:54:21 · 1027 阅读 · 0 评论 -
Java多线程系列-Future
概述Future主要用来表示线程异步执行的结果,他提供了检查异步执行的程序是否已经执行完毕、是否已经被取消,并且获取执行结果的方法。它是一个接口,接口的定义如下:12345678public interface FutureV> { boolean cancel(boolean mayInterruptIfRunning);转载 2017-02-18 22:54:12 · 876 阅读 · 0 评论 -
Java多线程系列-CountDownLatch
概述JDK中提供了一些用于线程之间协同等待的工具类,CountDownLatch和CyclicBarrier就是最典型的两个线程同步辅助类。下面分别详细介绍这两个类,以及他们之间的异同点。CountDownLatch类CountDownLatch顾名思义:倒计数锁存器。没错,他就是一个计数器,并且是倒着计数的。他的应用场景如下:一个任务A,他需要等待其他的一些任转载 2017-02-18 22:58:22 · 558 阅读 · 0 评论 -
Java多线程系列-CyclicBarrier
概述JDK中提供了一些用于线程之间协同等待的工具类,CountDownLatch和CyclicBarrier就是最典型的两个线程同步辅助类。下面分别详细介绍这两个类,以及他们之间的异同点。CyclicBarrier类CyclicBarrier翻译过来就是:循环的屏障。什么是循环?可以重复利用呗,对这个类就是一个可以重复利用的屏障类。CyclicBarrier主要用于一组转载 2017-02-18 23:01:19 · 795 阅读 · 0 评论 -
Java多线程系列-Semaphore
概述Semaphore字面意思是信号量。他主要用于控制有限的资源的访问数量。我们看一个生活中常常出现的场景:一个厕所只有3个坑位,但是有10个人来上厕所,那怎么办?假设10的人的编号分别为1-10,并且1号先到厕所,10号最后到厕所。那么1-3号来的时候必然有可用坑位,顺利如厕,4号来的时候需要看看前面3人是否有人出来了,如果有人出来,进去,否则等待。同样的道理,4-10号也需转载 2017-02-18 23:04:17 · 785 阅读 · 0 评论 -
Java多线程系列-ThreadLocal
概述相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!看看JDK中的源码是怎么写的:This class provides thr转载 2017-02-18 23:07:31 · 1029 阅读 · 0 评论 -
Java多线程系列-ConcurrentHashMap
概述还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到:HashMap是非线程安全的,HashTable是线程安全的。那个时候没怎么写Java代码,所以根本就没有听说过ConcurrentHashMap,只知道面试的时候就记住这句话就行了…至于为什么是线程安全的,内部怎么实现的,通通不了解。今天我们将深入剖析一个比Hash转载 2017-02-18 23:13:45 · 822 阅读 · 0 评论 -
Java多线程系列-CountDownLatch
什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:转载 2017-02-18 23:18:34 · 590 阅读 · 0 评论 -
Java多线程系列-悲观锁和乐观锁实战
悲观锁介绍(百科):悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 使用场景举例:以MySQL InnoDB转载 2017-10-24 16:08:05 · 11682 阅读 · 0 评论