Walter Sun
我小时候的理想是做一名科学家,用梦想改变世界。资深匠心码农 阿里扫地僧 Java天花板 IT极客 篮球梦 绘画乐器
展开
-
Go有协程,Java有虚拟线程,聊一聊Java Virtual Threads
通过修改同步块 synchronized 来避免频繁和长时间的锁定,并使用 java.util.concurrent.locks.ReentrantLock来保护潜在长时间的I/O操作,该锁以类似于同步代码中的隐式锁的方式控制多个线程对共享资源的访问。在该示例中,我们创建了一个 Semaphore 对象,并在一个线程中使用 acquire() 方法获取许可证,模拟对共享资源的访问。仔细考虑ThreadLocal的使用,因为您的应用程序中可能有很多虚拟线程,它们共用平台线程(即原来的线程)的内存空间。原创 2023-07-19 13:25:43 · 543 阅读 · 0 评论 -
聊一聊Java抽象同步队列AQS
AQS是锁的底层支持。原创 2023-07-16 00:14:47 · 269 阅读 · 0 评论 -
知识体系搭建,架构师成长之路
swh的知识体系设计技术 类设计 面向对象设计模式 7大设计原则 23中设计模式 数据库设计 分库原则 分表原则 垂直拆分 水平拆分 领域驱动设计(软件复杂性) 微服务架构开发语言 java java语法 java高级编程 java线程安全 java、多线程编程 java并发编程 nio/aio socket编程 java8新特性 面向对象设计模式 java常用类库 java调试体系 深入理解JVM Apac.原创 2020-07-03 15:03:06 · 277 阅读 · 2 评论 -
Java多线程调优上
初识上下文切换我们首先得明白,上下文切换到底是什么。其实在单个处理器的时期,操作系统就能处理多线程并发任务。处理器给每个线程分配 CPU 时间片(Time Slice),线程在分配获得的时间片内执行任务。CPU 时间片是 CPU 分配给每个线程执行的时间段,一般为几十毫秒。在这么短的时间内线程互相切换,我们根本感觉不到,所以看上去就好像是同时进行的一样。时间片决定了一个线程可以连续占用处理器运行的时长。当一个线程的时间片用完了,或者因自身原因被迫暂停运行了,这个时候,另外一个线程(可以是同一个线程或原创 2020-06-10 11:40:02 · 174 阅读 · 0 评论 -
Java多线程编程核心技术之同步锁(2)
深入了解Lock同步锁的优化方法在 JDK1.5 之后,Java 还提供了 Lock 同步锁。那么它有什么优势呢?相对于需要 JVM 隐式获取和释放锁的 Synchronized 同步锁,Lock 同步锁(以下简称 Lock 锁)需要的是显示获取和释放锁,这就为获取和释放锁提供了更多的灵活性。Lock 锁的基本操作是通过乐观锁来实现的,但由于 Lock 锁也会在阻塞时被挂起,因此它依然属于悲观锁。我们可以通过一张图来简单对比下两个同步锁,了解下各自的特点:从性能方面上来说,在并发量不高、竞争不激烈的情原创 2020-05-21 10:54:53 · 137 阅读 · 0 评论 -
Java多线程编程核心技术之同步锁(1)
深入了解Synchronized同步锁的优化方法在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。在 JDK1.5 之前,Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁,锁的获取和释放是由 JVM 隐式实现。到了 JDK1.5 版本,并发包中新增了 Lock 接口来实现锁功能,它提供了与 Synchronized 关键字类似的同步功能,只是在使用时需要显示获取和释放锁。Lock 同步锁是基于原创 2020-05-19 13:51:51 · 180 阅读 · 0 评论 -
Java多线程编程核心技术之方法join的使用
使用场景 在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,这时,如果主线程向等待子线程执行完成后再结束,就需要用到join()方法了。 join()的作用是等待线程对象销毁。 方法join具有使线程排队运行的作用,有些类似同步的运行效果。join与synchronize...原创 2019-01-04 22:08:13 · 256 阅读 · 1 评论 -
Java多线程编程核心技术之volatile关键字
volatile与死循环 在64bit的JVM上以“-server”服务器模式运行java线程类代码时,为了保证在该模式下保障线程运行的效率,线程会一直在私有堆栈中取值,而volatile关键字的作用是强制从公共堆栈中取得变量值,这样就能有效的解决死循环状态。 使用volatile关键字增加了实例变量在多个线程之间的可见性。但volatile关键...原创 2019-01-03 22:05:14 · 180 阅读 · 0 评论 -
Java多线程编程核心技术之原子类atomic
使用原子类进行i++操作 除了在i++操作时使用synchronized关键字实现同步外,还可以使用AtomicInteger原子类进行实现。 原子操作是不能分割的整体,没有其他线程能够中断或检查正在原子操作中的变量。一个原子类型(atomic)就是一个原子操作可用的类型,它可以在没有锁的情况下做到线程安全。文件AddCountThread.java代...原创 2019-01-04 21:24:33 · 159 阅读 · 0 评论 -
不推荐使用Executors创建线程池,推荐通过ThreadPoolExecutor方式创建
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors各个方法的弊端:1)newFixedThreadPool和newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。2)newCachedThre...原创 2018-12-24 17:35:01 · 1005 阅读 · 0 评论 -
jstack线程分析
先附上jstack命令1. 通过linux的top命令,显示当前活跃线程数,为CPU使用率降序排列2. 使用jstack pid(示例:jstack 10420)命令查看java进程的堆栈状态3. 通过thread dump分析线程状态例如:jstack -F 10420大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁...原创 2019-03-21 01:04:48 · 527 阅读 · 0 评论 -
BIO、NIO和AIO的区别(简介)
BIO 同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。NIO 同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。AIO(NIO.2) 异...原创 2019-03-14 15:44:46 · 124 阅读 · 0 评论