- 学习完 AQS,本文我们就来研究第一个 AQS 的实现类:ReentrantLock。 1 基本设计 ReentrantLock 可重入锁,可重入表示同一个线程可以对同一个共享资源重复的加锁或释放锁。 具有与使用 synchronized 方法和语句访问的隐式监视器锁相同的基本行为和语义的可重入互斥锁,但具有扩展功能。 ReentrantLock 由最后成功锁定... 学习完 AQS,本文我们就来研究第一个 AQS 的实现类:ReentrantLock。 1 基本设计 ReentrantLock 可重入锁,可重入表示同一个线程可以对同一个共享资源重复的加锁或释放锁。 具有与使用 synchronized 方法和语句访问的隐式监视器锁相同的基本行为和语义的可重入互斥锁,但具有扩展功能。 ReentrantLock 由最后成功锁定...
- 1 概述 限流算法主要有如下几种: 基于信号量Semaphore 只有数量维度,没有时间维度基于fixed window 带上了时间维度,不过在两个窗口的临界点容易出现超出限流的情况,比如限制每分钟10个请求,在00:59请求了10次,在01:01又请求了10次,而从00:30-01:30这个时间窗口来看,这一分钟请求了20次,没有控制好基于rolling wind... 1 概述 限流算法主要有如下几种: 基于信号量Semaphore 只有数量维度,没有时间维度基于fixed window 带上了时间维度,不过在两个窗口的临界点容易出现超出限流的情况,比如限制每分钟10个请求,在00:59请求了10次,在01:01又请求了10次,而从00:30-01:30这个时间窗口来看,这一分钟请求了20次,没有控制好基于rolling wind...
- 1 现象及问题 在Swing程序中,经常能看到如下这种代码: 为何用invokeLater,而不直接调用呢? 大多数Swing的API非线程安全,不能在任意地方调用,应该只在EDT中调用。 Swing的线程安全靠事件队列和EDT来保证。 EventQueue的派发机制由单独的一个线程 - 事件派发线程(EDT)管理。 Swing将GUI请求放入一个事件队列中... 1 现象及问题 在Swing程序中,经常能看到如下这种代码: 为何用invokeLater,而不直接调用呢? 大多数Swing的API非线程安全,不能在任意地方调用,应该只在EDT中调用。 Swing的线程安全靠事件队列和EDT来保证。 EventQueue的派发机制由单独的一个线程 - 事件派发线程(EDT)管理。 Swing将GUI请求放入一个事件队列中...
- 1 不同环境的排查思路 1.1 Dev 可以随意使用任何熟悉的工具排查。只要问题能重现,排查就不会太难,最多就是把程序调试到各种框架源码,所以这也是为何面试都会问源码,不求都看过,但要有思路知道如何去看能解决问题。 1.2 Test 比开发环境少了debug,不过也可使用jvisualvm或Arthas,附加到远程JVM进程。 还有测试环境是允许造数据来模拟我... 1 不同环境的排查思路 1.1 Dev 可以随意使用任何熟悉的工具排查。只要问题能重现,排查就不会太难,最多就是把程序调试到各种框架源码,所以这也是为何面试都会问源码,不求都看过,但要有思路知道如何去看能解决问题。 1.2 Test 比开发环境少了debug,不过也可使用jvisualvm或Arthas,附加到远程JVM进程。 还有测试环境是允许造数据来模拟我...
- “多线程版本的if”来理解Guarded Suspension模式,不同于单线程中的if,这个“多线程版本的if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。 需要快速放弃的一个最常见的例子是各种编辑器提供的自动保存功能。自动保存功能的实现逻辑一般都是隔一定时间自动执行存盘操作,存盘操作的前提... “多线程版本的if”来理解Guarded Suspension模式,不同于单线程中的if,这个“多线程版本的if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。 需要快速放弃的一个最常见的例子是各种编辑器提供的自动保存功能。自动保存功能的实现逻辑一般都是隔一定时间自动执行存盘操作,存盘操作的前提...
- 容器为什么需要进行文件系统隔离呢? 被其他容器篡改文件,导致安全问题文件的并发写入造成的不一致问题 Linux容器通过Namespace、Cgroups,进程就真的被“装”在了一个与世隔绝的房间里,而这些房间就是PaaS项目赖以生存的应用“沙盒”。墙内的它们是怎样的生活呢? 1 容器里的进程眼中的文件系统 也许你会认为这是一个Mount Namespace的问题... 容器为什么需要进行文件系统隔离呢? 被其他容器篡改文件,导致安全问题文件的并发写入造成的不一致问题 Linux容器通过Namespace、Cgroups,进程就真的被“装”在了一个与世隔绝的房间里,而这些房间就是PaaS项目赖以生存的应用“沙盒”。墙内的它们是怎样的生活呢? 1 容器里的进程眼中的文件系统 也许你会认为这是一个Mount Namespace的问题...
- 在一个多任务的电脑操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的电脑程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。 通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常... 在一个多任务的电脑操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的电脑程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。 通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常...
- 1 基本设计 一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 CountDownLatch 是用给定的 count 初始化的。由于调用了countDown()方法,await 方法阻塞,直到当前计数为零,之后释放所有等待线程,并立即返回任何后续的 await 调用。这是一种一次性现象——计数无法重置。如果需要重置计数的版本,可以考虑使用Cy... 1 基本设计 一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 CountDownLatch 是用给定的 count 初始化的。由于调用了countDown()方法,await 方法阻塞,直到当前计数为零,之后释放所有等待线程,并立即返回任何后续的 await 调用。这是一种一次性现象——计数无法重置。如果需要重置计数的版本,可以考虑使用Cy...
- 配置 spring 线程池 调用方和被调用方的方法不能在同一个 bean 类中。 何时需线程上下文拷贝 比如用户认证和 tracing 调用链相关信息都在请求线程上下文中,但是异步时就会丢失,所以需要一直携带。可实现 spring 的如下接口 TaskDecorator 装饰器的回调接口,该接口将应用于将要执行的任何Runnable 。 请注意,这样的... 配置 spring 线程池 调用方和被调用方的方法不能在同一个 bean 类中。 何时需线程上下文拷贝 比如用户认证和 tracing 调用链相关信息都在请求线程上下文中,但是异步时就会丢失,所以需要一直携带。可实现 spring 的如下接口 TaskDecorator 装饰器的回调接口,该接口将应用于将要执行的任何Runnable 。 请注意,这样的...
- 想通了一件事情 # 前情提要 1.通过了解浏览器线程的一些知识我们知道浏览器进程中GUI线程是与JS引擎线程互斥的。 2.小程序的架构是JsCore执行js逻辑代码+webview页面渲染双线程,两个线程并不互斥。 # 那么问题来了 为什么浏览器中js代码会阻塞页面渲染而小程序环境里面JS却可以和页面渲染同时进行。 *GUI线程被设计成是和JS引擎线程互斥... 想通了一件事情 # 前情提要 1.通过了解浏览器线程的一些知识我们知道浏览器进程中GUI线程是与JS引擎线程互斥的。 2.小程序的架构是JsCore执行js逻辑代码+webview页面渲染双线程,两个线程并不互斥。 # 那么问题来了 为什么浏览器中js代码会阻塞页面渲染而小程序环境里面JS却可以和页面渲染同时进行。 *GUI线程被设计成是和JS引擎线程互斥...
- 面试题 开启一个线程死循环执行任务,一bool类型标识控制循环的退出,默认为true代表执行,一段时间后主线程将这个变量设置为了false。 若该变量未被volatile修饰,子线程还能退出吗? 原理 volatile的问题:可见性问题和禁止指令重排序优化。 可见性问题:本质上是CPU缓存失效,必须从主内存读取数据; 禁止指令重排序优化:x86处理器仅下,只实... 面试题 开启一个线程死循环执行任务,一bool类型标识控制循环的退出,默认为true代表执行,一段时间后主线程将这个变量设置为了false。 若该变量未被volatile修饰,子线程还能退出吗? 原理 volatile的问题:可见性问题和禁止指令重排序优化。 可见性问题:本质上是CPU缓存失效,必须从主内存读取数据; 禁止指令重排序优化:x86处理器仅下,只实...
- 了解读写锁吗? 互联网的并发场景大多是读多写少。所以缓存技术使用普遍。JUC也提供了读写锁-ReadWriteLock。 那你说说什么是读写锁? 读写锁一般遵循以下设计原则: 允许多个线程同时读共享变量只允许一个线程写共享变量如果一个写线程正在执行写操作,此时禁止读线程读共享变量。 知道读写锁与互斥锁的区别吗? 读写锁允许多... 了解读写锁吗? 互联网的并发场景大多是读多写少。所以缓存技术使用普遍。JUC也提供了读写锁-ReadWriteLock。 那你说说什么是读写锁? 读写锁一般遵循以下设计原则: 允许多个线程同时读共享变量只允许一个线程写共享变量如果一个写线程正在执行写操作,此时禁止读线程读共享变量。 知道读写锁与互斥锁的区别吗? 读写锁允许多...
- 我们自己的线程,如果写在main 方法,那就是 main 线程 在创建 NioEventLoopGroup(创建一组NioEventLoop) 的过程中就创建了 selector 这里因为我们当前线程其实是 main 线程,所以为 false 创建 ServerSocketChannel 初始化 server socket channel给 server sock... 我们自己的线程,如果写在main 方法,那就是 main 线程 在创建 NioEventLoopGroup(创建一组NioEventLoop) 的过程中就创建了 selector 这里因为我们当前线程其实是 main 线程,所以为 false 创建 ServerSocketChannel 初始化 server socket channel给 server sock...
- 1 消息积压问题追溯 系统某部分出现性能问题,来不及处理上游发的消息,导致消息积压。 消息积压是正常现象,积压越来越多就需要处理了。 就像一个水库,日常蓄水是正常的,但下游泄洪能力太差,导致水库水位一直不停的上涨,这个就不正常了。 2 积压的开发警示 防范于未然,平时使用MQ时,如何优化代码才能避免消息积压? 若线上已出现积压,如何处理最好? 3 性能优化 ... 1 消息积压问题追溯 系统某部分出现性能问题,来不及处理上游发的消息,导致消息积压。 消息积压是正常现象,积压越来越多就需要处理了。 就像一个水库,日常蓄水是正常的,但下游泄洪能力太差,导致水库水位一直不停的上涨,这个就不正常了。 2 积压的开发警示 防范于未然,平时使用MQ时,如何优化代码才能避免消息积压? 若线上已出现积压,如何处理最好? 3 性能优化 ...
- BIONIOAIOThread-Per-ConnectionReactorProactor 什么是Reactor Reactor是一种开发模式,模式的核心流程: 注册感兴趣的事件->扫描是否有感兴趣的事件发生->事件发生后做出相应的处理。 client/ServerSocketChannel/ServerSocketChannelOP_ACCEPTOP_... BIONIOAIOThread-Per-ConnectionReactorProactor 什么是Reactor Reactor是一种开发模式,模式的核心流程: 注册感兴趣的事件->扫描是否有感兴趣的事件发生->事件发生后做出相应的处理。 client/ServerSocketChannel/ServerSocketChannelOP_ACCEPTOP_...
上滑加载中
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签