- 博客(72)
- 资源 (2)
- 收藏
- 关注
原创 Java 多线程之并行流(parallelStream)
并行流是Java中Stream API的一部分,用于在多核处理器上并行执行流操作。在Java 8及更高版本中引入的Stream API提供了一种新的处理集合的方式,使得开发者能够更轻松地进行数据处理和操作。在使用Stream API时,可以将集合转换为流,然后进行各种操作,例如过滤、映射、排序等。在这个过程中,流可以是串行流(Sequential Stream)或并行流(Parallel Stream)。并行流通过使用多线程并行处理数据,充分利用多核处理器的优势,从而在某些情况下提高处理速度。
2023-12-22 17:51:12
5441
原创 Java 多线程之自定义线程池(ThreadPool)使用方法
线程池是一种管理和复用线程的机制,它包含一组预先创建的线程,用于执行各种任务。线程池的主要作用是提高多线程应用程序的性能和效率,并提供对线程的生命周期和资源的管理,包括线程的创建、销毁和复用。本文主要讨论线程池执行器(ThreadPoolExecutor)的用法,在观看本文之前建议先看线程池使用入门。
2023-12-22 17:49:29
3645
原创 Java 多线程之线程池基础
线程池是一种管理和复用线程的机制,它包含一组预先创建的线程,用于执行各种任务。线程池的主要作用是提高多线程应用程序的性能和效率,并提供对线程的生命周期和资源的管理,包括线程的创建、销毁和复用。降低资源消耗:线程的创建和销毁是一项开销较大的操作。通过使用线程池,可以避免频繁地创建和销毁线程,从而降低了系统的资源消耗。提高响应速度:线程池中的线程可以立即执行任务,而不需要等待线程的创建。这可以显著提高任务的响应速度,尤其是在大量并发任务的情况下。
2023-12-20 17:43:03
849
原创 Java 多线程之 ThreadLocal 的使用
ThreadLocal 用于在多线程环境中维护线程封闭(thread-local)的变量。线程封闭是一种确保变量在多线程环境中的线程安全性的机制,每个线程都有自己独立的变量副本,互不干扰。ThreadLocal 提供了一种简单的方式来实现线程封闭,它为每个线程都创建了一个独立的变量副本。使用场景保存线程私有数据:当多个线程需要访问某个数据,但每个线程都需要有自己的数据副本时,可以使用 ThreadLocal。
2023-12-20 17:41:35
1151
原创 Java 多线程之线程安全集合
集合关系图本文主要关注线程安全的集合,如 List、Set、Queue、Map 等接口的线程安全的实现方式,有关集合基础知识请转到这里。所谓线程安全集合,就是在多线程环境中使用集合不会导致数据不一致和数据异常的集合。在 Java 中线程安全集现在基本都使用 java.util.concurrent 包下的类。
2023-12-13 17:26:34
1458
原创 Java 多线程之锁概念理解
在多线程编程中,有乐观锁、悲观销、自旋锁、读写锁、排他锁、共享锁、统一锁、分段锁等很多锁的概念。要理解这些概念,我们先从以下概念了解。进程(Process)是计算机中运行的程序的实例。进程之间相互独立,拥有独立的内存空间,彼此不受影响。进程是操作系统进行资源分配和调度的基本单位。线程(Thread)是进程中的执行单元,是操作系统进行调度的基本单位。一个进程可以包含多个线程,它们共享相同的资源,如代码段、数据段和文件描述符等。
2023-12-13 17:16:30
968
原创 Java 多线程之同步(锁)相关类总结
要实现线程同步,原理就是加锁。只是看什么情况使用什么锁,以及锁的粒度问题。本文对Java中常用同步机制进行总结,希望对您 一些帮助。
2023-12-10 22:36:30
960
原创 Java 多线程之 LockSupport (阻塞和唤醒线程)
LockSupport 是Java并发包中的一个工具类,用于线程的阻塞和唤醒。它提供了一种基于线程的许可(permit)的方式来实现线程的阻塞和唤醒,而不需要显式地使用锁。例如某个条件满足后阻塞线程,然后等待某个条件满足后再继续执行、实现线程间的协作等。park(): 阻塞当前线程,使其进入waiting状态,直到被其他线程调用unpark(Thread thread)方法唤醒或被中断。
2023-12-07 17:31:28
1231
原创 Java 多线程之 Exchanger (数据交换/同步辅助类)
Exchanger(交换器)是Java并发包中的一个工具类,用于两个线程之间交换数据。它提供了一个同步点,当两个线程都到达该点时,它们可以交换数据,并且在交换完成后继续执行。Exchanger 的主要用途是在两个线程之间安全地交换数据。实现一种互相等待的机制,直到两个线程都到达同步点后才继续执行。它可以用于解决一些特定的并发问题,例如生产者-消费者问题中的缓冲区交换数据、两个线程之间的数据同步等。
2023-12-07 17:29:35
594
原创 Java 多线程之 Semaphore(信号量/限流/同步辅助类)
Semaphore(信号量)是一种并发控制机制,用于控制对共享资源的访问。它维护了一个计数器,可以限制同时访问某个资源的线程数量。常用于限制同时访问某个资源的线程数量,例如控制数据库连接池的并发访问、控制线程池的并发任务数、生产者-消费者问题、读者-写者问题等。Semaphore 通常用来限流,即限制访问某个资源的线程数。而不是用于斥锁资源的访问,如果要用于斥锁资源的问题,则需把初始计数器设置为1。这时它变成了一个二元信号量,通常被称为互斥锁。只允许一个线程同时访问共享资源。
2023-12-05 16:56:26
1195
原创 Java 多线程之 StampedLock(读写锁/乐观读锁/共享锁/排他锁)
StampedLock是Java 8引入的一种读写锁的实现,它提供了一种乐观的读锁(Optimistic Read Lock)和悲观的读锁(Pessimistic Read Lock),和写锁(Write Lock),以及对读-写冲突的解决方案。StampedLock的设计目标是在读多写少的场景下提供更高的并发性能。与传统的读写锁相比,StampedLock更加灵活和高效。
2023-12-05 16:52:42
1219
3
原创 Java 多线程之 Phaser(多阶段任务/同步辅助类)
Phaser 也是Java并发编程中的一种同步辅助工具,用于线程之间的协调和同步。它提供了比和更灵活和强大的功能,可以用于更复杂的多线程协作场景。Phaser的主要用途是将多个线程分为多个阶段,并在每个阶段进行同步。每个线程可以独立运行,但在特定的阶段需要等待其他线程到达屏障点。Phaser可以动态地适应线程的注册和注销,可以处理可变数量的参与者。多阶段任务:Phaser 可以用于将一个任务分解为多个阶段,每个阶段由多个线程并行执行,等待所有线程完成当前阶段后再进入下一个阶段。
2023-12-01 17:29:57
1075
原创 Java 多线程之 CyclicBarrier(并行任务/数据加载/同步辅助类)
CyclicBarrier(循环屏障)是Java并发编程中的一种同步辅助工具。它允许一组线程相互等待,直到所有线程都到达一个共同的屏障点,然后继续执行后续操作。CyclicBarrier可以用于解决多线程任务的协调和同步问题。CyclicBarrier 的主要作用是使多个线程在某个点上进行同步等待所有线程都到达该点后再一起继续执行。它类似于一组线程从启动开始跑步,跑到3000米时停下等待其他线程,全部跑到3000米后裁判统计分数,然后再同时开始启跑。
2023-12-01 17:24:27
1150
原创 Java 多线程之 CountDownLatch(计数等待/同步辅助类)
CountDownLatch 是Java中提供的一种同步工具类,用于控制多个线程之间的执行顺序和协调。CountDownLatch 通过一个计数器来实现,该计数器初始化为一个正整数,表示需要等待的线程数目。每个线程执行完一定的任务后,会调用方法将计数器减1。当计数器减到0时,表示所有线程已经完成任务,等待在await()方法处的线程被唤醒,继续执行后续操作。控制执行顺序:控制多个线程执行的顺序,让某个线程等待其他线程完成特定任务后再执行。
2023-11-29 16:34:19
1426
原创 Java 多线程之 ReentrantReadWriteLock(读写锁/共享锁/排他锁)
ReentrantReadWriteLock 是Java中提供的一种读写锁实现,它允许多个线程同时读取共享资源,但在写操作时需要独占访问。它是对传统互斥锁的一种改进,可以提高并发性能。读写锁的主要目的是在读多写少的场景下,提供更高的并发性能。当多个线程只需读取共享资源时,可以同时获得读锁,从而实现并发读取。而当有线程需要对共享资源进行写操作时,它必须独占地获取写锁,在此期间,其他线程无法获取读锁或写锁,从而确保数据的一致性和完整性。
2023-11-29 16:32:54
979
原创 Java 多线程之 ReentrantLock(可重入锁/公平锁/非公平锁)
ReentrantLock 是Java中提供的一种可重入锁(Reentrant Lock),用于在多线程环境下实现对共享资源的互斥访问。与 synchronized 关键字相比,ReentrantLock 提供了更灵活、更强大的功能,同时也更复杂。可重入锁是一种同步机制,它允许同一个线程多次获取同一个锁而不会造成死锁。当线程第一次获得锁后,可以多次重复进入临界区,而不会被阻塞。只有当线程释放了所有重复获得的锁,其他线程才能够获取该锁。
2023-11-24 17:38:43
1413
原创 Java 多线程之 CAS(Compare and Set),实现无锁优化,自旋锁/乐观锁
CAS(Compare and Swap)是一种并发编程中的原子操作(synchronized 也使用了 CAS),用于实现多线程环境下的同步和数据共享。CAS提供了一种高效的并发控制机制,可以避免传统锁机制的开销和问题。CAS操作包括三个操作数:内存位置(通常是共享的变量)、旧的预期值和新的值。CAS操作会先比较内存位置上的值与旧的预期值是否相等,如果相等,则将新的值写入该内存位置;如果不相等,则说明其他线程已经修改了该内存位置的值,CAS操作失败,不会进行写入操作。
2023-11-24 17:37:20
1248
2
原创 Java 多线程之 DCL(Double-Checked Locking)
DCL(Double-Checked Locking)是一种用于在多线程环境下实现延迟初始化的技术。它结合了懒加载(Lazy Initialization)和线程安全性,用于在需要时创建单例对象或共享资源。它的目标是在保持高性能的同时,确保只有一个线程执行对象的初始化过程。DCL 的基本思想是在懒加载模式下使用双重检查机制,即在首次访问时检查锁定状态,以避免每次访问都进行同步。该模式通常应用于单例模式或其他需要延迟初始化的情况。DCL 的目标是在保证线程安全的同时,尽可能地减少同步开销,以提高性能。
2023-11-22 17:44:52
203
原创 Java 多线程之 synchronized (互拆锁/排他锁/非观锁)
在Java中,synchronized 关键字用于实现线程之间的同步。提供了一种简单而强大的机制来控制多个线程之间的并发访问,确保共享资源的安全性和一致性。它解决了多线程环境中的竞态条件、数据竞争和内存模型等问题,是实现线程安全的重要手段之一。互斥性(Mutual Exclusion):synchronized 用于实现互斥访问,确保同一时间只有一个线程可以进入被 synchronized 修饰的代码块或方法。当一个线程获取了锁(也称为监视器锁)后,其他线程就无法进入该代码块或方法,直到锁被释放。
2023-11-22 17:43:27
284
原创 Java 多线程之 volatile(可见性/重排序)
在Java中,volatile 关键字用于修饰变量,其作用是确保多个线程之间对该变量的可见性和禁止指令重排序优化。当一个变量被声明为volatile时,线程在读取和写入该变量时会直接操作主内存中的值,而不会使用线程自己的工作内存。这意味着当一个线程修改了一个volatile变量的值时,其他线程将立即看到这个变化,而不会使用缓存中的旧值。
2023-11-21 17:55:49
218
原创 Zookeeper Java 开发,自定义分布式锁示例
情景:假设有10个客户端(分散的10台主机)要执行一个任务,这个任务某些过程需要保持原子性。那么我们就需要一个分布式锁。原理:通过在Zookeeper中创建序列节点来实现获得锁,删除节点来释放锁。其实质是一个按先来后到的排序过程,实现过程如下:客户端发起请求,创建锁序列节点(/lock/xxxxxxxx)获取所有锁节点,判断自己是否为最小节点如果自己是最小序列节点,则立即获得锁。否则不能获得锁,但要监控前一个序列节点的状态。获得锁的客户端开始执行任务。执行完任务后释放锁。
2023-11-16 17:45:49
754
原创 Zookeeper Java SDK 开发入门
ZooKeeper是一个开源的、分布式的协调服务,它主要用于分布式系统中的数据管理和协调任务。它提供了一个具有高可用性的分布式环境,用于存储和管理小规模数据,例如配置信息、命名服务、分布式锁等。本文主要介绍如何使用 Java 与 ZooKeeper 建立连接,进行数据创建、修改、读取、删除等操作。源码地址:https://github.com/apache/zookeeper。
2023-11-15 17:42:26
241
原创 Zookeeper 命令使用和数据说明
ZooKeeper是一个开源的、分布式的协调服务,它主要用于分布式系统中的数据管理和协调任务。它提供了一个具有高可用性的分布式环境,用于存储和管理小规模数据,例如配置信息、命名服务、分布式锁等。ZooKeeper的数据模型基于树形结构,类似于文件系统的目录结构。每个节点(Node)都可以存储一个小的数据块,称为节点数据(Node Data)。每个节点都有一个唯一的路径标识符,称为节点路径(Node Path)。节点路径使用斜杠(/)进行分隔,类似于文件系统的路径。
2023-11-14 17:32:54
1278
1
原创 Redis Java 开发简单示例
Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,它具有多种用途和功能,可以充当缓存、消息队列、数据库、实时分析和数据处理平台等多种角色。Redis 可以用作应用程序的缓存层,帮助减少对后端数据库的频繁访问。通过将经常使用的数据存储在内存中,可以显著提高读取速度,降低数据库负担,从而提高应用程序性能。Redis 可以用于存储用户会话数据,特别是在分布式环境中。这使得用户会话可以跨多个服务器实例进行共享,提高了应用程序的伸缩性和可用性。
2023-11-08 19:43:40
284
原创 Redis 扩展 RedisBloom 插件,解决缓存击穿、穿透
RedisBloom是Redis的一个模块,用于实现布隆过滤器和其他概率数据结构。它的主要作用是帮助你在Redis中实现高效的数据查找和去重操作,特别适用于处理大规模数据集。如果你需要进行高效的成员存在性检查、去重、计数或Top-K查询等任务,RedisBloom可以是一个有用的扩展。布隆过滤器(Bloom Filter):RedisBloom支持布隆过滤器,这是一种用于快速检查一个元素是否存在于一个集合中的数据结构。
2023-11-07 17:48:44
648
原创 Redis 的几种集群对比
Predixy 或 Twemproxy 可能是较为轻量级的选择,配置简单。如果您需要简单的代理和负载均衡,Predixy 或 Twemproxy 可能是较好的选择。而Codis 配置相对复杂。如果需要更完整的功能集,包括数据分片和高可用性,那么 Redis Cluster 或 Codis 可能更适合。
2023-11-06 18:46:09
240
原创 Redis 的另一个集群版之 Codis 集群
Codis 是 Wandoujia Infrastructure Team 开发的一个分布式 Redis 服务,用户可以看成是一个无限内存的 Redis 服务,有动态扩/缩容的能力。对偏存储型的业务更实用,如果你需要 SUBPUB 之类的指令,Codis 是不支持的。时刻记住 Codis 是一个分布式存储的项目.。对于海量的 key,value不太大(
2023-11-03 16:41:46
464
原创 Redis Twemproxy 集群,水平扩展 ,扩容方案
Twemproxy(也称为nutcracker)是一个开源的代理软件,用于提供 Redis 或 Memcached 数据存储的负载均衡和高可用性。它是一种代理层,允许客户端将请求发送到多个 Redis 或 Memcached 后端服务器,并在多个节点之间进行负载均衡。它也是Twitter 公司开发的,并且已经成为 Redis 和 Memcached 社区中常见的工具之一。
2023-11-02 17:23:20
453
原创 Redis Predixy 集群
Predixy 是一个开源的代理软件,通常用于提供 Redis 数据存储的高可用性和负载均衡。它的主要用途是充当 Redis 代理,通过分布式代理和负载均衡来管理和优化 Redis 集群的性能和可用性和安全性。适用于需要大规模部署 Redis 数据存储的应用程序,特别是对于需要负载均衡和高可用性的情况。Predixy 支持多种部署、动态的负载均衡、故障转移、读写分离、请求重试、请求限流、缓存、请求日志等功能。这些功能可以增强 Redis 的性能、安全性和稳定性。
2023-11-01 17:41:38
626
3
原创 Redis Cluster (Redis 集群),使用Redis自带的集群功能搭建无主模式集群
Redis 是一个开源的内存数据库,支持分布式部署。Redis Cluster (Redis 集群)是 Redis 的分布式解决方案,用于提供高可用性和可扩展性。Redis Cluster 通过分片(Sharding)和数据复制(Replication)来实现数据的分布和冗余,以提供高性能和容错能力。集群的原理是数据分治,即将数据分散到多个节点以实现分布式存储和处理。然而,这种数据分散的方式可能在某些情况下导致聚合操作(例如事务)变得更加复杂。使用时需要有一定技巧,如将键(Key)进行分组。
2023-10-31 12:56:12
361
原创 Redis 主从复制和哨兵监控,实现Redis高可用配置
Redis 主从复制是 Redis 提供的一种数据复制机制,用于实现数据冗余和高可用性。在主从复制中,一个 Redis 节点(主节点)负责接收写操作并将数据复制到一个或多个从节点。从节点复制主节点的数据,并且在主节点发生故障时可以接管成为新的主节点,以保持服务的可用性。通过主从复制,Redis 构建了一个具有冗余数据和自动故障切换能力的分布式系统,提高了系统的可用性和容错能力。此外,Redis 主从复制还允许根据业务需求动态添加或移除从节点,以适应负载变化和扩展需求。
2023-10-27 16:05:46
610
2
原创 Redis 持久化配置,RDB和AOF方式配置说明
Redis 持久化是指将 Redis 数据存储到磁盘上,以便在 Redis 服务器重启后能够恢复数据的过程。Redis 提供了两种主要的持久化方式:RDB 持久化(Redis Database)RDB 持久化是将 Redis 数据以快照的形式保存到磁盘上的二进制文件。RDB 文件是 Redis 在某个时间点上的数据快照,包含了所有数据的状态。RDB 持久化适用于需要在特定时间点上备份数据或进行全量恢复的场景。
2023-10-26 18:43:23
541
原创 Redis 命令 和 数据类型 您知道多少
Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,它具有多种用途和功能,可以充当缓存、消息队列、数据库、实时分析和数据处理平台等多种角色。Redis命令十分丰富,包括的命令组有 Generic、Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共15个redis命令组两百多个。
2023-10-25 17:47:00
273
原创 Redis 配置文件(redis.conf)中文注释及说明
Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,它具有多种用途和功能,可以充当缓存、消息队列、数据库、实时分析和数据处理平台等多种角色。本文讲Redis配置文件,主要包括:网络和安全设置、持久化设置、内存优化、客户端设置、日志记录和诊断、主从复制和集群设置、性能调优、安全性配置等。
2023-10-24 22:56:35
404
原创 Redis 安装,CentOS7 中以源码方式安装 Redis
本文介绍Redis中CentOS7中以源码安装的步骤和详细配置过程。Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,它具有多种用途和功能,可以充当缓存、消息队列、数据库、实时分析和数据处理平台等多种角色。
2023-10-18 17:43:36
247
原创 微信公众号开发之给用户推送模板消息
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。例如您关注一个公众号后,有些公众号会不定时的推送一些消息,就是使用的模板消息。
2023-10-17 17:23:35
740
2
原创 微信公众号开发之网页授权,获取微信账号授权基本信息
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。例如您关注一个公众号后,有些在下面的菜单中有一个“我的”,一般点这个我的菜单就需要登录。这个登录可就可以使用微信授权登录。点这里如果您对公众号开发流程不是很了解,或者没有什么基础请先看微信公众号开发基础架构搭建。
2023-10-16 17:19:41
180
原创 微信公众号开发之基础框架搭建(基于SpringBoot)
基于SpringBoot搭建微信公众号开发的基础框架搭建,熟悉微信公从号开发者工具、测试账号及接口和接口调试工具。了解签名验证控制器、会话保持、消息处理和自定义菜单的处理。
2023-10-11 17:43:22
1111
原创 Tomcat 配置基于 Redis 的 Session 共享
Tomcat7 下配置基于 Redis 的 Session 共享,这样方便使用Nginx反射代理实现负载均衡。
2023-10-10 17:15:47
301
原创 在SpringBoot项目中使用Swagger,自动生成API文档
Swagger是一个简单但功能强大的API表达工具,本文介绍如何在Spring Boot中使用他。
2023-10-09 17:16:30
155
Tomcat7 基于 Redis 的 Session 共享完整软件包
2023-10-10
104规约模拟器
2017-11-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人