
Java 核心编程
文章平均质量分 88
夯实基础、砥砺前行
码农架构
专注于系统架构、高可用、高性能、高并发类技术分享
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
微服务架构 | SpringBoot 元数据配置实践
Spring Boot jar 包含元数据文件,提供所有支持的配置属性的详细信息。该文件旨在让 IDE 开发者提供上下文相关的帮助和“代码完成”。总结本篇文章希望对从事相关工作的同学能够有所帮助或者启发。原创 2022-01-14 13:17:41 · 799 阅读 · 0 评论 -
码农架构 | Spring Boot 实现通用 Auth 认证的 4 种方式
文章介绍了 spring-boot 中实现通用 auth 的四种方式,包括 传统 AOP、拦截器、参数解析器和过滤器,并提供了对应的实例代码,最后简单总结了下他们的执行顺序。原创 2022-01-11 15:10:57 · 787 阅读 · 2 评论 -
微服务架构 | 如何让接口权限继续继承下去?
在访问系统某个或者某类接口后进行一系列权限校验,但在后续接口中我们想让访问权限一直授权下去改如何处理呢?总结本篇文章希望对从事相关工作的同学能够有所帮助或者启发。原创 2022-01-05 21:02:06 · 2533 阅读 · 2 评论 -
RandomAccessFile 解决多线程下载及断点续传
在针对文件处理当网络环境不好,出现上传失败的时候,可以对失败的 Part 进行独立的重试,而不需要重新上传其他的 Part;中途暂停之后,可以从上次上传完成的 Part 的位置继续上传。或者要上传到 OSS 的本地文件很大的时候,可以并行上传多个 Part 以加快上传;再或者面对一些文件比较大时,我们需要对大文件进行切割分批上传完后再合并处理。原创 2021-12-29 14:56:05 · 1975 阅读 · 1 评论 -
微服务架构 | 如何利用日志链路追踪程序执行的慢 SQL?
查看 SQL 的执行效率,不难想到使用 explain 分析慢查询,但是前提是你需要非常了解业务背景。否则很难精准定位到。原创 2021-12-22 10:50:33 · 822 阅读 · 3 评论 -
微服务架构 | 如何利用好日志链路追踪做性能分析?
做性能分析听到最多的歪理就是,服务做水平、垂直扩容、分表分库、读写分离、XX中间件、资源静态化等等但是归根到底这些方案都是为了尽可能减少对数据库的访问以及堆栈的释放,提高数据库IO的读写速度和程序的运行效率。原创 2021-12-14 13:57:54 · 2376 阅读 · 3 评论 -
微服务架构 | 服务之间跨域问题怎么解决?
导读:跨域资源共享(cors)可以放宽浏览器的同源策略,可以通过浏览器让不同的网站和不同的服务器之间通信。一、背景当前微服务拆分已经成为趋势,大部分公司都对其软件产品做微服务架构调整。对产品先进行业务、模块拆分,大部分也进行前后端分离的业务调整。服务拆分不能避免的问题那就是:请求跨域问题,针对跨域问题,先前专门做了资料整理 什么是跨域? 请求跨域会影响? 跨域资源共享(cors)到底解决了什么? 针对这些问题可以查看《SpringCloud 中跨域资源共享(..原创 2021-11-15 14:09:33 · 7018 阅读 · 3 评论 -
微服务架构 | Hystrix 熔断降级需要注意哪些点?
导读:Hystrix的资源隔离策略有两种,分别为:线程池和信号量。说到资源隔离,那我们在实战中需要注意哪些点呢?一、背景对于Hystrix熔断器的隔离策略分别为:线程池和信号量,前面一篇已经做了详细说明《微服务架构 | Hystrix的资源隔离策略该如何选择?》具体使用哪种策略,需根据业务场景综合评估。一般情况下,推荐使用线程池隔离。尽但是实战中对于Hystrix熔断器需要还需要注意哪些点呢?二、Hystrix 实战经验分享在线程池隔离策略下,线程池大小及超时时间的设置至关重要..原创 2021-11-04 10:24:27 · 648 阅读 · 1 评论 -
微服务架构 | Hystrix的资源隔离策略该如何选择?
导读:Hystrix中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。一、背景Hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。尽管说Hystrix官方已不再维护,且有Alibaba Sentinel等新框架选择,但从组件成熟度和应用案例等方面看,其实还.原创 2021-10-09 10:49:08 · 1038 阅读 · 1 评论 -
Spring Boot集成Swagger2构建强大的RESTful API文档
导读:Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。本文将介绍RESTful API的重.原创 2021-09-30 13:36:40 · 516 阅读 · 0 评论 -
SpringCloud 跨域资源共享(cors)到底解决了什么?
跨域资源共享(cors)可以放宽浏览器的同源策略,可以通过浏览器让不同的网站和不同的服务器之间通信。同源策略同源策略在浏览器安全中是一种非常重要的概念,大量的客户端脚本支持同源策略,比如JavaScript。同源策略允许运行在页面的脚本可以无限制的访问同一个网站(同源)中其他脚本的任何方法和属性。当不同网站页面(非同源)的脚本试图去互相访问的时候,大多数的方法和属性都是被禁止的。这个机制对于现代web应用是非常重要的,因为他们广泛的依赖http cookie来维护用户权限,服务器端会根.原创 2021-09-20 14:10:18 · 653 阅读 · 0 评论 -
微服务的架构下,如何根据业务抽象出适合自己系统的组件?
导读:基础SpringBoot/SpringCloud微服务的架构下,我们或多或少会根据业务抽象出适合自己系统的组件或SDK,来应对对内、对外的拓展。在SpringBoot/SpringCloud先前介绍了一些,如:@Conditional 来指定指定条件的时候才将某个 bean 加载到应用上下文中。 @FunctionalInterface 函数式接口申明 @JsonTypeInfo 在Java类继承的情况下如何实现父类及子类的JSON序列化与反序列化。等等其他的注解标识,极大简化了...原创 2021-09-01 14:14:35 · 764 阅读 · 2 评论 -
Spring Cloud中如何保证各个微服务之间调用的安全性?
导读:在微服务的架构下,系统会根据业务拆分为多个服务,各自负责单一的职责,在这样的架构下,我们需要确保各api的安全性,也就是说服务不是开放的,而是需要授权才可访问的,避免接口被不合法的请求所访问。但是在在微服务集群中服务之间暴力的接口,或者对于第三方开放的接口如果不做及安全和认证,后果可想而知。阅读下文之前思考几个问题:如何在restTemplate远程调用请求增加添加统一认证? 服务认证如何规范加密和解密? 远程调用统一什么协议比较合适?如下图,三个服务注册到同一个注册中心.原创 2021-08-19 15:53:43 · 7414 阅读 · 22 评论 -
☕️【系统设计】如何设计出优雅且实用的 API 接口
记得最开始的时候在设计接口的时候规范还没有那么多,因为前后端还没分离。不管是前端还是后端都是一个人开发,为了追求"效率"。所谓的接口规范百花齐放,各有各自的一套。后来前后端分离,哪些为了追求"效率"而写的代码,重构起来的代码也是头疼。所以到了现在已经基本固定基本的机构体系,针对业务得不同还可以垂直拓展。如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但一个优秀的后端接口和一个糟糕的后端接口对比起来差异还是蛮大的,其中最重要的关键点就是看是否规范!在设计接口时,有很多因素要考虑原创 2021-08-02 11:14:01 · 1049 阅读 · 1 评论 -
对象在内存中的内存布局是什么样的?
一个Java对象的存储结构。在Hotspot虚拟机中,对象在内存中的存储布局分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)Java 对象实例Hotspt 采用了 OOP-Klass 模型。 它是描述 java 对象实例的模型,可分为两部分:OOP (Ordinary Object Pointer)指的是普通对象指针,它包含 MarkWord 和Klass 指针。MarkWord 用于存储当前对象运行时的一些状态数据;Klass 指针则原创 2021-07-26 13:30:54 · 510 阅读 · 0 评论 -
架构上如何设计领域模型和数据模型?
依稀记得我第一次设计一个系统的时候,画了一堆UML(Unified Modeling Language,统一建模语言)图,面对Class Diagram(其实就是领域模型),纠结了好久,不知道如何落地。因为,如果按照这个类图去落数据库的话,看起来很奇怪,有点繁琐。可是不按照这个类图落库的话,又不知道这个类图画了有什么用。扪心自问,你有多久没有画数据模型和领域模型了?现在回想起来,我当时的纠结源自于我对领域模型和数据模型这两个重要概念的不清楚,先前看过DDD(领域驱动设计),里面一句话我觉得讲的很不错原创 2021-07-16 09:42:13 · 1744 阅读 · 3 评论 -
记一次线上OOM问题分析与解决,涨知识了!
导读:以前写过几篇篇关于线上服务器cpu 100%了,该如何排查问题?一些粉丝私信说能不能结合案例来讲解。大好的周日被钉钉消息疯狂@,然后钉钉电话就开始轰炸,同事开发的一程序爆出内存溢出,压测环境居然被通过了,然后就是大型救火现场。我将线上的dump文件和核心的错误日志整理出来,这是问题的复盘总结分享。查看日志看到这个报错java.lang.OutOfMemoryError我相信很多人都会先拷贝谷歌一下,但是真的没用必要!开发这么久或多或少见过不少这种错误。内存溢出~这里原创 2021-07-07 11:29:54 · 857 阅读 · 0 评论 -
线上服务器cpu 100%了,该如何排查问题?
cpu使用率是如何统计出来的?这里的cpu使用率与linux 命令top-H-p<pid> 的线程%CPU类似,一段采样间隔时间内,当前JVM里各个线程的增量cpu时间与采样间隔时间的比例。工作原理说明:首先第一次采样,获取所有线程的CPU时间(调用的是java.lang.management.ThreadMXBean#getThreadCpuTime()及sun.management.HotspotThreadMBean.getInternalThreadCpuTimes().原创 2021-06-16 16:12:39 · 2019 阅读 · 8 评论 -
阿里巴巴为什么不建议直接使用Async注解?
导读:对于异步方法调用,从Spring3开始提供了@Async注解,该注解可以被标在方法上,以便异步地调用该方法。调用者将在调用时立即返回,方法的实际执行将提交给Spring TaskExecutor的任务中,由指定的线程池中的线程执行。...原创 2021-06-08 16:25:59 · 428 阅读 · 0 评论 -
深入源码,CompletableFuture 简单与链式的区别?
导读:从 JDK 8 开始,在 Concurrent 包中提供了一个强大的异步编程工具 CompletableFuture。在 JDK8 之前,异步编程可以通过线程池和 Future 来实现,但功能还不够强大。CompletableFuture 的出现,使 Java 的异编程能力向前迈进了一大步。在探讨 CompletableFuture 的原理之前,先详细看一下 CompletableFuture 的用法,从这些用法中,可以看到相较之前的 Future 有哪些能力得到了提升。提交给 Complet.原创 2021-05-27 18:23:39 · 1424 阅读 · 8 评论 -
如何快速定位当前数据库消耗CPU最高的SQL语句?
这里用一个简单例子说明下,主要是了解如何定位的思路,具体看官网介绍:参考:https://www.percona.com/blog/2020/04/23/a-simple-approach-to-troubleshooting-high-cpu-in-mysql/主要意思是针对定位CPU的问题,Percona增加了对通过信息的TID列将processlist ID映射到OS线程ID的支持,而MySQL在5.7版本后在PERFORMANCE_SCHEMA.THREADS表加了一个THREAD_OS原创 2021-05-15 15:23:36 · 309 阅读 · 0 评论 -
ThreadLocal的Entry为什么要继承WeakReference?
导读:ThreadLocal的Entry为什么要继承WeakReference?弱引用GC的时候会回收?那么回收了,数据不会丢失吗?首先得看一眼WeakReference的代码,它继承自Reference,这里有个get()方法,代码如下:注意这一句:If this reference object has been cleared, either by the program or by the garbage collector, then this method r..原创 2021-05-14 10:48:22 · 1168 阅读 · 2 评论 -
BigDecimal一定不会丢失精度吗?
导读:我们基本已经形成了常识,需要用到金钱的地方要用BigDecimal而不是其他,而我们也都知道浮点型变量在进行计算的时候会出现丢失精度的问题。那么,你知道其实BigDecimal也会丢失精度吗?而使用BigDecimal的背后又有什么值得去探究的地方吗?今天,告诉你,知其然,也知其所以然。如下一段代码:输出:可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有0.06元,却无法购买..原创 2021-04-13 10:42:25 · 983 阅读 · 1 评论 -
为什么ConcurrentHashMap的读操作不需要加锁?
ConcurrentHashmap在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现 JDK1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点) JDK1.8版本的数据结构变得更加简单,使得操作也更加清原创 2021-03-11 13:34:54 · 532 阅读 · 0 评论 -
深入理解Java虚拟机是怎么实现synchronized的?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。当声明 synchronized 代码块时,编译而成的字节码将包含 monitorenter 和 monitorexit 指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是 synchronized 关键字括号里的引用),作为.原创 2021-02-23 09:55:36 · 277 阅读 · 2 评论 -
聊一聊Java垃圾回收与卡表技术
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享在读博士的时候,我曾经写过一个统计 Java 对象生命周期的动态分析,并且用它来跑了一些基准测试。其中一些程序的结果,恰好验证了许多研究人员的假设,即大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。(pmd 中 Java 对象生命周期的直方图,红色的表示被逃逸分析优化掉的对象)之所以要提到这个假设,是因为它造就了 Java 虚拟机的分代回收思想。简单来说,就.原创 2021-02-21 12:47:23 · 1365 阅读 · 4 评论 -
开发这么多年!垃圾回收你真的了解吗?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享你应该听说过这么一句话:免费的其实是最贵的。Java 虚拟机的自动内存管理,将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。不过既然是自动机制,肯定没法做到像手动回收那般精准高效 [1] ,而且还会带来不少与垃圾回收实现相关的问题。接下来的两篇,我们会深入探索 Java 虚拟机中的垃圾回收器。今天这一篇,我们来回顾一下垃圾回收的基础知识。引用计数法与可达性分析垃圾回收,顾名思义,便是将已.原创 2021-02-18 16:00:13 · 414 阅读 · 3 评论 -
JDK1.8 升级这么久!Stream 流的规约操作有哪些?
前段时间介绍了部分Stream常见接口方法,理解起来并不困难,但Stream的用法不止于此,本节我们将仍然以Stream为例,介绍流的规约操作。规约操作又被称作折叠操作,是通过某个连接动作将所有元素汇总成一个汇总结果的过程。元素求和、求最大值或最小值、求出元素总个数、将所有元素转换成一个列表或集合,都属于规约操作。Stream类库有两个通用的规约操作reduce()和collect(),也有一些为简化书写而设计的专用规约操作,比如sum()、max()、min()、count()等。最.原创 2021-02-05 15:08:58 · 450 阅读 · 1 评论 -
函数式编程 Stream 接口真的有那么好用吗?
你可能没意识到Java对函数式编程的重视程度,看看Java 8加入函数式编程扩充多少功能就清楚了。Java 8之所以费这么大功夫引入函数式编程,原因有二: 代码简洁函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。 多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。 今天主要分享stream,也就是Java函数式编程的主角。对于Java 7来说stream完全是个陌生东西,stream并不是某种数据结原创 2021-02-05 14:57:53 · 305 阅读 · 1 评论 -
Kafka中所谓的分区器,到底是什么?
消息在通过 send() 方法发往 broker 的过程中,有可能需要经过拦截(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用之后才能被真正地发往 broker。拦截器一般不是必需的,而序列化器是必需的。消息经过序列化之后就需要确定它发往的分区,如果消息 ProducerRecord 中指定了 partition 字段,那么就不需要分区器的作用,因为 partition 代表的就是所要发往的分区号。如果消息 ProducerRecord 中没有指原创 2021-01-25 13:43:27 · 1079 阅读 · 1 评论 -
都在用Kafka ! 消息队列序列化怎么处理?
生产者需要用序列化器(Serializer)把对象转换成字节数组才能通过网络发送给Kafka。而在对侧,消费者需要用反序列化器(Deserializer)把从 Kafka 中收到的字节数组转换成相应的对象。先参考下面代码实现一个简单的客户端。为了方便,消息的 key 和 value 都使用了字符串,对应程序中的序列化器也使用了客户端自带的 org.apache.kafka.common.serialization.StringSerializer,除了用于 String 类型的序列化器,还有原创 2021-01-25 13:41:19 · 1218 阅读 · 1 评论 -
如何开发一个完善的 Kafka 生产者客户端?
Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、Storm、Spark、Flink 等都支持与 Kafka 集成。Kafka 之所以受到越来越多的青睐,与它所“扮演”的三大角色是分不开的: 消息原创 2021-01-22 18:28:17 · 1027 阅读 · 2 评论 -
Nginx 最常用的两个功能:负载均衡和缓存
负载均衡和缓存功能是 Nginx 最常用的两个功能,这两个功能都属于高性能的调优手段,也和后端人员的关系比较密切,只有了解并会使用它们才能更好地调试和运行自己的项目。针对Nginx 负载均衡模式先前有整理过:Nginx 的负载均衡模式有哪些?它的实现原理是什么?。本篇主要围绕负载均衡和缓存功能和配置做归纳总结Nginx 健康监测被代理的服务器出现宕机的情况,如果被 Nginx 发现,那么 Nginx 就会将其自动标识为不可用,并且在一段时间内会禁止入站的请求访问到该服务器上。而这个发现服务器宕机原创 2021-01-19 14:45:38 · 412 阅读 · 1 评论 -
没有源码调试!生产环境如何排除和优化 JVM?
生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行,其目录如下图所示:接下来我们来看看这些工具的具体使用。jps(虚拟机进程状况工具)jps(JVM Process Status tool,虚拟机进程状况工具)它的功能和 Linux 中的 ps 命令比较类似,用于列出正在运行的 JV.原创 2021-01-17 11:50:42 · 335 阅读 · 1 评论 -
Nginx 的负载均衡模式有哪些?它的实现原理是什么?
Nginx 是后端工程师和运维工程师,以及前端工程师必须要掌握的必备技能,尤其在分布式系统应用越来越广泛的今天,Nginx 已经占据了 Web 服务器的大壁江山,并且还在不断地增长,比如国内的 BATJ、网易、新浪等公司都可以看到它的身影。Nginx 的负载均衡模式有哪些?它的实现原理是什么?什么是Nginx?Nginx 是一款开源的高性能轻量级 Web 服务器(也叫 HTTP 服务器),它主要提供的功能是:反向代理、负载均衡和HTTP 缓存。它于 2004 年首次公开发布,2011 年成立同名公司原创 2021-01-15 14:32:31 · 679 阅读 · 1 评论 -
数组阻塞队列(ArrayBlockingQueue)源码解读与分析
生产者消费者模式最核心的部分是生产者与消费者之间的特殊容器,而阻塞队列是特殊容器最常见的实现。JDK中定义了阻塞队列接口BlockingQueue,JDK通过该接口为我们提供了很多种阻塞队列的实现,其中包括本节的主角ArrayBlockingQueue,该类位于java.util.concurrent.ArrayBlockingQueue.java。该类需要实现的核心方法如下,下面我们详细分析ArrayBlockingQueue的实现原理。从名字可以看出它的存储结构就是一个数组,即基于数组实现了一个原创 2021-01-15 10:36:06 · 307 阅读 · 2 评论 -
为什么建议没事不要随便用工厂模式创建对象?
一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。在这三种细分的工厂模式中,简单工厂、工厂方法原理比较简单,在实际的项目中也比较常用。而抽象工厂的原理稍微复杂点,在实际的项目中相对也不常用。所以,我们今天讲解的重点是前两种工厂模式。对于抽象工厂,稍微了解一下即可。除此之外,这里重点也不是原理和实现,因为这些都很简单,重点还是搞清楚应用场景:什么时候该用工厂模式?相对于直接 new 来创建对象,用工厂模式来创建究竟有什么好处呢?简单工厂模式 (Simple Factory)原创 2021-01-14 15:01:25 · 615 阅读 · 4 评论 -
如何利用策略模式避免冗长的 if-else/switch 分支判断代码?
策略模式。在实际的项目开发中,这个模式也比较常用。最常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断。不过,它的作用还不止如此。它也可以像模板模式那样,提供框架的扩展点等等。对于策略模式。本篇我们讲解策略模式的原理和实现,以及如何用它来避免分支判断逻辑。后续我会通过一个具体的例子,来详细讲解策略模式的应用场景以及真正的设计意图。话不多说,进入主题策略模式的原理与实现策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。我们知道,工厂模式是解原创 2021-01-14 14:14:28 · 373 阅读 · 3 评论 -
Java并发编程:volatile能否保证数据的同步
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。关于存储介质作为Java开发我们都了解Java内存模型,JMM为了提高执行性能引入了工作内存和主存两个概念。在继续讨论之前必须先搞清四种存储介质:寄存器、高级缓存、RAM和ROM。RAM与ROM大家都比较熟悉了,可以看成是我们经常说的内存与硬盘。寄存器属于处理器里面的一部分,而高级缓存cach原创 2020-12-17 18:08:17 · 493 阅读 · 1 评论 -
Java 并发编程:如何防止在线程阻塞与唤醒时死锁
Java并发编程:多线程如何实现阻塞与唤醒说到suspend与resume组合有死锁倾向,一不小心将导致很多问题,甚至导致整个系统崩溃。接着看另外一种解决方案,我们可以使用以对象为目标的阻塞,即利用Object类的wait()和notify()方法实现线程阻塞。当线程到达监控对象时,通过wait方法会使线程进入到等待队列中。而当其它线程调用notify时则可以使线程重新回到执行队列中,得以继续执行思维不同针对对象的阻塞编程思维需要我们稍微转变下思维,它与面向线程阻塞思维有较大差异。如前面的sus..原创 2020-12-17 00:31:26 · 418 阅读 · 1 评论