Atomic原子操作实现线程安全

Java的java.util.concurrent包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。 我们以AtomicInteger为例,它提供的主要操作有: 增加值并返回新值:int addAndGet(int delta) 加1后返回新值:int incrementAndGet() 获取当前值:int get() 用
Atomic原子操作实现线程安全

Java线程池详解

Java语言虽然内置了多线程支持,启动一个新线程非常方便,但是,创建线程需要操作系统资源(线程资源,栈空间等),频繁创建和销毁大量线程需要消耗大量时间。 如果可以复用一组线程: ┌─────┐ execute ┌──────────────────┐ │Task1│─────────▶│ThreadPool │ ├─────┤ │┌───────┐┌───────┐│ │Task2│ ││Thre
Java线程池详解

使用Future获取异步执行结果

在执行多个任务的时候,使用Java标准库提供的线程池是非常方便的。我们提交的任务只需要实现Runnable接口,就可以让线程池去执行: class Task implements Runnable { public String result; public void run() { this.result = longTimeCalculation(); } } Runnable接口有个问题,它
使用Future获取异步执行结果

CompletableFuture异步处理多线程结果详解

使用Future获得异步执行结果时,要么调用阻塞方法get(),要么轮询看isDone()是否为true,这两种方法都不是很好,因为主线程也会被迫等待。 从Java 8开始引入了CompletableFuture,它针对Future做了改进,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法。 我们以获取股票价格为例,看看如何使用CompletableFuture: //
CompletableFuture异步处理多线程结果详解

ForkJoin任务分治详解

Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一个线程内完成: ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴
ForkJoin任务分治详解

ThreadLocal实现在线程内传递状态

多线程是Java实现多任务的基础,Thread对象代表一个线程,我们可以在代码中调用Thread.currentThread()获取当前线程。例如,打印日志时,可以同时打印出当前线程的名字: // Thread public class Main { public static void main(String args) throws Exception { log("start main.
ThreadLocal实现在线程内传递状态

虚拟线程详解

虚拟线程(Virtual Thread)是Java 19引入的一种轻量级线程,它在很多其他语言中被称为协程、纤程、绿色线程、用户态线程等。 在理解虚拟线程前,我们先回顾一下线程的特点: 线程是由操作系统创建并调度的资源; 线程切换会耗费大量CPU时间; 一个系统能同时调度的线程数量是有限的,通常在几百至几千级别。 因此,我们说线程是一种重量级资源。在服务器端,对用户请求,通常都实现为一个线程处理一
虚拟线程详解

JDBC简介

Java语言不仅仅是可以用来做一些加、减、乘、除的基本运算,也不仅仅是用IO对文件做一些读写操作,它还有一个非常重要的功能,那就是用来访问数据库(Database)。那么它是用什么来访问数据库的呢,答案是:JDBC。 JDBC 什么是JDBC?JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口,意思就是JDBC是Java语言本身就有的,不是第
JDBC简介