
JAVA核心知识
文章平均质量分 91
JAVA核心知识导航,包含Java基础,Redis, MySql, MQ,分布式协议等等, 目标是完成一个尽量包含JAVA知识各个方面的系列博客。通过本系列博客能让有JAVA基础的读者进行一定的复习和扩展,让无JAVA基础的读者对JAVA各个方面有基础的认识。
yue_hu
成长源于积累
展开
-
【JAVA核心知识】分布式事务框架Seata
最新版本: v1.6.1 Dec 22, 2022。原创 2023-12-28 10:50:17 · 1683 阅读 · 0 评论 -
【JAVA核心知识】深度了解MySql的InnoDB引擎
了解了页分裂,页合并也就更好理解的,当删除一行数据时,实际上记录并没有被物理删除,而是仅仅打上一个标记声明可以被其他记录使用,当页中剩余的记录不足MERGE_THRESHOLD(默认为页体积的50%)时,InnoDB会探查这个页前面或者后面的页是否有足够的空间,如果有,就会把这个页的数据迁移过去,完成页合并,这个动作同样相当耗费资源。构建共分为三个阶段。一条数据执行时,如果是读操作,要查找的数据所在的数据页在内存中时,则将结果返回,否则会先将其所在的数据页加载到内存中,然后再返回结果。数据页默认16KB。原创 2023-10-24 16:24:27 · 387 阅读 · 0 评论 -
【Java核心知识】spring boot整合Mybatis plus + Phoenix 访问Hbase与使用注意
为了Phoenix能让开发者通过SQL访问Hbase而不必使用原生的方式?引用Phoenix官网上的一句话:SQL is just a way of expressingnot. 即SQL不是一种数据操作技术,而是一种特殊的表达方式。只是表示你需要什么而不是你如何获得。原创 2023-03-03 09:35:41 · 2872 阅读 · 1 评论 -
【JAVA核心知识】46:什么是零拷贝Zero-copy
零拷贝相较于传统的IO流程拥有更高的数据发送效率,无论是RocketMq,Kafka还是Netty等都用到了零拷贝技术,那究竟什么是零拷贝呢,零拷贝又是通过什么方式提升数据发送效率呢?首先我们要明白,一次数据发送过程就是将磁盘中的目标数据交给网卡传输出去的流程。磁盘以及网卡都属于硬件层。而应用程序是不能直接操作硬件的。如果要操作硬件,需要进行上下文切换从用户态切换到内核态由操作系统来完成硬件交互。关于用户态,内核态,上下文切换这些这里不再赘述。原创 2023-01-30 18:58:34 · 759 阅读 · 0 评论 -
@PostConstruct,InitializingBean,Init-method,BeanPostProcessor 在Spring Bean初始化之后执行指定方法
在Spring及其扩展框架中,可以利用@Resource或者@Autowired来进行自动装配,但是有时需要在实例化完成后执行一些初始化操作,而这些操作依赖于装配的对象。而由于控制反转的原则,又不能直接写在构造方法里面new一个对象。此时就需要其他途径完成初始化的动作。原创 2022-11-27 22:44:23 · 1233 阅读 · 0 评论 -
raft协议原理 ---【JAVA核心知识】
Raft协议是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。目前 etcd,consul都是基于Raft协议进行数据同步。Raft协议和Zookeeper的一样脱胎于Paxos协议。以此可以看出来Paxos协议在分布式协议学术理论届方面的地位。为什么是说是学术理论届呢?这是因为Paxos协议的出了名的难懂,这使得他的应用受到限制。不同于Paxos协议的难以理解。Raft协议的主要特点就是易于理解。原创 2022-10-17 15:52:15 · 1172 阅读 · 0 评论 -
简简单单一段话描述设计模式
设计模式的概念由著名建筑师Alexander提出:每个模式都描述了一个在我们周围不断发生的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次的重用那些已有的解决方案而不必再做重复性的工作。这一概念同样适用于软件开发领域。设计模式并不是一种技术,而是特定场景下解决问题的一种方案。在软件开发领域,设计模式(Design Pattern)是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。使用设计模式是为了可重用代码(重用性),让代码更易理解(可读性),保证代码的可靠性。原创 2022-09-30 17:07:48 · 495 阅读 · 0 评论 -
44:LFU算法集:LFUDA,Window-LFU与Window TinyLFU
LFU(Least Frequently Used)即最少访问算法。通过访问频率作为数据淘汰的依据。核心思想是:如果一个数据在过去的一段时间访问的次数较少,那么未来他被访问的概率也较低。与之相应的还有LRU(Least Recently Used),即最近最少使用算法,通过最后一次访问时间来作为数据淘汰的依据,核心思想是如果一个数据已经有较长的时间没有收到访问,那么未来他被访问的概率也较低。原创 2022-04-19 17:36:47 · 707 阅读 · 0 评论 -
javap命令获取字节码,看看JVM到底是怎么执行你的代码
javap命令前置知识javap的使用JVM指令集小实战javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码。用于分解class文件。- 百度百科通过javap命令,就可以获取到编译器生成的字节码,从而看JVM会如何执行一段代码。前置知识需要注意,了解JVM内存区域是了解这个命令以及看懂字节码的基础。javap的使用javap <options> <classes> :其中options为可选的参数,classes则是需要解析原创 2022-04-07 14:54:36 · 937 阅读 · 0 评论 -
【JAVA核心知识】开发常用的linux命令整理
日常开发中,如果不是直接使用linux作为工作PC,仅仅是连接至系统环境进行一些运维和问题排查工作,用的linux命令并不多,下面只是列了几个常用的,说明了命令的基本作用和简单的使用,具体的使用参数和更多的命令可以查阅Linux命令大全(手册)。pwd:查看当前路径grep ** 管道,文本搜索,全面的正则表达式支持。//查询上下git log |grep “xxxx” -C 5//查询往后 aftergit log |grep “xxxx” -A 5//查询往前 beforegit lo原创 2022-03-22 11:34:51 · 1498 阅读 · 0 评论 -
【JAVA核心知识】top,jstack,jps,jmap排查CPU和OOM问题
top命令查看进程资源信息top命令类似于windows的任务管理器,通过这个可以看到系统中各个进程的资源占用状况,常用于服务端性能分析。语法格式:top [参数], 按q退出命令,一般不需要加参数,直接top就行常用参数:-d:改变显示的更新速度,或是在交谈式指令列( interactive command)按 s-q:没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行-c:切换显示模式-s:安全模式,将交谈式指令取消, 避免潜在的危机原创 2022-03-22 11:29:28 · 4063 阅读 · 0 评论 -
【JAVA核心知识】23-F.1 Redis数据底层存储原理
Redis具有五种数据类型:String,List,Hash,Set,ZSet,底层使用了多种数据结构,同种数据类型在不同的状态也会使用不同的数据结构。RedisObjectRedis中的值都是一个个键值对,其中键总是字符串对象,值则可以是字符串,整数,列表,集合等。Redis的值对象都通过RedisObject来表示。typedef struct redisObject{ //表示类型:string,list,hash,set,zset unsigned type:4;原创 2022-03-14 13:38:14 · 1431 阅读 · 0 评论 -
【JAVA核心知识】39:一文看懂RocketMQ,轻松应对面试
1.RocketMQ的角色划分生产者Producer: 消息的生产者,也称为发布者消费者Consumer:消息的消费者,也称为订阅者Broker:可以简单的理解为就是RocketMQ的应用实例NameServer:RocketMQ的注册中心,RocketMQ需要启动时要先启动NameServer再启动Broker,Broker启动时需要向所有NameServer注册,生产发送消息之前需要从NameServer获取Broker服务列表,然后根据负载均衡算法从列表中选择一台进行消息发送。Broker需原创 2022-01-15 16:17:47 · 1903 阅读 · 0 评论 -
【JAVA核心知识】38:Zookeeper的使用与典型应用场景 ---- 《从Paxos到Zookeeper》读书笔记
数据发布/订阅通过Zookeeper的Watcher通知可以完成数据的发布和订阅,Zookeeper的Watcher通知,具有以下特性:一次性:无论是客户端还是服务端,一旦一个Watcher被触发,Zookeeper都会将其从对应的存储中移除,因此开发人员在Watcher的使用上要记住的一点是需要反复注册,这样的设计有效的减轻了服务端的压力。避免Watcher一直有效而节点更新有非常频繁的情况下,服务端需要不停的对客户端发送通知,对网络和服务端性能的影响都很大。客户端串行执行:客户端Watcher回原创 2022-01-07 17:59:33 · 916 阅读 · 0 评论 -
使用profile进一步分析SQL资源消耗
使用EXPLAN仅仅可以获得SQL的执行策略,如果需要进一步探查SQL的执行情况,则需要使用profile来完成了。要想使用profile,第一件事是先打开profile的采集开关, profile默认关闭,可以通过SQL:set profiling=1;来打开,这个开关是连接的级别的,也就是说如果你重新建立连接,那么需要再次执行此SQL打开采集,然后再执行自己要检测的SQL,执行完毕后使用SQL:show profiles;查看最近15条执行记录,这个条目数可以通过设置profiling_原创 2021-12-29 16:09:36 · 1099 阅读 · 0 评论 -
【JAVA核心知识】36:ZooKeeper的ZAB协议 ---- 《从Paxos到Zookeeper》读书笔记
ZooKeeper并不是Paxos算法的实现,ZooKeeper并没有完全采用Paxos算法,而是专门设计的崩溃可恢复的原子消息广播算法ZAB(ZooKeeper Atomic Broadcast)。ZooKeeper使用了一个单一的主线程来接收并处理客户端的所有事物请求,并采用ZAB协议,将服务器状态变更以事务Proposal的形式广播到所有的副本进程上去。ZAB保证同一时刻一个集群只有一个主线程来广播服务器的状态变更。且ZAB协议保证一个全局的变更序列被顺序应用。ZAB协议保证当主线程出现崩溃或者重启原创 2021-12-14 09:46:12 · 1928 阅读 · 0 评论 -
一次关于InnoDB在UPDATE时对聚簇索引及二级索引加锁情况的试验
先上结论:在REPEATABLE_READ和READ_COMMITTED两个级别下,无论是对二级索引加锁还是对聚簇索引加锁,只有实际发生冲突时InnoDB才会在发生冲突的索引上实际进行加锁,未发生冲突的索引会使用MVCC进行并发控制,而不是直接加锁。在REPEATABLE_READ和READ_COMMITTED两个级别下,通过二级索引进行更新时,会先对二级索引加锁,然后对聚簇索引加锁。在REPEATABLE_READ和READ_COMMITTED两个级别下,使用聚簇索引更新二级索引时,会先对聚簇加锁原创 2021-12-11 21:51:29 · 2205 阅读 · 7 评论 -
【JAVA核心知识】35:一致性协议:2PC,3PC与Paxos ---- 《从Paxos到Zookeeper》读书笔记
分布式的特点分布性:计算机在空间上随意分布,机器的分布情况也会随时变动对等性:分布式系统所有的节点平等,没有中心的概念。并发性:程序运行中并发性操作是常见的行为缺乏全局时钟:分布式系统缺乏全局时钟,因此很难定义两个事件谁先谁后。故障总会发生:人格在设计阶段考虑到的异常情况,一定会在系统运行中发生,并且还会遇到很多在设计时未能考虑到的异常故障。因此,设计时不能放过任何异常情况。挑战通信延时,单机内存访问的延时在纳秒级别(通常是10ns),而正常一次网络通信在0.1-1ms左右。想当于100原创 2021-12-01 11:19:24 · 919 阅读 · 0 评论 -
【JAVA核心知识】34:事务的ACID;分布式的CAP原则与BASE理论 ---- 《从Paxos到Zookeeper》读书笔记
事务的ACID;分布式的CAP原则与BASE理论分布式的特点分布式的挑战事务的特征:ACIDCAP原则BASE理论分布式的特点分布性:计算机在空间上随意分布,机器的分布情况也会随时变动对等性:分布式系统所有的节点平等,没有中心的概念。并发性:程序运行中并发性操作是常见的行为缺乏全局时钟:分布式系统缺乏全局时钟,因此很难定义两个事件谁先谁后。故障总会发生:人格在设计阶段考虑到的异常情况,一定会在系统运行中发生,并且还会遇到很多在设计时未能考虑到的异常故障。因此,设计时不能放过任何异常情况。分原创 2021-11-27 22:26:39 · 349 阅读 · 0 评论 -
【JAVA核心知识】33:MySQL EXPLAIN的使用 ---《高性能MySQL》读书笔记
EXPLAIN用来获取关于SQL的执行计划信息。MySQL 5.6之前能进对SELECT语句进行解释,MySQL 5.6开始能对UPDATE,INSERT,DELETE进行解释。EXPLAIN具有局限性,并不总会说出真相,但已经是可以获取的最好信息。要使用EXPLAIN,只需要在SQL之前增加EXPLAIN这个关键词。他会返回一行或多行信息,显示执行计划中的每一部分和执行次序。一个常见的错误是:增加EXPLAIN时SQL不会实际执行。有时间我们用这个特性来快速获得要求不是那么精确的行数信息。然而这个结论原创 2021-11-18 15:57:06 · 604 阅读 · 0 评论 -
【JAVA核心知识】32:查询性能优化 ---《高性能MySQL》读书笔记
查询性能优化优化数据访问是否向数据库请求了不需要的数据是否在扫描额外的记录重构查询的方式查询的过程通信协议查询缓存查询优化处理查询优化器的限制关联子查询UNION的行数限制并行执行禁止同一个表上的查询和更新优化特定类型的查询(技巧篇!最重要的章节!)优化COUNT()查询优化关联查询优化子查询优化LIMIT及分页使用UNION ALL而不是 UNION优化数据访问是否向数据库请求了不需要的数据查询了不需要的行总是取出所有的列多表关联时返回了全部列重复查询相同的数据是否在扫描额外的记录扫原创 2021-11-16 15:25:33 · 1419 阅读 · 0 评论 -
【JAVA核心知识】31:创建高性能的索引 ---《高性能MySQL》读书笔记
索引索引的类型B-Tree(B+Tree)索引hash索引其他索引索引的优点如何建立高性能的索引索引是存储引擎用于快速找到记录的一种数据结构。通过索引找到对应的数据行。好的索引对良好的性能非常关键,索引优化应该是查询性能优化最有效的手段了。不好的索引会严重影响性能,即使是正提升的索引,‘’最优‘’和‘’好的‘’的索引带来的提升也可能不是一个数量级别。数据量越大,索引越重要。避免使用ORM工具产生索引,索引是一个十分复杂的东西,再复杂的ORM工作,在精妙和复杂的索引面前都是浮云。事实上我个人认为ORM工原创 2021-11-03 15:30:10 · 1428 阅读 · 0 评论 -
【JAVA核心知识】30:MySQL数据类型选择与设计 ---《高性能MySQL》读书笔记
MySQL数据类型优化与设计1 MySQL的基本数据类型1.1 整数(whole number)类型1.2 实数(real number)类型1.3 字符串类型1.3.1 VARCHAR和CAHR类型1.3.2 BLOB和TEXT类型1.3.3 使用枚举(ENUM代替字符串类型)1.4 日期和时间类型1.5 位数据类型2 如何选择与设计1 MySQL的基本数据类型首先了解一下MySQL的基本数据类型,要注意的是MySQL为了兼容性,所以支持很多别名,如INTEGER, BOOL以及NUMERIC,这些别原创 2021-10-21 15:46:30 · 433 阅读 · 0 评论 -
【JAVA核心知识】29:MySQL架构基础篇 ---《高性能MySQL》读书笔记
MySQL逻辑架构图片来源:《高性能MySQL》第一层做一下安全认证,授权处理之类的,大多数C/S工具都会有这样的结构。第二层是大多数MySQL核心功能的所在,包括查询解析,分析,优化,以及所有的内置函数(例如日期,时间,加密函数),所有的跨存储引擎的功能也都在这一层实现(例如存储过程,触发器,视图)第三层是存储引擎层,mysql有不同的存储引擎,服务器通过API和存储引擎通信,这样就屏蔽了不同存储引擎之间的差异。存储因此API包含几十个底层函数,用于执行诸如‘开始一个事务’或者‘根据主键提取一行原创 2021-10-21 15:45:10 · 1744 阅读 · 0 评论 -
Redis的过期删除策略与淘汰策略
过期删除策略与淘汰策略过期策略淘汰策略Redis的异步删除过期策略Redis的所有数据结构都可以设置过期时间,Redis将设置了过期时间的Key放入一个独立的字典里,然后定时遍历这个字典来删除到期的Key。除此定时遍历外还会采用惰性策略来删除Key,当一个Key被访问时,先检查这个key的过期时间吗,如果已经过期,就立即删除。Redis的定时扫描策略每秒会进行10次扫描,但是并不是每一次都扫描字段中的所有Key,而是采用一种简单的贪心策略:从过期字典中随机选择20个key删除这20个key中的过原创 2021-09-29 14:32:01 · 451 阅读 · 0 评论 -
Redis的新数据结构Stream ---- 《Redis深度历险》读书笔记
1 StreamStream是Redis5.0新增的一个数据结构,是一个支持多播的可持久化消息队列。Stream拥有一个消息列表,将所有的消息串起来,每个消息都有一个唯一ID和对应的内容,消息是持久化的,Redis重启后,内容还在。每个Stream都有唯一的名称,就是Redis中的Key,结构在第一使用xadd指令追加消息时自动创建。每个Stream都可以挂多个消费组,每个消费组都有一个游标last_delivered_id用来记录当前消费到的位置,没个消费组都要有一个Stream内的唯一名称,并原创 2021-09-27 15:52:47 · 495 阅读 · 0 评论 -
Redis集群篇 ---- 《Redis深度历险》读书笔记
集群篇哨兵 sentinel脑裂非官方集群化解决方案Codis官方集群化解决方案Cluster跳转迁移哨兵 sentinelsentinel用来进行节点的自动主从切换。当主节点(master节点)发生故障时,sentinel自动选择最优的从节点(salvesj节点)切换为主节点,客户端也无需人工修改新的主节点地址再进行重启,而是问询sentinel,sentinel将最新的主节点地址告知客户端。整个切换过程无需人工干预即可完成,能够在故障发生时快速响应,尽快恢复服务。可以将sentinel集群看成一个原创 2021-09-24 15:10:45 · 406 阅读 · 0 评论 -
Redis原理篇 ---- 《Redis深度历险》读书笔记
原理篇单线程多路复用IO指令队列与响应队列定时任务通信协议RESP(Redis Serialization Protocol)客户端到服务端服务端到客户端持久化快照(RDB)AOF日志AOF重写fsync持久化选在从节点Redis4.0的混合持久化为什么不直接使用Redis做数据库管道事务multi/exec/discardwatch为什么Redis不支持回滚呢PubSub单线程Redis是单线程的!Node.js和Nginx都是线程的。Redis虽然是单线程,但是Redis的运算都是内存级别的,且原创 2021-09-22 16:20:43 · 1002 阅读 · 0 评论 -
Redis应用篇 ---- 《Redis深度历险》读书笔记
实用篇分布式锁延时队列位图HyperLogLog布隆过滤器简单限流漏斗限流(令牌限流)地理位置GeoHash扫描遍历与筛选高位进位加法扫描redis的渐进式扩容大key定位分布式锁从1开始慢慢进阶可以使用setnx来实现分布式锁,如果不存在占住,存在就失败。然后释放锁时del掉。为了避免加锁之后中断导致del没有执行而产生的死锁,可以通过expire给锁设置过期时间但是setnx和expire属于redis的两个指令,实际还是避免不了中断的影响的。因此Redis2.8提供一个指令set name原创 2021-09-13 14:46:24 · 641 阅读 · 0 评论 -
Redis基础篇 ---- 《Redis深度历险》读书笔记
redis的基本数据结构:String(字符串),hash(哈希),list(列表),set(集合),zset(有序集合).String(字符串)redis中的String在内部结构实现上类似于ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,实际容量capacity一般是大于实际字符串长度len。字符串长度小于1M时,采用二倍扩容的方式,每次扩容加倍现有空间,大于1M时,每次括1M的空间,最大长度是512M。如果value是一个整数,那么可以进行自增操作,范围是[-2^31, 2^31原创 2021-09-13 14:43:51 · 331 阅读 · 0 评论 -
【JAVA核心知识】22:从源码看ReentrantLock的Condition
在[22-F.1:Condition的简单使用]中介绍了Condition的简单使用及常用方法,Condition在JDK 1.5引入与ReentrantLock结合使用可以对线程进行主动控制,相较于Object的wait(),notify()方法,Condition具有更全面的功能。原创 2021-08-26 11:49:47 · 1052 阅读 · 0 评论 -
【JAVA核心知识】21:从源码看ReentrantLock
前言RenentrantLock在JDK1.5引入,是一个可以设置公平性的可重入锁。ReentrantLock implements Lock, java.io.Serializable原创 2021-08-26 11:47:12 · 503 阅读 · 0 评论 -
【JAVA核心知识】22-F.1:Condition的简单使用
目录前言Condition的方法介绍示例代码关联导航前言在??????介绍了ReentrantLock的简单使用,可以简单的认为ReentrantLock是功能更加全面的synchronized的API形式。那么ReentrantLock的阻塞(synchronized的wait)和唤醒(synchronized的notify)如何实现呢,此时就需要和ReentrantLock一样在JDK 1.5引入的Condition出马了,相较于Object的wait(),notify()方法.原创 2021-08-26 11:44:35 · 292 阅读 · 0 评论 -
【JAVA核心知识】21-F.1:ReentrantLock的简单使用
目录加锁与解锁示例代码lock(),tryLock()与unlock()的简单使用:lock(),lockInterruptibly(),tryLock(long timeout, TimeUnit unit)对中断的反应:ReentrantLock的其它常用方法示例代码关联导航ReentrantLock是一个API级别的可重入锁。不同于synchronized仅支持非公平模式,ReentrantLock可以在构造时指定这个锁是公平模式还是非公平模式。加锁与解锁Re.原创 2021-08-26 11:42:56 · 489 阅读 · 0 评论 -
【JAVA核心知识】20-F.1:synchronized/wait/notify的简单使用
一:修饰代码块二:修饰方法修饰静态方法修饰非静态方法修饰方法的继承三:wait和notify的使用用synchronized修饰代码块或方法即可完成同步,synchronized的使用方法有以下几种。一:修饰代码块修饰代码块时需要明确指定锁对象,锁住的时所有以该锁对象为锁的代码块public void method1() { synchronized (lockObj) { // action1 }}public void method2() { syn原创 2021-07-20 19:56:05 · 456 阅读 · 1 评论 -
【JAVA核心知识】20:synchronized实现原理与锁膨胀:无锁or偏向锁-轻量级锁-重量级锁,看完就懂
synchronized前言JDK对Synchronize的优化-锁膨胀偏向锁轻量级锁重量级锁重量级锁模式下的SynchronizeSynchronize 的核心组件Synchronized 的流程Synchronized 的实现Synchronized 的作用范围synchronized的简单使用前言Synchronized是通过对象内部的monitor(监视器锁)来实现的。monitor本质上又是依赖于底层操作系统的Mutex Lock来实现的,操作系统实现线程之间的切换依赖于操作系统 Mutex原创 2021-07-19 17:56:59 · 1629 阅读 · 4 评论 -
【JAVA核心知识】19:JAVA中的各种锁
JAVA中的各种锁乐观锁与悲观锁乐观锁悲观锁举个例子独占锁与共享锁独占锁共享锁ReadWriteLock读写锁自旋锁自旋的优点自旋的缺点自适应自旋锁公平锁与非公平锁公平锁非公平锁举个例子为什么非公平锁不是唤醒全部等待线程进行争抢呢?为什么非公平锁比公平锁拥有更高的性能呢可重入锁分段锁无锁&偏向锁&轻量级锁&重量级锁为什么Synchronized重(效率低)?锁膨胀锁的优化途径减少锁的持有时间锁粗化减小锁粒度锁分离锁消除Java提供了丰富的锁,每种锁都有各自的特性,合理的利用锁能显著原创 2021-07-08 15:59:35 · 548 阅读 · 0 评论 -
【JAVA核心知识】18:线程本地变量-ThreadLocal
ThreadLocal是JDK1.2引入的类,用来提供线程内的局部变量。不同于普通变量,线程本地变量原创 2021-06-17 16:58:17 · 926 阅读 · 6 评论 -
【JAVA核心知识】17.2:线程间通信协作-Exchanger
JDK1.5提供了用于两个线程间通信协作的工具类Exchanger。通过Exchanger可以在两个线程之间进行数据交换,且需要两个线程都到达交换节点时才开始进行数据交换,否则先到达交换节点的线程会处于等待状态等待另一个线程执行交换动作。Exchanger定义为Exchanger<V>,V为泛型,为期望交换的数据类型,Exchanger是一个很简单的类:Exchanger():构造方法V exchange(V x):执行交换动作,入参为要发送的数据,返回为接到的交换数据。如果执行时没有其原创 2021-06-15 16:58:54 · 1263 阅读 · 6 评论 -
【JAVA核心知识】17.1:线程间变量共享
变量共享是进行线程间通信的常用手段之一,java的内存模型(JMM)解决了可见性和有序性,我们则可以通过线程锁保证原子性。共享继承Runnable将变量作为成员变量将变量定义为final直接访问有变量:class ShareData { int num = 0; public synchronized void inrc() { num++; } public synchronized void desc() { nu原创 2021-06-15 15:38:52 · 3408 阅读 · 13 评论