随笔分类 - [后端技术栈] 并发编程
摘要:常见的线程池饱和策略及使用场景 当线程池的任务队列已满且线程数达到最大值时,新的任务会触发饱和策略(拒绝策略)。Java 提供了四种默认策略: AbortPolicy(默认策略) 行为:直接抛出 RejectedExecutionException 异常。 适用场景: 需要严格保证任务不丢失的场景(
阅读全文
摘要:1. 引言 在多线程编程中,共享变量的可见性和同步问题一直是开发者面临的挑战。Java 提供了 volatile 关键字来确保变量的可见性和有序性,但它并不保证原子性。本文将深入探讨 volatile 的工作原理,包括: 高速缓存(CPU Cache)和主内存(Main Memory)的同步时机 内
阅读全文
摘要:Spring Boot 中使用线程池的示例 在 Spring Boot 应用中,线程池常用于处理异步任务、提高并发性能或执行耗时操作而不阻塞主线程。下面是一个完整的示例: 1. 配置线程池 首先,在配置类中定义线程池: import org.springframework.context.annot
阅读全文
摘要:Java多线程与并发编程全解析 多线程编程是Java中最具挑战性的部分之一,它能够显著提升应用程序的性能和响应能力。本文将全面解析Java多线程与并发编程的核心概念、线程安全机制以及JUC工具类的使用,并提供完整的代码示例。 1. 线程的基本操作与生命周期 Java线程的生命周期包括新建(New)、
阅读全文
摘要:深入解析AQS:设计模式、ReentrantLock实现与自定义锁开发 一、模板方法模式:AQS的架构基石 1.1 模式核心思想 模板方法模式通过固定算法骨架+可变实现细节的设计,实现了代码复用与扩展性的平衡。AQS采用这种模式,将同步器的核心流程(如线程排队、阻塞唤醒)固化在父类,仅将资源获取/释
阅读全文
摘要:Mutex(互斥锁) Mutex是一个不可重入的互斥锁实现。锁资源(AQS里的state)只有两种状态:0表示未锁定,1表示锁定。下边是Mutex的核心源码: class Mutex implements Lock, java.io.Serializable { // 自定义同步器 private
阅读全文
摘要:一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建
阅读全文
摘要:前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了。而要想用好多线程,其实是可以取一些巧的,比如JUC(好多面试官喜欢问的JUC,就是现在要讲的JUC)。JUC就是java.util.concurrent的
阅读全文
摘要:为了提高CPU的利用率,工程师们创造了多线程。但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们又接着创造了线程池ThreadPool。就这样就可以了吗?——不,工程师们并不满足于此,他们不把自己创造出来的线程给扒个底朝天决不罢手。 有了线程关键字解决线程安
阅读全文
摘要:除了可以通过ThreadPoolExecutor自定义线程池外,同Stream API中的Collectors一样,多线程里的Executors类也提供了一组相关的线程池工具,可以直接拿来用,不用考虑用什么队列合适的问题。 Javac除了传统的四大线程池工具: 1、newFixedThreadPoo
阅读全文
摘要:线程池是个神器,用得好会非常地方便。本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用。但是(凡事总有个但是),还是觉得讲一讲可能跟有助于理解后面的常用线程池,所以该打脸还是打吧 因为直接结合代码看会更清楚一些,所以我把带注释的代码贴出
阅读全文
摘要:开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油。 而一个Java线程完整的生命周期就包括: 1、T1:创建(启动) 2、T2:运行(行驶) 3、T3:销毁(停车) 而T
阅读全文
摘要:Java中和线程相关的关键字就两:volatile和synchronized。 volatile以前用得较少,以后会用得更少(后面解释)。它是一种非常轻量级的同步机制,它的三大特性是: 1、保证可见性,即强制将CPU高速缓存的数据立即写入主存,会导致其他CPU核中对应的高速缓存内容无效,就像这样:
阅读全文
摘要:如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫地说:多线程。 Java多线程说它难,也不难,就是有点绕;说它简单,也不简单,需要理解的概念很多,尤其是很多底层知识,如数据结构、操作系统的部分。 Java多线程掌握得好,不仅仅只是对Java,对任何
阅读全文
摘要:一、gevent #__author__:Kelvin #date:2020/5/13 13:34 from gevent import monkey monkey.patch_all() import time import gevent def func(): print("start") #
阅读全文
摘要:一、递归锁 # Lock :互斥锁 效率高 # RLock :递归(recursion)锁 效率相对低 在同一个线程中可以被acquire多次,如果想要释放锁,acquire多少次就要release多少次 from threading import RLock def func(i,rlock):
阅读全文
摘要:一、多个线程对同一个数据进行修改 from threading import Thread,Lock n = 0 def add(lock): for i in range(500000): global n with lock: n += 1 def sub(lock): for i in ran
阅读全文
摘要:import time from threading import Thread def son(): while True: print('in son') time.sleep(1) def son2(): for i in range(3): print('in son2 ****') tim
阅读全文
摘要:一、同步代码块 package com.synchronized1; // 买票示例 // 使用同步代码块解决线程安全问题 public class TicketRunnableImp implements Runnable { private int ticket = 100; Object o=
阅读全文
摘要:一、创建自定义线程类继承Thread 自定义线程类代码 package com.demo05; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 20; i++) { Sy
阅读全文

浙公网安备 33010602011771号